#if UNITY_EDITOR || DEVELOPMENT_BUILD using System; using UnityEngine; using Colosseum.Player; namespace Colosseum.UI { /// /// 공용 UI 모드 컨트롤러. /// UIMode 입력(leftAlt)으로 커서 표시/숨김과 게임플레이 입력 차단을 토글합니다. /// [DisallowMultipleComponent] public class UIModeController : MonoBehaviour { private static UIModeController instance; /// /// 현재 활성화된 UIModeController 인스턴스 /// public static UIModeController Instance => instance; /// /// UI 모드 활성화 여부 /// public bool IsUIModeActive { get; private set; } /// /// UI 모드 상태 변경 이벤트 /// public event Action OnUIModeChanged; private InputSystem_Actions inputActions; private PlayerMovement playerMovement; private PlayerSkillInput playerSkillInput; private bool previousCursorVisible; private CursorLockMode previousCursorLockState; private void Awake() { if (instance != null && instance != this) { Destroy(gameObject); return; } instance = this; } private void OnDestroy() { if (instance == this) instance = null; CleanupInput(); } private void Start() { InitializeInput(); } private void Update() { if (playerSkillInput == null) FindLocalPlayerReferences(); } private void InitializeInput() { if (inputActions != null) return; inputActions = new InputSystem_Actions(); inputActions.Player.UIMode.performed += OnUIModePerformed; inputActions.Player.UIMode.Enable(); } private void CleanupInput() { if (inputActions != null) { inputActions.Player.UIMode.performed -= OnUIModePerformed; inputActions.Player.UIMode.Disable(); inputActions.Dispose(); inputActions = null; } } private void FindLocalPlayerReferences() { PlayerSkillInput[] skillInputs = FindObjectsByType(FindObjectsSortMode.None); for (int i = 0; i < skillInputs.Length; i++) { if (skillInputs[i] != null && skillInputs[i].IsOwner) { playerSkillInput = skillInputs[i]; playerMovement = skillInputs[i].GetComponent(); break; } } } /// /// UI 모드를 수동으로 설정합니다. /// public void SetUIModeActive(bool active) { if (IsUIModeActive == active) return; IsUIModeActive = active; if (active) { previousCursorVisible = Cursor.visible; previousCursorLockState = Cursor.lockState; Cursor.visible = true; Cursor.lockState = CursorLockMode.None; SetGameplayInputBlocked(true); } else { SetGameplayInputBlocked(false); Cursor.visible = previousCursorVisible; Cursor.lockState = previousCursorLockState; } OnUIModeChanged?.Invoke(IsUIModeActive); } private void OnUIModePerformed(UnityEngine.InputSystem.InputAction.CallbackContext context) { SetUIModeActive(!IsUIModeActive); } private void SetGameplayInputBlocked(bool blocked) { if (playerMovement != null) playerMovement.SetGameplayInputEnabled(!blocked); if (playerSkillInput != null) playerSkillInput.SetGameplayInputEnabled(!blocked); } } } #endif