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. 创建输入操作·

若要接收输入,组件必须连接到一组输入操作。创建新操作集的最快方法是点按该组件的“检查器”窗口中的“创建动作…”按钮。这将创建一个预先填充了一组默认的输入操作映射、输入操作和输入绑定的资产。

单击“Create Actions”按钮时,Unity 会询问您在何处创建新资源。选择项目文件夹中的名称和文件夹(或仅接受默认值),然后选择“确定”。这将在项目中创建一个新资源,将其连接到 PlayerInput 组件,并打开文件的编辑器窗口,检查项目自动设置的常用玩家输入列表,或者根据需要进行修改。

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 - 输入操作编辑器·

“操作编辑器”窗口分为三个窗格:

  1. 左窗格(Action Maps)列出了资产中的操作映射。每个操作映射都是可以批量启用或禁用的操作的集合。
    例如,一种常见的用法是将可以在 UI 或主菜单中执行的操作与可以在游戏过程中执行的操作分开。但是,即使在游戏中,也可以使用多个Action Maps。例如,可以有不同的驾驶和步行动作地图,以及两种模式之间共享的动作的一张地图。
  2. 中间窗格(Actions)包含当前所选操作映射中的操作,以及与每个操作关联的绑定。
  3. 右窗格(Properties)包含当前所选操作或绑定的属性。
  4. 左上角(All Control Scheme)包含当前资产的控制方案,可以有多个控制方案,这些方案允许您为不同类型的设备启用或禁用操作的不同绑定集。
  5. (Save Asset)保存资产,关闭窗口时记得要保存,否则所有操作将丢失。

Visualizers - 输入可视化工具·

可视化工具显示游戏手柄的“A”键正在按下

参考资料·

Unity 新的输入系统Input System(一)
Unity 新的输入系统Input System(二)
Unity官方学习路径 - 在 Unity 中使用输入系统