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:
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using BaseGames.Core;
|
||||
using BaseGames.Core.Events;
|
||||
using BaseGames.Core.Save;
|
||||
using UnityEngine;
|
||||
|
||||
@@ -41,10 +42,23 @@ namespace BaseGames.World
|
||||
public event Action<WorldObjectCategory, string[]> OnBatchStateChanged;
|
||||
|
||||
/// <summary>
|
||||
/// Editor 重新进入 Play Mode 时 ScriptableObject 保留上一次运行的状态,
|
||||
/// OnEnable 在域重载(Domain Reload)和每次 Play 开始时都会调用,确保状态干净。
|
||||
/// ScriptableObject 会在多次 Play 会话间保留运行时状态,进入 Play 前必须清干净。
|
||||
/// 关闭 Domain Reload 后 OnEnable 不再于每次进入 Play 触发,故同时登记到 PlayModeResetHook,
|
||||
/// 由编辑器钩子在进入 Play 前兜住重置(构建中仍由 OnEnable 负责)。
|
||||
/// </summary>
|
||||
private void OnEnable() => _states.Clear();
|
||||
private void OnEnable()
|
||||
{
|
||||
ResetRuntimeState();
|
||||
PlayModeResetHook.Register(ResetRuntimeState);
|
||||
}
|
||||
|
||||
/// <summary>清空运行时状态字典与变更事件订阅者,回到干净起点。</summary>
|
||||
private void ResetRuntimeState()
|
||||
{
|
||||
_states.Clear();
|
||||
OnStateChanged = null;
|
||||
OnBatchStateChanged = null;
|
||||
}
|
||||
|
||||
// ── 泛化 API ─────────────────────────────────────────────────────────
|
||||
/// <summary>检查指定类别中 id 是否已标记。</summary>
|
||||
|
||||
Reference in New Issue
Block a user