feat: 디버그 패널 스킬 강제 발동 및 UI 모드 토글 시스템 추가
- UIModeController: leftAlt 키로 커서 표시/게임플레이 입력 차단 토글 (공용 싱글톤) - DebugPanelUI: 보스 스킬 강제 발동 섹션 추가 (드롭다운 + 발동/취소 버튼) - 에디터에서 Data/Skills의 보스 이름 기반 스킬 검색, 빌드에서 패턴 슬롯 fallback - BossCombatBehaviorContext.GetAllPatternSkills() 추가 (디버그용 스킬 목록 수집) - TMP Settings에 한글 폰트(MaruBuri)를 fallback으로 등록 - 젬/패시브/디버그 토글 버튼을 우측 하단에 수직 정렬 - InputSystem에 UIMode 액션(leftAlt) 추가
This commit is contained in:
151
Assets/_Game/Scripts/UI/UIModeController.cs
Normal file
151
Assets/_Game/Scripts/UI/UIModeController.cs
Normal file
@@ -0,0 +1,151 @@
|
||||
#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
|
||||
Reference in New Issue
Block a user