Unity-输入系统(Input System)
Input System 1.3.0 # 从旧输入系统迁移 使用条件编译可以同时为旧输入系统和新输入系统提供代码。在播放器首选项中启用新输入系统(请参阅此处)时,预处理器指令可用。
1 | #if ENABLE_INPUT_SYSTEM |
1 | // 如果启用了新版输入系统后端 |
开始使用
组件式控制方法
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
30using 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);
}
}
新建 Input Actions 文件,并配置相应的控制按键。
勾选“Generate C# Class”复选框,并“应用”。
创建一个“PlayerController”的控制脚本,附加到玩家游戏对象上。
Awake()、OnEnable()、OnDisable()是核心代码,不可缺少
# API ## Input Action Editor - 输入操作编辑器 “操作编辑器”窗口分为三个窗格: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
37using 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(){}
}左窗格(Action Maps)列出了资产中的操作映射。每个操作映射都是可以批量启用或禁用的操作的集合。 例如,一种常见的用法是将可以在 UI 或主菜单中执行的操作与可以在游戏过程中执行的操作分开。但是,即使在游戏中,也可以使用多个Action Maps。例如,可以有不同的驾驶和步行动作地图,以及两种模式之间共享的动作的一张地图。
中间窗格(Actions)包含当前所选操作映射中的操作,以及与每个操作关联的绑定。
右窗格(Properties)包含当前所选操作或绑定的属性。
左上角(All Control Scheme)包含当前资产的控制方案,可以有多个控制方案,这些方案允许您为不同类型的设备启用或禁用操作的不同绑定集。
(Save Asset)保存资产,关闭窗口时记得要保存,否则所有操作将丢失。
Visualizers - 输入可视化工具
可视化工具显示游戏手柄的“A”键正在按下 # 参考资料 Unity
新的输入系统Input System(一) Unity
新的输入系统Input System(二) Unity官方学习路径
- 在 Unity 中使用输入系统