通过最新教程和示例项目《勇士》学习输入系统

借助Input System,您可以快速设置从移动平台到 VR 等多个平台的控件。通过我们为初学者和中级用户提供的示例项目和新视频教程开始学习。
输入是实现实时项目互动的核心。Unity 的 Input System 系统规范了实现控件的方式,并提供了新的高级功能。它已经过 Unity 2019 LTS 及更新版本的验证(有关支持的输入设备的完整列表,请参阅文档)。
我们的新教程内容可以帮助您快速入门,即使您是为多个平台进行开发的完全新手。如果您已经熟悉了工作流程,请通过我们的主要示例项目《勇士》进一步了解如何使用输入系统驱动(其他)Unity 工具,如 Cinemachine 或 Unity UI。
三月份的 "与开发人员见面 "环节解释了我们创建这一新系统的原因,其中包括一个演示,概述了设置 Localization Multiplayer、快速添加游戏手柄控制、生成新玩家以及实现移动控制的工作流程。Input System 的首席开发人员 Rene Damm 还回答了听众提出的有关工具和团队路线图的问题。
如果您是初学者,只是想了解 Unity 的基本输入工作流程,请查看Unity Learn 上更新的Roll-a-Ball 项目。它将指导你完成安装 Input System 软件包、添加播放器输入组件以及向播放器应用输入数据等第一步。


该项目围绕可在单人和 Multiplayer 模式中控制的角色展开。当游戏管理器设置为 Localization Multiplayer 时,它会实例化多个 Warrior prefab 实例。由于 "勇士 "预制件被设置为使用 Input System 的 "玩家输入 "组件,因此 "勇士 "的每个实例都将自动配对一个已连接的输入设备。
这款《勇士》的控制方案专为跨平台游戏而设置,可在键盘和不同游戏手柄之间自动切换。该设置提供了一个对原始运行时输入数据进行平滑处理的示例,这样,无论玩家使用哪种轴输入(键盘按键或游戏手柄操纵杆),角色的方向移动都是均匀的。下面的控制方案也是通过按键来实现基本的攻击动画。

勇士的输入操作资产还设置了两个不同的操作地图:一个用于控制角色(奔跑和攻击),另一个用于控制菜单的输入。游戏或任何其他互动项目通常都有不同的状态,这些状态具有不同的控制要求,但却共享相同的输入绑定。
例如,朝一个方向推动操纵杆,"勇士 "就会朝那个轴跑去。不过,当游戏暂停时,玩家可以使用操纵杆在暂停菜单中的不同可选按钮和选项之间进行导航。
使用 Input System,您可以轻松地为各种控制方案场景设置不同的动作映射,并在运行时通过简单的 API 在每个 PlayerInput 组件上进行切换:
playerInput.SwitchCurrentActionMap(stringForMapName);
一旦设置了与用户界面交互的 "动作映射",就可以将动作分配给事件系统的用户界面输入模块:

在 "勇士 "项目中,每个玩家都可以暂停游戏,并与暂停菜单互动。叠加用户界面由几个选项按钮和右侧的上下文变化面板组成。Input System UI 输入模块应用分配给与任何启用了可交互功能的Unity UI组件(如按钮和滑块)进行交互的操作。

这种用户界面交互将针对按下暂停键的特定玩家进行隔离。例如,如果玩家 3 暂停游戏,那么玩家 1 和玩家 2 将无法与游戏互动,只有玩家 3 可以控制游戏。当玩家 3 取消游戏暂停时,所有玩家的控制都会恢复。我们可以通过在 PlayerInput 组件上调用以下方法来实现这一目的:
playerInput.ActivateInput();
playerInput.DeactivateInput();
在用户界面菜单中,有一个用于运行时重新绑定控件的上下文面板。这样就可以对特定输入操作执行交互式重新绑定,并为其设置新的输入绑定。例如,在使用 PlayStation 控制器时,您可以将十字键上的攻击动作重新绑定到其他输入键上,如三角键或 R2 键。

该重新绑定作为重载应用于特定的 PlayerInput 组件。例如,玩家 2 可以将 "攻击 "按钮重新绑定到另一个按钮上,但这不会影响玩家 3 使用 "攻击 "输入操作。
用于设置交互式重新绑定的 API 还包含用于重新绑定完成后的操作。这样,在更新用户界面、保存游戏状态或根据此事件更改任何其他游戏元素时,就可以设置自己的控制。
private InputActionRebindingExtensions.RebindingOperation rebindOperation;
void StartInteractiveRebind()
{
rebindOperation = inputAction.PerformInteractiveRebinding().OnComplete(operation => RebindCompleted());
rebindOperation.Start();
}
void RebindCompleted()
{
rebindOperation.Dispose();
//Apply UI Changes (IE: New Binding Icon)
}
除了 Input System 与事件系统和 Unity UI 的集成之外,《勇士》项目还展示了如何将其设置为与Cinemachine 协同工作。第三人称游戏的典型摄像头设置是一个轨道跟踪摄像头,视角方向由鼠标位置或操纵杆推动方向设定。Cinemachine 输入提供程序组件可添加到 Cinemachine Free Look 摄像机装备中,它允许输入操作将 Vector 2 轴数据直接发送到 Cinemachine 的轴控制值中。在下图中,您可以看到 CinemachineInputProvider 正在使用来自 Look Input Action 的输入数据。

Input System 还包含各种 API,因此其他系统可以在运行时访问数据,这些数据可以显示在用户界面或其他视觉效果中。勇士队示例项目使用来自播放器输入的数据来显示当前播放器设备、播放器输入 ID 等信息,甚至更新当前绑定上基于 UI 的重新绑定控件。我们创建了一个自定义系统,它接收设备和绑定字符串并返回特定图标。
例如,如果玩家使用的是 Xbox 手柄,而 "攻击 "操作绑定到了北面的上下文按钮,则会显示一个 Y 按钮图标。不过,如果播放器使用键盘,则会显示当前绑定键盘键的字符串。欢迎您在自己的项目中提取并使用此设备显示配置器工具。

Input System 软件包还包含几个额外的示例,您可以在软件包管理器中查看。您可以将这些内容作为参考,并根据自己的项目进行扩展或调整。您还可以在那里找到官方文档,包括这份快速入门指南。
Input System 1.1目前正在预览中,它带来了大量修复和一些改进。现在,您可以将重新绑定保存和加载为 JSON 格式(请参阅 RebindSaveLoad.cs 示例脚本),而且现在可以对设备布局进行预编译,从而大大减少这些设备的实例化时间和垃圾收集 (GC) 堆成本。
我们希望该示例项目和其他学习材料能帮助您开始使用 Input System,将您的想法变为现实。请在下面的评论区分享您下一步想学的内容。此外,请关注输入系统页面,获取更多教程和其他资源。
