// ───────────────────────────────────────────────────────────────────────────── // RunErrorModalGuardRunner.cs — RunErrorModalGuard 의 시간 축(숨김 GameObject 1개 · 코루틴 0) // // PD 지시 #813 · 발주서 WL-813x2 §1-3 (2026-09-09) // // 새 Manager/Singleton 을 만들지 않는다 — RunDirectorRunner · BossArenaRunner · SurvivalRunner 와 같은 방식. // HideAndDontSave 라 씬 전환에도 살아남고 씬·프리팹에 저장되지 않는다. // WLErrorGuardSettings.Enabled 가 false 면 Boot 이 이 오브젝트를 아예 만들지 않는다(C8). // // 🔴 어셈블리 주의: Assets/WL/Combat/ 에 .asmdef 를 만들지 말 것. // ───────────────────────────────────────────────────────────────────────────── using UnityEngine; namespace WL.Combat.Diagnostics { /// 훅 상태를 폴링 주기마다 목표 상태로 맞춘다(바뀔 때만 손댄다). internal sealed class RunErrorModalGuardRunner : MonoBehaviour { static RunErrorModalGuardRunner s_runner; /// 런너 1개 보장(플레이 모드 전용). internal static void Ensure() { if (!Application.isPlaying || s_runner != null) return; var go = new GameObject("[WL813x2] RunErrorModalGuardRunner"); go.hideFlags = HideFlags.HideAndDontSave; s_runner = go.AddComponent(); } /// 런너가 살아 있는가(프로브가 읽는다). internal static bool Exists { get { return s_runner != null; } } void Update() { RunErrorModalGuard.Tick(Time.unscaledDeltaTime); } void OnApplicationQuit() { RunErrorModalGuard.Unsubscribe(); } void OnDestroy() { if (!ReferenceEquals(s_runner, this)) return; s_runner = null; RunErrorModalGuard.Restore(); // 훅을 내려둔 채로 사라지지 않는다 } } }