InputSystem

InputSystem API文档

学习资料,在PackageManager中添加InputSystem的Samples。

如果启用了新版输入系统,还使用旧版输入系统就会报错

InvalidOperationException: You are trying to read Input using the UnityEngine.Input class, but you have switched active Input handling to Input System package in Player Settings.
02-28 16:20:22.460 14806 31977 E Unity   :   at (wrapper managed-to-native) UnityEngine.Input.GetKeyDownInt(UnityEngine.KeyCode)

关键类

  • InputAction
  • InputBindings
  • InputActionPhase表示InputAction的五种阶段。分别为:Canceled, Disabled, Performed, Started, Waiting
  • InputActionAssets:是一种存储动作绑定关系的资源文件,扩展名为.InputActions,数据格式为 JSON。可以通过 Project 页面中 Create -> Input Actions 来创建一个新的 Input Action Assets。
  • PlayerInput

使用示例

直接获取当前输入设备的状态

public void Update()
{
    var gp = Gamepad.current;
    if (gp == null) return;
    
    Vector2 leftStick = gp.leftStick.ReadValue(),
            rightStick = gp.rightStick.ReadValue();
    
    if (gp.buttonSouth.wasPressedThisFrame) Debug.Log("Pressed");
    if (gp.buttonSouth.wasReleasedThisFrame) Debug.Log("Released");
    
    //...
}

使用PlayerInput组件

public class Player : MonoBehaviour
{
    // Unity Event的情况,需要在Inspector中进行本函数的订阅操作
    public void OnAttack(InputAction.CallbackContext callback)
    {
        switch (callback.phase)
        {
            case InputActionPhase.Performed:
                Debug.Log("Attacking!");
        }
        move = callback.ReadValue<Vector2>();
    }
    
    // C# 事件的情况,与上方情况不共存
    private PlayerInput input;
    private Vector2 move;
    private void Awake()
    {
        // 添加订阅者函数, 当然也可以写成独立的函数
        input = GetComponent<PlayerInput>().onActionTriggered += 
            callback =>
        {
            if (callback.action.name == "Move")
            {
                move = callback.ReadValue<Vector2>();
            }
        };
        
        // ...
    }
}

直接使用InputAction,不让PlayerInput赚差价

public class Player : MonoBehaviour
{
    public InputAction moveAction;
    
    public void OnEnable()
    {
        moveAction.Enable();
    }
    
    public void OnDisable()
    {
        moveAction.Disable();
    }
    
     // 此时我们自定义的InputAction即可正常使用
    public void Update()
    {
        var move = moveAction.ReadValue<Vector2>();
        
        //...
    }
}

代码示例

            if (Input.GetKeyDown(KeyCode.UpArrow))
            {
                keydown = true;
                Up();
            }
            else if (Input.GetKeyDown(KeyCode.DownArrow))
            {
                keydown = true;
                Down();
            }
            else if (Input.GetKeyDown(KeyCode.LeftArrow))
            {
                keydown = true;
                Left();
            }
            else if (Input.GetKeyDown(KeyCode.RightArrow))
            {
                keydown = true;
                Right();
            }

使用宏处理新旧输入系统

 #if ENABLE_INPUT_SYSTEM
     // New input system backends are enabled.
 #endif
 
 #if ENABLE_LEGACY_INPUT_MANAGER
     // Old input backends are enabled.
 #endif