- UIModeController: leftAlt 키로 커서 표시/게임플레이 입력 차단 토글 (공용 싱글톤) - DebugPanelUI: 보스 스킬 강제 발동 섹션 추가 (드롭다운 + 발동/취소 버튼) - 에디터에서 Data/Skills의 보스 이름 기반 스킬 검색, 빌드에서 패턴 슬롯 fallback - BossCombatBehaviorContext.GetAllPatternSkills() 추가 (디버그용 스킬 목록 수집) - TMP Settings에 한글 폰트(MaruBuri)를 fallback으로 등록 - 젬/패시브/디버그 토글 버튼을 우측 하단에 수직 정렬 - InputSystem에 UIMode 액션(leftAlt) 추가
152 lines
4.1 KiB
C#
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
|