UI 자동화를 위해 바인딩 기능 구현

- 유니티 에셋 인증 오류로 meta 재생성
This commit is contained in:
2026-01-25 01:31:34 +09:00
parent 2ceb28f55d
commit ce83f21c93
1861 changed files with 377882 additions and 211 deletions

View File

@@ -0,0 +1,131 @@
using System;
using UnityEngine.EventSystems;
using UnityEngine.Pool;
namespace UnityEngine.InputSystem.Samples.RebindUI
{
/// <summary>
/// Simple game manager that manages enabling/disabling in-game and UI actions.
/// </summary>
/// <remarks>State transitions happens per frame and hence handles throttling.</remarks>
public class RebindUIGameManager : MonoBehaviour
{
[Tooltip("The in-game menu object to be activated and deactivated when menu is toggled (Required).")]
public GameObject menu;
[Tooltip("The actions asset that holds Gameplay, Common and UI action maps to be used. (Required).")]
public InputActionAsset actions;
[Tooltip("Whether UI actions should be disabled during gameplay.")]
public bool enableUIActionsDuringGameplay = true;
[Tooltip("The gameplay manager responsible for managing gameplay.")]
public GameplayManager gameplayManager;
[Tooltip("The gameplay UI")]
public GameObject gameUI;
private GameState m_CurrentState = GameState.Initializing;
private GameState m_NextState = GameState.Playing;
private InputActionMap gameplayActions;
private InputActionMap uiActions;
private InputAction toggleMenuAction;
private void Awake()
{
gameplayActions = actions.FindActionMap("Gameplay");
uiActions = actions.FindActionMap("UI");
toggleMenuAction = actions.FindAction("Common/Menu");
}
/// <summary>
/// Toggles between game state and rebinding menu state.
/// </summary>
public void ToggleMenu()
{
switch (m_CurrentState)
{
case GameState.Playing:
m_NextState = GameState.RebindingMenu;
break;
case GameState.RebindingMenu:
// Only allow transition back to the game if game menu is interactable.
// This is to avoid e.g. pressing menu toggle action while in rebind mode.
// Essentially this is equivalent "if NOT currently rebinding".
if (menu.GetComponent<CanvasGroup>().interactable)
m_NextState = GameState.Playing;
break;
}
}
private enum GameState
{
Initializing,
Playing,
RebindingMenu
}
private void OnToggleMenu(InputAction.CallbackContext obj)
{
ToggleMenu();
}
private void OnEnable()
{
toggleMenuAction.performed += OnToggleMenu;
toggleMenuAction.Enable();
}
private void OnDisable()
{
toggleMenuAction.performed -= OnToggleMenu;
toggleMenuAction.Disable();
}
private void Update()
{
// Abort if there is no change to state
if (m_CurrentState == m_NextState)
return;
// Update current state
m_CurrentState = m_NextState;
// Handle state transition
switch (m_NextState)
{
// Entering game mode: enable in-game actions, show menu
case GameState.Playing:
gameplayActions.Enable();
gameplayManager.enabled = true;
if (enableUIActionsDuringGameplay)
uiActions.Enable();
else
uiActions.Disable();
gameUI.SetActive(true);
menu.SetActive(false);
break;
// Entering menu: disable in-game actions, hide menu, make sure we have selection.
// Also make sure or toggle menu action is enabled in case its part of gameplay actions.
case GameState.RebindingMenu:
gameplayActions.Disable();
gameplayManager.enabled = false;
if (!enableUIActionsDuringGameplay)
uiActions.Enable();
gameUI.SetActive(false);
menu.SetActive(true);
// Workaround: Make sure we always have a select game object since Unity UI might otherwise show
// without a selection which might prevent gamepad navigation.
var eventSystem = EventSystem.current;
if (eventSystem.currentSelectedGameObject == null)
eventSystem.SetSelectedGameObject(eventSystem.firstSelectedGameObject);
break;
}
}
}
}