news 2026/8/9 16:40:53

Netcode for GameObjects Boss Room 多人RPG战斗(19)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Netcode for GameObjects Boss Room 多人RPG战斗(19)

ActionPlayers

ActionPlayers是Boss Room项目中负责管理和执行动作(Action)的核心组件,分为客户端和服务器端两个版本,分别处理动作的视觉表现和逻辑执行。

1. 系统架构

1.1 核心组件

组件职责位置
ClientActionPlayer客户端动作可视化与生命周期管理Assets/Scripts/Gameplay/Action/ActionPlayers/ClientActionPlayer.cs
ServerActionPlayer服务器端动作逻辑执行与队列管理Assets/Scripts/Gameplay/Action/ActionPlayers/ServerActionPlayer.cs

1.2 关键依赖

  • ActionFactory:负责Action对象的创建和回收,实现对象池机制
  • Action:所有具体动作的基类,定义了动作的基本接口和行为
  • ClientCharacter/ServerCharacter:动作的执行主体,提供角色状态和能力

2. ClientActionPlayer

2.1 核心功能

2.1.1 动作生命周期管理
  • OnUpdate():每帧更新所有正在播放的动作,处理动作的结束、超时和取消
  • PlayAction():播放服务器确认的动作,处理与预期动作的衔接
  • CancelAllActions():取消所有正在播放的动作
2.1.2 动作预期机制
  • AnticipateAction():在客户端预期执行动作,减少网络延迟的感知
  • 预期超时保护:预期动作如果超过1秒未得到服务器确认,将被取消
  • 动作衔接:当服务器确认的动作到达时,与预期动作无缝衔接
publicvoidAnticipateAction(refActionRequestDatadata){if(!ClientCharacter.IsAnimating()&&Action.ShouldClientAnticipate(ClientCharacter,refdata)){varactionFX=ActionFactory.CreateActionFromData(refdata);actionFX.AnticipateActionClient(ClientCharacter);m_PlayingActions.Add(actionFX);}}

2.2 工作流程

  1. 客户端检测到输入,立即调用AnticipateAction()创建预期动作
  2. 同时将动作请求发送到服务器
  3. 每帧更新预期动作,直到超时或收到服务器确认
  4. 收到服务器确认后,调用PlayAction()处理实际动作
  5. 如果预期动作与实际动作匹配,直接转换;否则创建新动作

3. ServerActionPlayer

3.1 核心功能

3.1.1 动作队列管理
  • PlayAction():将新动作添加到队列或中断现有动作
  • 队列深度控制:限制队列最大执行时间,防止动作堆积
  • 动作优先级:支持高优先级动作中断低优先级动作
3.1.2 自动辅助动作合成
  • SynthesizeChaseIfNecessary():自动生成追逐动作,确保角色移动到攻击范围内
  • SynthesizeTargetIfNecessary():自动生成目标选择动作,更新角色的当前目标
privateintSynthesizeChaseIfNecessary(intbaseIndex){ActionbaseAction=m_Queue[baseIndex];if(baseAction.Data.ShouldClose&&baseAction.Data.TargetIds!=null){ActionRequestDatadata=newActionRequestData{ActionID=GameDataSource.Instance.GeneralChaseActionPrototype.ActionID,TargetIds=baseAction.Data.TargetIds,Amount=baseAction.Config.Range};baseAction.Data.ShouldClose=false;ActionchaseAction=ActionFactory.CreateActionFromData(refdata);m_Queue.Insert(baseIndex,chaseAction);returnbaseIndex+1;}returnbaseIndex;}
3.1.3 动作执行与状态管理
  • StartAction():开始执行队列中的第一个动作
  • OnUpdate():更新所有动作的状态,处理动作的转换和结束
  • UpdateAction():检查动作是否应该继续执行或结束
  • AdvanceQueue():推进动作队列,处理动作的结束和下一动作的开始
3.1.4 冷却时间与重用逻辑
  • IsReuseTimeElapsed():检查动作是否已经过冷却时间
  • m_LastUsedTimestamps:记录每个动作的最后使用时间

3.2 工作流程

  1. 服务器接收客户端的动作请求
  2. 检查动作是否可以执行(冷却时间、资源等)
  3. 将动作添加到队列或中断现有动作
  4. 自动合成必要的辅助动作(如追逐、目标选择)
  5. 开始执行队列中的第一个动作
  6. 每帧更新动作状态,处理动作的结束和转换
  7. 当动作完成或超时,推进队列执行下一个动作

4. 关键设计模式与优化

4.1 对象池模式

  • ActionFactory:使用对象池管理Action对象的创建和回收
  • 性能优化:减少频繁创建和销毁对象带来的性能开销

4.2 状态机模式

  • Action状态管理:每个Action都有自己的状态转换逻辑
  • 动作队列:ServerActionPlayer使用队列实现动作的顺序执行和状态转换

4.3 网络延迟优化

  • 客户端预期:在客户端提前执行动作,减少网络延迟的感知
  • 无缝衔接:预期动作与服务器确认动作的无缝转换
  • 超时保护:防止预期动作无限期存在

5. 协同工作流程

客户端输入 → ClientInputSender.RequestAction() → ClientActionPlayer.AnticipateAction() → 发送动作请求到服务器 → ServerActionPlayer.PlayAction() → 动作执行 → 服务器广播动作结果 → ClientActionPlayer.PlayAction() → 替换预期动作

6. 代码优化建议

6.1 ClientActionPlayer优化

  1. 预期动作管理增强

    // 优化前booltimedOut=action.AnticipatedClient&&action.TimeRunning>=k_AnticipationTimeoutSeconds;// 优化后booltimedOut=action.AnticipatedClient&&action.TimeRunning>=k_AnticipationTimeoutSeconds;if(timedOut){// 记录预期超时,用于网络质量分析Debug.LogWarning($"Action{action.ActionID}anticipation timed out");}
  2. 动作优先级支持

    // 新增方法:按优先级播放动作publicvoidPlayActionWithPriority(refActionRequestDatadata,intpriority){// 根据优先级决定是否中断现有动作// ...}

6.2 ServerActionPlayer优化

  1. 队列深度动态调整

    // 优化前privateconstfloatk_MaxQueueTimeDepth=1.6f;// 优化后privatefloatm_MaxQueueTimeDepth=1.6f;// 根据网络延迟动态调整队列深度publicvoidAdjustQueueDepthBasedOnLatency(floatlatency){m_MaxQueueTimeDepth=Mathf.Clamp(1.0f+latency*0.5f,1.0f,3.0f);}
  2. 动作执行统计

    // 新增字段:动作执行统计privateDictionary<ActionID,int>m_ActionExecutionCount=newDictionary<ActionID,int>();// 在StartAction()中记录m_ActionExecutionCount.TryGetValue(m_Queue[0].ActionID,outintcount);m_ActionExecutionCount[m_Queue[0].ActionID]=count+1;

7. 总结

ActionPlayers系统是Boss Room项目中动作管理的核心组件,通过客户端预期和服务器权威执行的结合,实现了低延迟的动作响应和一致的游戏状态。ClientActionPlayer专注于提供流畅的视觉反馈,而ServerActionPlayer负责确保游戏逻辑的正确性和一致性。

该系统的关键设计亮点包括:

  • 客户端预期机制减少网络延迟感知
  • 自动辅助动作合成简化玩家操作
  • 对象池模式提高性能
  • 灵活的动作队列管理支持复杂的游戏机制

通过这些设计,ActionPlayers系统为Boss Room项目提供了一个强大、灵活且高效的动作执行框架。

ClientActionPlayer.cs

1. 类概述

ClientActionPlayer是Boss Room项目中负责客户端动作可视化与生命周期管理的核心组件,与ServerActionPlayer对应,专注于提供流畅的视觉反馈和减少网络延迟感知。

publicsealedclassClientActionPlayer{privateList<Action>m_PlayingActions=newList<Action>();privateconstfloatk_AnticipationTimeoutSeconds=1;publicClientCharacterClientCharacter{get;privateset;}// ...}

2. 核心功能与设计

2.1 动作生命周期管理

OnUpdate()- 核心更新方法,每帧处理所有正在播放的动作:

publicvoidOnUpdate(){// 逆向遍历以便安全地在循环中移除元素for(inti=m_PlayingActions.Count-1;i>=0;--i)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/9 16:26:00

21、邮件配置中的重写规则与特殊 m4 配置详解

邮件配置中的重写规则与特殊 m4 配置详解 1. 重写规则理解 重写规则在邮件处理中起着核心作用,它主要用于匹配输入地址并根据特定模式进行重写。下面通过几个测试来详细说明其工作原理。 1.1 模板键值测试 模板使用 @ 加上 $2 的值作为键。例如,当键为 @imaginary.c…

作者头像 李华
网站建设 2026/8/9 2:51:14

多线程相关面试题-线程安全相关问题-锁相关问题

问题 1&#xff1a;什么是进程&#xff1f;什么是线程&#xff1f;二者的核心区别是什么&#xff1f; 问题 2&#xff1a;Java 中创建线程的三种方式是什么&#xff1f;分别举例说明。问题 3&#xff1a;start () 方法和 run () 方法的区别是什么&#xff1f;问题 4&#xff1a…

作者头像 李华
网站建设 2026/8/9 13:15:56

在亚马逊云上解决RDS、MariaDB 与 Aurora MySQL复制延迟实战指南

在高吞吐量的数据库系统中&#xff0c;复制延迟&#xff08;Replica Lag&#xff09;一直是个棘手的难题。在 MySQL 生态圈内&#xff0c;传统的异步复制架构由于其单线程应用事务的性能瓶颈&#xff0c;严重限制了从库&#xff08;Replica&#xff09;的处理能力 (1)。特别是在…

作者头像 李华
网站建设 2026/8/9 8:18:05

Java八股文合集来了,彻底解决一线大厂面试难题

纵观今年的技术招聘市场&#xff0c; Java 依旧是当仁不让的霸主 &#xff01;即便遭受 Go 等新兴语言不断冲击&#xff0c;依旧岿然不动。究其原因&#xff1a; Java 有着极其成熟的生态&#xff0c;这个不用我多说&#xff1b;Java 在 运维、可观测性、可监 控性方面都有着非…

作者头像 李华
网站建设 2026/8/8 1:50:21

5个实用技巧:轻松在Vim中查看文件属性

5个实用技巧&#xff1a;轻松在Vim中查看文件属性 【免费下载链接】vim-galore :mortar_board: All things Vim! 项目地址: https://gitcode.com/gh_mirrors/vi/vim-galore 作为一名Vim用户&#xff0c;你是否曾经需要快速了解文件的修改时间、大小或权限信息&#xff1f…

作者头像 李华
网站建设 2026/8/9 18:31:12

Unity网络请求终极指南:RestClient快速上手与实战技巧

在Unity开发中&#xff0c;处理网络请求是每个开发者都会遇到的挑战。传统的UnityWebRequest虽然功能强大&#xff0c;但代码结构往往复杂冗长。RestClient for Unity应运而生&#xff0c;这款基于Promise的REST和HTTP客户端彻底改变了Unity异步编程的游戏规则&#xff0c;让HT…

作者头像 李华