perf(editor): 关闭 Domain/Scene Reload 加速进入 Play,并补齐域重载安全

关闭 Domain Reload 后 SO 的 OnEnable/OnDisable 不再于进入/退出 Play 触发、
静态字段不再重置,运行时态会跨 Play 会话残留。补齐重置路径:

- 新增 PlayModeResetHook:编辑器内在"进入 Play 前"统一回调各 SO 的重置,
  复刻 Domain Reload 曾提供的干净起点;运行时构建为空实现、零开销。
- 静态态用 RuntimeInitializeOnLoadMethod 重置:
  ServiceLocator._services / SettingsManager.SettingsChanged /
  EventChainManager.OnChainExecutedInEditor。
- SO 运行时态经 PlayModeResetHook 重置:
  BaseEventChannelSO(粘性值+订阅委托) / VoidBaseEventChannelSO /
  WorldStateRegistry(状态字典+变更事件) / InputReaderSO。
- InputReaderSO 增加解绑追踪:跨会话重建前先解绑旧输入回调,
  避免 InputActionAsset 存活导致同一输入重复绑定、多次触发。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-11 14:40:37 +08:00
parent 253a8811fa
commit 4189a6210b
9 changed files with 202 additions and 22 deletions

View File

@@ -79,6 +79,13 @@ namespace BaseGames.EventChain
/// EventChainEditorWindow 在 OnEnable 中订阅此事件。
/// </summary>
public static event Action<string, string> OnChainExecutedInEditor;
/// <summary>
/// 关闭 Domain Reload 后静态事件不再于进入 Play 时清空,此钩子在任何 Awake 之前将其重置为 null
/// 避免上一次运行残留的编辑器窗口订阅者累积。
/// </summary>
[UnityEngine.RuntimeInitializeOnLoadMethod(UnityEngine.RuntimeInitializeLoadType.SubsystemRegistration)]
private static void ResetEditorStaticState() => OnChainExecutedInEditor = null;
#endif
private readonly HashSet<string> _completedChains = new();