Files
Colosseum/Assets/_Game/Scripts/UI/UIModeController.cs
dal4segno ce883e4fa3 feat: 디버그 패널 스킬 강제 발동 및 UI 모드 토글 시스템 추가
- UIModeController: leftAlt 키로 커서 표시/게임플레이 입력 차단 토글 (공용 싱글톤)
- DebugPanelUI: 보스 스킬 강제 발동 섹션 추가 (드롭다운 + 발동/취소 버튼)
- 에디터에서 Data/Skills의 보스 이름 기반 스킬 검색, 빌드에서 패턴 슬롯 fallback
- BossCombatBehaviorContext.GetAllPatternSkills() 추가 (디버그용 스킬 목록 수집)
- TMP Settings에 한글 폰트(MaruBuri)를 fallback으로 등록
- 젬/패시브/디버그 토글 버튼을 우측 하단에 수직 정렬
- InputSystem에 UIMode 액션(leftAlt) 추가
2026-04-01 23:14:05 +09:00

152 lines
4.1 KiB
C#

#if UNITY_EDITOR || DEVELOPMENT_BUILD
using System;
using UnityEngine;
using Colosseum.Player;
namespace Colosseum.UI
{
/// <summary>
/// 공용 UI 모드 컨트롤러.
/// UIMode 입력(leftAlt)으로 커서 표시/숨김과 게임플레이 입력 차단을 토글합니다.
/// </summary>
[DisallowMultipleComponent]
public class UIModeController : MonoBehaviour
{
private static UIModeController instance;
/// <summary>
/// 현재 활성화된 UIModeController 인스턴스
/// </summary>
public static UIModeController Instance => instance;
/// <summary>
/// UI 모드 활성화 여부
/// </summary>
public bool IsUIModeActive { get; private set; }
/// <summary>
/// UI 모드 상태 변경 이벤트
/// </summary>
public event Action<bool> 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<PlayerSkillInput>(FindObjectsSortMode.None);
for (int i = 0; i < skillInputs.Length; i++)
{
if (skillInputs[i] != null && skillInputs[i].IsOwner)
{
playerSkillInput = skillInputs[i];
playerMovement = skillInputs[i].GetComponent<PlayerMovement>();
break;
}
}
}
/// <summary>
/// UI 모드를 수동으로 설정합니다.
/// </summary>
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