49 lines
2.3 KiB
C#
49 lines
2.3 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();
|
|
}
|
|
|
|
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(); }
|
|
}
|
|
}
|