OpenShell 命令行框架实战:从命令定义到工作流编排
2026/10/5 4:07:03
ActionPlayers是Boss Room项目中负责管理和执行动作(Action)的核心组件,分为客户端和服务器端两个版本,分别处理动作的视觉表现和逻辑执行。
| 组件 | 职责 | 位置 |
|---|---|---|
ClientActionPlayer | 客户端动作可视化与生命周期管理 | Assets/Scripts/Gameplay/Action/ActionPlayers/ClientActionPlayer.cs |
ServerActionPlayer | 服务器端动作逻辑执行与队列管理 | Assets/Scripts/Gameplay/Action/ActionPlayers/ServerActionPlayer.cs |
publicvoidAnticipateAction(refActionRequestDatadata){if(!ClientCharacter.IsAnimating()&&Action.ShouldClientAnticipate(ClientCharacter,refdata)){varactionFX=ActionFactory.CreateActionFromData(refdata);actionFX.AnticipateActionClient(ClientCharacter);m_PlayingActions.Add(actionFX);}}AnticipateAction()创建预期动作PlayAction()处理实际动作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;}客户端输入 → ClientInputSender.RequestAction() → ClientActionPlayer.AnticipateAction() → 发送动作请求到服务器 → ServerActionPlayer.PlayAction() → 动作执行 → 服务器广播动作结果 → ClientActionPlayer.PlayAction() → 替换预期动作预期动作管理增强
// 优化前booltimedOut=action.AnticipatedClient&&action.TimeRunning>=k_AnticipationTimeoutSeconds;// 优化后booltimedOut=action.AnticipatedClient&&action.TimeRunning>=k_AnticipationTimeoutSeconds;if(timedOut){// 记录预期超时,用于网络质量分析Debug.LogWarning($"Action{action.ActionID}anticipation timed out");}动作优先级支持
// 新增方法:按优先级播放动作publicvoidPlayActionWithPriority(refActionRequestDatadata,intpriority){// 根据优先级决定是否中断现有动作// ...}队列深度动态调整
// 优化前privateconstfloatk_MaxQueueTimeDepth=1.6f;// 优化后privatefloatm_MaxQueueTimeDepth=1.6f;// 根据网络延迟动态调整队列深度publicvoidAdjustQueueDepthBasedOnLatency(floatlatency){m_MaxQueueTimeDepth=Mathf.Clamp(1.0f+latency*0.5f,1.0f,3.0f);}动作执行统计
// 新增字段:动作执行统计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;ActionPlayers系统是Boss Room项目中动作管理的核心组件,通过客户端预期和服务器权威执行的结合,实现了低延迟的动作响应和一致的游戏状态。ClientActionPlayer专注于提供流畅的视觉反馈,而ServerActionPlayer负责确保游戏逻辑的正确性和一致性。
该系统的关键设计亮点包括:
通过这些设计,ActionPlayers系统为Boss Room项目提供了一个强大、灵活且高效的动作执行框架。
ClientActionPlayer是Boss Room项目中负责客户端动作可视化与生命周期管理的核心组件,与ServerActionPlayer对应,专注于提供流畅的视觉反馈和减少网络延迟感知。
publicsealedclassClientActionPlayer{privateList<Action>m_PlayingActions=newList<Action>();privateconstfloatk_AnticipationTimeoutSeconds=1;publicClientCharacterClientCharacter{get;privateset;}// ...}OnUpdate()- 核心更新方法,每帧处理所有正在播放的动作:
publicvoidOnUpdate(){// 逆向遍历以便安全地在循环中移除元素for(inti=m_PlayingActions.Count-1;i>=0;--i)