using System; using Fantasy.Entitas; using Fantasy.Entitas.Interface; using UnityEngine; using UnityEngine.InputSystem; namespace NBF.Fishing2 { public enum ControllerType { KeyboardMouse = 0, GamePad = 1 } public class InputComponent : Entity { public PlayerInputControl PlayerInputControl { get; set; } /// /// 执行输入事件 /// public event Action OnUIPerformed; /// /// 执行输入事件完毕 /// public event Action OnUICanceled; /// /// 执行输入事件 /// public event Action OnPlayerPerformed; /// /// 执行输入事件完毕 /// public event Action OnPlayerCanceled; /// /// 执行输入事件 /// public event Action OnPlayerValuePerformed; /// /// 执行输入事件完毕 /// public event Action OnPlayerValueCanceled; /// /// 触发交互游戏对象 /// public event Action OnInteractiveObjectAction; /// /// 手柄输入 /// public static bool IsControllerInput; /// /// ui阻止游戏输入 /// public static bool IsUIStopInput; #region Event public class InputComponentAwakeSystem : AwakeSystem { protected override void Awake(InputComponent self) { self.PlayerInputControl = new PlayerInputControl(); self.PlayerInputControl.Enable(); foreach (var actionMap in self.PlayerInputControl.asset.actionMaps) { actionMap.Enable(); if (actionMap.name == "UI") { foreach (var action in actionMap.actions) { if (action.type == InputActionType.Button) { action.performed += self.OnUIButtonPerformed; action.canceled += self.OnUIButtonCanceled; } } } else if (actionMap.name == "Player") { foreach (var action in actionMap.actions) { if (action.type == InputActionType.Button) { action.performed += self.OnPlayerButtonPerformed; action.canceled += self.OnPlayerButtonCanceled; } else if (action.type == InputActionType.Value) { action.performed += self.OnInputPlayerValuePerformed; action.canceled += self.OnInputPlayerValueCanceled; } } } } } } public class InputComponentDestroySystem : DestroySystem { protected override void Destroy(InputComponent self) { foreach (var actionMap in self.PlayerInputControl.asset.actionMaps) { actionMap.Enable(); if (actionMap.name == "UI") { foreach (var action in actionMap.actions) { if (action.type == InputActionType.Button) { action.performed -= self.OnUIButtonPerformed; action.canceled -= self.OnUIButtonCanceled; } } } else if (actionMap.name == "Player") { foreach (var action in actionMap.actions) { if (action.type == InputActionType.Button) { action.performed -= self.OnPlayerButtonPerformed; action.canceled -= self.OnPlayerButtonCanceled; } else if (action.type == InputActionType.Value) { action.performed -= self.OnInputPlayerValuePerformed; action.canceled -= self.OnInputPlayerValueCanceled; } } } } } } public void OnUIButtonPerformed(InputAction.CallbackContext context) { OnUIPerformed?.Invoke(context.action.name); } private void OnUIButtonCanceled(InputAction.CallbackContext context) { OnUICanceled?.Invoke(context.action.name); } private void OnPlayerButtonPerformed(InputAction.CallbackContext context) { if (IsUIStopInput) return; var actionName = context.action.name; // if (actionName == "Op1") // { // OnOp1Action?.Invoke(true); // } // else if (actionName == "Op2") // { // OnOp2Action?.Invoke(true); // } OnPlayerPerformed?.Invoke(actionName); } private void OnPlayerButtonCanceled(InputAction.CallbackContext context) { if (IsUIStopInput) return; var actionName = context.action.name; // if (actionName == "Op1") // { // OnOp1Action?.Invoke(false); // } // else if (actionName == "Op2") // { // OnOp2Action?.Invoke(false); // } // OnPlayerCanceled?.Invoke(actionName); } private void OnInputPlayerValuePerformed(InputAction.CallbackContext context) { if (IsUIStopInput) return; OnPlayerValuePerformed?.Invoke(context); } private void OnInputPlayerValueCanceled(InputAction.CallbackContext context) { if (IsUIStopInput) return; OnPlayerValueCanceled?.Invoke(context); } #endregion public Vector2 GetMovementInput() { if (IsUIStopInput) return Vector2.zero; return PlayerInputControl.Player.Move?.ReadValue() ?? Vector2.zero; } public Vector2 GetLookInput() { if (IsUIStopInput) return Vector2.zero; return PlayerInputControl.Player.Look?.ReadValue() ?? Vector2.zero; } public void SendUIInput(string actionName) { OnUIPerformed?.Invoke(actionName); OnUICanceled?.Invoke(actionName); } } }