using System; using UnityEngine; // 히든 분기 감시 허브 (씬 오브젝트 불필요, 순수 static). // // 대화 노드가 재생되는 동안 DialogPlayer가 Arm(key)로 무장하고, 끝나면 Disarm()한다. // 그 창(무장 구간) 안에서 DialogGestureZone이 Fire(key)를 호출하면 Fired가 켜지고, // DialogPlayer가 이를 감지해 Next(또는 선택지) 대신 노드의 HiddenBranch로 몰래 분기한다. // // 무장돼 있지 않으면 어떤 Fire도 무시된다 → 평소엔 존재하지 않는 것처럼 동작(=히든). public static class HiddenBranchResolver { private static string _armedKey; // 지금 히든 분기를 받을 수 있는 상태인가 (노드 재생 중) public static bool Armed { get; private set; } // 이번 무장 구간에서 제스처가 발동했는가 public static bool Fired { get; private set; } // 발동 즉시 알림 — 떠 있는 선택지 메뉴를 그 자리에서 취소시키는 용도 public static event Action FiredEvent; // Enter Play Mode(도메인 리로드 off)에서 이전 상태가 안 남게 [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] private static void ResetStatics() { _armedKey = null; Armed = false; Fired = false; FiredEvent = null; } // 노드 진입 시 무장. key가 비면 아무 제스처 존이나 발동시킬 수 있다. public static void Arm(string key) { _armedKey = key; Armed = true; Fired = false; } // 노드 종료 시 해제. public static void Disarm() { Armed = false; _armedKey = null; Fired = false; } // 제스처 존이 호출. 무장 중이고 key가 맞을 때만 1회 발동. // 반환: 이번 호출로 실제 발동했으면 true (호출 측이 "그때만" 아이템 소비 등에 쓸 수 있게). public static bool Fire(string key) { if (!Armed || Fired) return false; if (!string.IsNullOrEmpty(_armedKey) && _armedKey != key) return false; Fired = true; FiredEvent?.Invoke(); return true; } }