From c6d728172a22df8fb5e34c42f90d5cbf20f99040 Mon Sep 17 00:00:00 2001 From: YuShunyao Date: Thu, 28 May 2026 13:38:34 +0800 Subject: [PATCH] =?UTF-8?q?[bug]=20[6155]=20=E6=9D=A1=E4=BB=B6=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E9=98=B2=E6=AD=A2=E5=90=8C=E4=B8=80=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E9=80=92=E5=BD=92=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Scripts/Framework/Condition/ConditionReactor.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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()