using UnityEngine; using System; /// /// PackageRegedit的扩展类 /// 提供新的包分发接口,支持将包分发到RecordAction的内部RecordPlayer /// 不修改原有的PackageRegedit.Distribute接口,采用新接口绕过 /// public class PackageRegeditEx { /// /// 将包分发到指定RecordAction的内部RecordPlayer /// 这个方法用于处理RecordAction内部产生的包(如技能内部的Buff添加、子技能等) /// /// 使用场景: /// 1. SkillBase中通过PackageRegedit.Distribute产生的包,应该使用SkillRecordAction的innerRecordPlayer /// 2. 确保这些包的生命周期与父RecordAction绑定 /// 3. ForceFinish时可以一并处理 /// /// 要分发的包 /// 父RecordAction,包应该由它的innerRecordPlayer管理 public static void DistributeToRecordAction(GameNetPackBasic pack, RecordAction parentRecordAction) { if (pack == null) { Debug.LogError("PackageRegeditEx.DistributeToRecordAction: pack is null"); return; } if (parentRecordAction == null) { // 如果没有父RecordAction,使用原有的分发逻辑(会使用BattleField的主RecordPlayer) Debug.LogWarning("PackageRegeditEx.DistributeToRecordAction: parentRecordAction is null, 使用默认分发"); PackageRegedit.Distribute(pack); return; } // 标记这个包是在RecordAction内部处理的 // 这样可以在PackageRegedit的处理逻辑中识别并使用正确的RecordPlayer pack.commonMark = true; // 临时保存当前正在处理的RecordAction上下文 // 这样在DTC处理类中可以获取到父RecordAction,从而使用正确的RecordPlayer CurrentRecordActionContext.Push(parentRecordAction); try { // 调用原有的分发逻辑 PackageRegedit.Distribute(pack); } finally { // 恢复上下文 CurrentRecordActionContext.Pop(); } } /// /// 获取当前应该使用的RecordPlayer /// /// 判断逻辑: /// 1. 如果有当前RecordAction上下文,使用RecordAction.innerRecordPlayer(RecordAction内部产生的) /// 2. 否则使用BattleField.recordPlayer(顶层包,直接从服务器来的) /// /// 战场 /// 应该使用的RecordPlayer public static RecordPlayer GetTargetRecordPlayer(BattleField battleField) { if (battleField == null) { Debug.LogError("PackageRegeditEx.GetTargetRecordPlayer: battleField is null"); return null; } // 检查是否在RecordAction上下文中 var currentRecordAction = CurrentRecordActionContext.Current; if (currentRecordAction != null) { // 使用RecordAction的innerRecordPlayer // 原因:这个包是在RecordAction内部产生的,应该由RecordAction管理 var innerPlayer = currentRecordAction.GetInnerRecordPlayer(); if (innerPlayer != null) { return innerPlayer; } else { Debug.LogWarning($"PackageRegeditEx.GetTargetRecordPlayer: RecordAction {currentRecordAction.GetType().Name} 的 innerRecordPlayer 为 null,使用 BattleField.recordPlayer"); } } // 使用BattleField的主RecordPlayer // 原因:这是顶层包,直接从服务器来的,或者没有RecordAction上下文 return battleField.recordPlayer; } } /// /// 当前RecordAction上下文 /// 使用栈结构管理嵌套的RecordAction上下文 /// 这样可以在包分发过程中知道当前处于哪个RecordAction内部 /// public static class CurrentRecordActionContext { private static System.Collections.Generic.Stack contextStack = new System.Collections.Generic.Stack(); public static RecordAction Current { get { if (contextStack.Count > 0) { return contextStack.Peek(); } return null; } } public static void Push(RecordAction recordAction) { if (recordAction != null) { contextStack.Push(recordAction); } } public static void Pop() { if (contextStack.Count > 0) { contextStack.Pop(); } } public static void Clear() { contextStack.Clear(); } public static int Depth { get { return contextStack.Count; } } }