diff --git a/ProjectNLD/Assets/Code/Scripts/Framework/Condition/ConditionReactor.cs b/ProjectNLD/Assets/Code/Scripts/Framework/Condition/ConditionReactor.cs index 3a63bfbced1..ea0d398fdce 100644 --- a/ProjectNLD/Assets/Code/Scripts/Framework/Condition/ConditionReactor.cs +++ b/ProjectNLD/Assets/Code/Scripts/Framework/Condition/ConditionReactor.cs @@ -86,6 +86,11 @@ namespace Framework.Condition /// private Stack stackExEventName = new(MAX_EX_EVENT_COUNT); + /// + /// 追踪正在处理的事件,防止同一事件递归重入 + /// + private HashSet _processingEvents = new(); + /// /// 为减少GC分配 /// @@ -115,6 +120,7 @@ namespace Framework.Condition dicAllContitionInfo.Clear(); dicConditionInfo.Clear(); setConditionInfoPool.Clear(); + _processingEvents.Clear(); setTempSignal.Clear(); } @@ -339,6 +345,10 @@ namespace Framework.Condition private void OnSignalSend(EventName signalName) { + // 防止同一事件递归处理:如果该事件正在处理中,直接跳过 + if (!_processingEvents.Add(signalName)) + return; + stackExEventName.Push(signalName); // 防止死循环 if (stackExEventName.Count >= MAX_EX_EVENT_COUNT) { @@ -349,12 +359,14 @@ namespace Framework.Condition } DebugUtil.LogError($"条件系统递归触发超过{MAX_EX_EVENT_COUNT - 1}次,请检查逻辑:{log}"); stackExEventName.Pop(); + _processingEvents.Remove(signalName); return; } if (!dicConditionInfo.TryGetValue(signalName, out Dictionary dicInfo)) { stackExEventName.Pop(); + _processingEvents.Remove(signalName); return; } @@ -371,6 +383,7 @@ namespace Framework.Condition RecycleTempConditionInfos(listTemp); stackExEventName.Pop(); + _processingEvents.Remove(signalName); } private List GetTempConditionInfos()