Project_WL/Assets/WL/Combat/Diagnostics/RunErrorModalGuardRunner.cs

46 lines
2.2 KiB
C#

// ─────────────────────────────────────────────────────────────────────────────
// 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
{
/// <summary>훅 상태를 폴링 주기마다 목표 상태로 맞춘다(바뀔 때만 손댄다).</summary>
internal sealed class RunErrorModalGuardRunner : MonoBehaviour
{
static RunErrorModalGuardRunner s_runner;
/// <summary>런너 1개 보장(플레이 모드 전용).</summary>
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<RunErrorModalGuardRunner>();
}
/// <summary>런너가 살아 있는가(프로브가 읽는다).</summary>
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(); // 훅을 내려둔 채로 사라지지 않는다
}
}
}