// ───────────────────────────────────────────────────────────────────────────── // WLReactionRunner.cs — 전투 반응(연쇄 처치 · 데미지 합산 · 몹 점멸) 공용 틱 러너(숨은 오브젝트 1개 · DontDestroyOnLoad) // // 발주서 WL-811def · 새 Manager/Singleton 을 만들지 않는다(WLHitFeel __WLHitFeel · TimeScaleArbiter 러너 선례). 코루틴 없음 · GC 0. // 각 시스템은 처음 틱이 필요할 때 Ensure() 를 부르고, Update 는 unscaledTime 하나를 세 시스템에 넘긴다. // 파괴·비활성·앱 종료 시 몹 MPB 를 원복하고 폭발 슬롯을 돌려준다. 씬 전환 시 세 시스템의 상태를 비운다(파괴된 Actor 참조 방지). // ───────────────────────────────────────────────────────────────────────────── using UnityEngine; using UnityEngine.SceneManagement; namespace WL.Combat.Reaction { public sealed class WLReactionRunner : MonoBehaviour { static WLReactionRunner s_runner; static bool s_sceneHooked; public static bool Exists { get { return s_runner != null; } } public static void Ensure() { if (s_runner != null) return; var go = new GameObject("__WLReaction"); DontDestroyOnLoad(go); s_runner = go.AddComponent(); if (!s_sceneHooked) { SceneManager.activeSceneChanged += OnSceneChanged; s_sceneHooked = true; } } static void OnSceneChanged(Scene from, Scene to) { KillChain.ClearAll(); DamageAggregator.ClearAll(); MobHitFlash.ClearAll(); } void Update() { float now = Time.unscaledTime; KillChain.Tick(now); DamageAggregator.Tick(now); MobHitFlash.Tick(now); } void OnDisable() { MobHitFlash.RestoreAll(); KillChain.ReleaseBurst(); } void OnApplicationQuit() { MobHitFlash.RestoreAll(); KillChain.ReleaseBurst(); } } }