using System; using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.SceneManagement; namespace BlueWater { public enum InputActionMaps { None = 0, Tycoon, TycoonUi, CombatTitle, Combat, CombatUi, } public static class TycoonActions { public const string Move = "Move"; public const string Dash = "Dash"; public const string Interaction = "Interaction"; public const string DevelopKey01 = "DevelopKey01"; public const string OpenManualBook = "OpenManualBook"; public const string ZoomOut = "ZoomOut"; public const string ZoomIn = "ZoomIn"; public const string Options = "Options"; } public static class TycoonUiActions { public const string Cancel = "Cancel"; public const string PressQ = "PressQ"; public const string PressAnyKey = "PressAnyKey"; public const string InteractionE = "InteractionE"; } public class PlayerInputKeyManager : Singleton { [SerializeField] private PlayerInput _currentPlayerInput; [SerializeField] private InputActionMaps _initializedActionMap; private Vector3 _lastMousePosition; //마우스 이동 감지용 private bool _isKey = false; //키보드 입력상태 == true / 마우스 입력상태 == false (중복 방직용) private readonly List _onActionKeyboard = new List(); private readonly List _onActionMouse = new List(); protected override void OnAwake() { base.OnAwake(); _currentPlayerInput = GetComponent(); } private async void Start() { await Initialize(); } public void Update() { bool CheckMouse(){return Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1)||Input.GetMouseButtonDown(2);} if(!_isKey && Input.anyKeyDown && !CheckMouse()) //키보드 감지 (최초) { foreach (var element in _onActionKeyboard) { element?.Invoke(); } _lastMousePosition = Input.mousePosition; _isKey = true; } else if (_isKey && (Input.anyKeyDown && CheckMouse() || (_isKey && Input.mousePosition != _lastMousePosition))) //마우스 감지 (최초) { foreach (var element in _onActionMouse) { element?.Invoke(); } _lastMousePosition = Input.mousePosition; _isKey = false; } } private async Task Initialize() { await Task.Delay(1000); DisableAllActionMaps(); SwitchCurrentActionMap(_initializedActionMap); if (SceneManager.GetActiveScene().name == "01.Tycoon") { EventManager.InvokeInitializedPlayerInput(); } } public void AddOnActionKeyboard(Action action) { _onActionKeyboard.Add(action); } public void AddOnActionMouse(Action action) { _onActionMouse.Add(action); } public void RemoveOnActionKeyboard(Action action) { _onActionKeyboard.Remove(action); } public void RemoveOnActionMouse(Action action) { _onActionMouse.Remove(action); } /// /// 현재 실행되고 있는 PlayerInput을 관리할 수 있게 /// PlayerInput 컴포넌트를 받아와서 사용하는 경우에 필수로 호출 /// /// public void SetCurrentPlayerInput(PlayerInput playerInput) => _currentPlayerInput = playerInput; private bool IsNullCurrentPlayerInput() { if (_currentPlayerInput && _currentPlayerInput.enabled) return false; Debug.Log("CurrentPlayerInput가 할당되지 않았습니다."); return true; } public InputAction GetAction(InputActionMaps actionMapName, string actionName) { if (IsNullCurrentPlayerInput()) return null; var actionMap = _currentPlayerInput.actions.FindActionMap(actionMapName.ToString(), true); if (actionMap == null) { Debug.LogError($"Action Map '{actionMapName}' not found!"); return null; } var action = actionMap.FindAction(actionName, true); if (action == null) { Debug.LogError($"Action '{actionName}' not found in Action Map '{actionMapName}'!"); } return action; } public bool IsCurrentActionMap(InputActionMaps inputActionMaps) { if (IsNullCurrentPlayerInput()) return false; return _currentPlayerInput.currentActionMap.ToString() == inputActionMaps.ToString(); } public void SwitchCurrentActionMap(string inputActionMaps) { if (IsNullCurrentPlayerInput()) return; _currentPlayerInput.SwitchCurrentActionMap(inputActionMaps); } public void SwitchCurrentActionMap(InputActionMaps inputActionMaps) { if (IsNullCurrentPlayerInput()) return; _currentPlayerInput.SwitchCurrentActionMap(inputActionMaps.ToString()); } public InputActionMap GetCurrentInputActionMap() { if (IsNullCurrentPlayerInput()) return null; return _currentPlayerInput.currentActionMap; } public void EnableCurrentPlayerInput() { if (!_currentPlayerInput) return; _currentPlayerInput.enabled = true; } public void DisableCurrentPlayerInput() { if (IsNullCurrentPlayerInput()) return; _currentPlayerInput.enabled = false; } public void DisableAllActionMaps() { if (IsNullCurrentPlayerInput()) return; foreach (var element in _currentPlayerInput.actions.actionMaps) { element.Disable(); } } public void DisableAllActionsExcept(string exceptActionName) { if (IsNullCurrentPlayerInput()) return; var exceptAction = _currentPlayerInput.currentActionMap.FindAction(exceptActionName); foreach (var action in _currentPlayerInput.currentActionMap.actions) { if (action != exceptAction) { action.Disable(); } else { action.Enable(); } } } public void EnableAllActionsMaps() { if (IsNullCurrentPlayerInput()) return; foreach (var action in _currentPlayerInput.actions) { action.Enable(); } } public void EnableAction(string actionName) { if (IsNullCurrentPlayerInput()) return; var action = _currentPlayerInput.currentActionMap.FindAction(actionName); if (action == null) { Debug.Log($"현재 Action Map인 {_currentPlayerInput.currentActionMap}에는 {actionName} Action이 존재하지 않습니다"); return; } action.Enable(); } public void DisableAction(string actionName) { if (IsNullCurrentPlayerInput()) return; var action = _currentPlayerInput.currentActionMap.FindAction(actionName); if (action == null) { Debug.Log($"현재 Action Map인 {_currentPlayerInput.currentActionMap}에는 {actionName} Action이 존재하지 않습니다"); return; } action.Disable(); } } }