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);
}
}
}