译注:相关链接尚未完善,访问时可能遭遇 404,你可以先 查看原文 。
工作流概述 - 动作与 PlayerInput(玩家输入)组件

输入系统(Input System)中最高级别的抽象是将 动作 与 Player Input 组件结合起来。
你可以通过 Player Input 组件来配置动作,并与你自己的 MonoBehaviour 脚本中的 C# 方法相连接,当在用户输入时会自动调用你指定的 C# 方法。
你可以在检视面板(Inspector)UI 中设置这些事件驱动的连接,而不是像 上文中的工作流示例 那样,编写代码来轮询动作的值。
PlayerInput 组件也可以用于本地多人游戏。你可以将 PlayerInput 组件与 PlayerInputManager(玩家输入管理器)组件一起使用,当新的输入设备上触发输入时会自动实例化新玩家。例如,如果你正在制作一款四人本地合作游戏,结合使用 PlayerInput 和 PlayerInputManager 两个组件之后,新玩家只要按下控制器上的开始按钮即可自动加入游戏。

在上面的示例图片中,你可以看到 PlayerInput 组件已设置为通过 Unity 事件将“move”和“jump”动作映射到脚本中的 OnMove 和 OnJump 方法。
下面这个示例脚本实现了这些方法:
using UnityEngine;
using UnityEngine.InputSystem;
// 这个脚本旨在让 PlayerInput 组件调用 OnMove 和 OnJump 方法
public class ExampleScript : MonoBehaviour
{
Vector2 moveAmount;
public void OnMove(InputAction.CallbackContext context)
{
// 在每次事件调用时读取“move”动作的值
moveAmount = context.ReadValue<Vector2>();
}
public void OnJump(InputAction.CallbackContext context)
{
// 将你的跳跃代码写在这里。
}
public void Update()
{
// 若要在每一帧使用来自“move”动作的 Vector2 值,请在此处读取“moveAmount”变量。
}
}
提示
如果你使用 PlayerInput 工作流,通常情况下应该通过如上所述的回调来读取输入。然而如果你需要直接访问输入动作资产(Action Asset),你应该访问 PlayerInput 组件对动作的副本 ,而不是 InputSystem.actions。
这是因为 PlayerInput 组件会过滤设备以便为多名玩家自动分配设备,因此每个实例都有一份为对应玩家过滤后的动作副本。如果你通过直接读取 InputSystem.actions 来绕过这一步,自动设备分配将无法工作。
优缺点
与 不使用 PlayerInput 组件而直接使用动作 相比,此工作流既有优点也有缺点。由于它基于动作,因此它具备动作的所有优势,例如动作表(Action Map)、绑定(Binding),以及在输入动作编辑器(Input Actions editor)中配置它们的能力。你还可以实现 在运行时由用户重新绑定。
此工作流还允许你通过检视面板 UI 在编辑器中设置回调,这有时可以降低代码的复杂性,但也可能使调试变得更加困难,因为动作与代码之间的连接是在 Unity 编辑器中定义的。
在本地多人游戏时,它还提供了对 设备分配 和 分屏 的现成处理方案。虽然你确实可以自己手动实现这些方案,但使用此现成方案会更简单快捷。然而现成方案在某种程度上像一个“黑盒”,这也意味着你较难修改其工作方式。
与其他工作流一样,你需要在灵活性、简单性和实现速度之间需要进行权衡。
要开始使用此工作流,请 参阅 Player Input 组件的文档。