#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