Project_WL/Assets/WL/Combat/Reaction/WLReactionRunner.cs

51 lines
2.5 KiB
C#

// ─────────────────────────────────────────────────────────────────────────────
// 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<WLReactionRunner>();
if (!s_sceneHooked) { SceneManager.activeSceneChanged += OnSceneChanged; s_sceneHooked = true; }
}
static void OnSceneChanged(Scene from, Scene to)
{
KillChain.ClearAll();
DamageAggregator.ClearAll();
MobHitFlash.ClearAll();
MobStagger.ClearAll(); // WL #816zb — 씬을 넘기며 speed 0 인 몹이 남지 않게
}
void Update()
{
float now = Time.unscaledTime;
KillChain.Tick(now);
DamageAggregator.Tick(now);
MobHitFlash.Tick(now);
MobStagger.Tick(now); // WL #816zb — 피격 경직 해제
}
void OnDisable() { MobHitFlash.RestoreAll(); MobStagger.RestoreAll(); KillChain.ReleaseBurst(); }
void OnApplicationQuit() { MobHitFlash.RestoreAll(); MobStagger.RestoreAll(); KillChain.ReleaseBurst(); }
}
}