Files
2026-07-23 13:08:43 +09:00

61 lines
2.1 KiB
C#

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;
}
}