Unity-输入系统(Input System)

Input System 1.3.0 # 从旧输入系统迁移 使用条件编译可以同时为旧输入系统和新输入系统提供代码。在播放器首选项中启用新输入系统(请参阅此处)时,预处理器指令可用。

1
2
3
4
5
6
7
8
9
#if ENABLE_INPUT_SYSTEM
// 启用了新版输入系统后端
#endif

#if ENABLE_LEGACY_INPUT_MANAGER
// 启用了旧版输入系统后端
#endif

//注意:两者可以同时为真,因为在"Active Input Handling"下可以选择"Both"
1
2
3
4
5
6
7
8
9
    // 如果启用了新版输入系统后端
#if ENABLE_INPUT_SYSTEM
if (Keyboard.current[Key.H].wasPressedThisFrame)
#endif

// 如果启用了旧版输入系统后端
#if ENABLE_LEGACY_INPUT_MANAGER
if (Input.GetKeyDown(KeyCode.H))
#endif

开始使用

组件式控制方法

1. 添加组件PlayerInput

直接通过代码从输入设备获取输入,既快速又方便,但需要为每种类型的设备提供单独的路径。这也使得以后更难更改哪个设备控件触发了游戏中的特定事件。 所以,这里使用Actions作为设备和它们触发的游戏内响应之间的中介。最简单的方法是使用PlayerInput组件。要添加此组件,请单击游戏对象检查器中的添加组件按钮,添加 PlayerInput 组件。 每个PlayerInput组件代表游戏中的一个玩家。 ### 2. 创建输入操作 若要接收输入,组件必须连接到一组输入操作。创建新操作集的最快方法是点按该组件的“检查器”窗口中的“创建动作...”按钮。这将创建一个预先填充了一组默认的输入操作映射、输入操作和输入绑定的资产。 image.png 单击“Create Actions”按钮时,Unity 会询问您在何处创建新资源。选择项目文件夹中的名称和文件夹(或仅接受默认值),然后选择“确定”。这将在项目中创建一个新资源,将其连接到 PlayerInput 组件,并打开文件的编辑器窗口,检查项目自动设置的常用玩家输入列表,或者根据需要进行修改。 image.png ### 3. 编写玩家移动脚本 创建一个“PlayerController”的控制脚本,附加到玩家游戏对象上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerController : MonoBehaviour
{
private Rigidbody rb;
private float movementX;
private float movementY;
public float speed = 1;

void Start()
{
rb = GetComponent<Rigidbody>();
}

private void OnMove(InputValue movementValue)
{
Vector2 movementVector = movementValue.Get<Vector2>();
movementX = movementVector.x;
movementY = movementVector.y;
}

void FixedUpdate()
{
Vector3 movement = new Vector3(movementX, 0.0f, movementY);
rb.AddForce(movement * speed);
}
}
## 脚本式控制方法

  1. 新建 Input Actions 文件,并配置相应的控制按键。

  2. 勾选“Generate C# Class”复选框,并“应用”。

  3. 创建一个“PlayerController”的控制脚本,附加到玩家游戏对象上。

  4. Awake()、OnEnable()、OnDisable()是核心代码,不可缺少

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.InputSystem;

    public class PlayerController2 : MonoBehaviour
    {
    PlayerControls controls;
    Vector2 move;
    public float speed = 10;

    void Awake()
    {
    controls = new PlayerControls();
    controls.Player.Move.performed += ctx => move = ctx.ReadValue<Vector2>(); // 读取 位移向量
    controls.Player.Move.canceled += ctx => move = Vector2.zero; // 在不动左摇杆的时候,不发生位移

    controls.Player.Jump.started += ctx => Jump(); // 通过 lambda表达式将按键绑定到 Jump() 方法上
    }

    private void OnEnable()
    {
    controls.Player.Enable();
    }
    private void OnDisable()
    {
    controls.Player.Disable();
    }

    void FixedUpdate()
    {
    Vector3 movement = new Vector3(move.x, 0.0f, move.y) * speed * Time.deltaTime;
    transform.Translate(movement, Space.World);
    }

    void Jump(){}
    }
    # API ## Input Action Editor - 输入操作编辑器 “操作编辑器”窗口分为三个窗格:

  5. 左窗格(Action Maps)列出了资产中的操作映射。每个操作映射都是可以批量启用或禁用的操作的集合。 例如,一种常见的用法是将可以在 UI 或主菜单中执行的操作与可以在游戏过程中执行的操作分开。但是,即使在游戏中,也可以使用多个Action Maps。例如,可以有不同的驾驶和步行动作地图,以及两种模式之间共享的动作的一张地图。

  6. 中间窗格(Actions)包含当前所选操作映射中的操作,以及与每个操作关联的绑定。

  7. 右窗格(Properties)包含当前所选操作或绑定的属性。

  8. 左上角(All Control Scheme)包含当前资产的控制方案,可以有多个控制方案,这些方案允许您为不同类型的设备启用或禁用操作的不同绑定集。

  9. (Save Asset)保存资产,关闭窗口时记得要保存,否则所有操作将丢失。

Visualizers - 输入可视化工具

image.png可视化工具显示游戏手柄的“A”键正在按下 # 参考资料 Unity 新的输入系统Input System(一) Unity 新的输入系统Input System(二) Unity官方学习路径 - 在 Unity 中使用输入系统