跳转至

译注:相关链接尚未完善,访问时可能遭遇 404,你可以先 查看原文

工作流概述 - 动作与 PlayerInput(玩家输入)组件

Workflow-PlayerInput.png

输入系统(Input System)中最高级别的抽象是将 动作Player Input 组件结合起来。

你可以通过 Player Input 组件来配置动作,并与你自己的 MonoBehaviour 脚本中的 C# 方法相连接,当在用户输入时会自动调用你指定的 C# 方法。

你可以在检视面板(Inspector)UI 中设置这些事件驱动的连接,而不是像 上文中的工作流示例 那样,编写代码来轮询动作的值。

PlayerInput 组件也可以用于本地多人游戏。你可以将 PlayerInput 组件与 PlayerInputManager(玩家输入管理器)组件一起使用,当新的输入设备上触发输入时会自动实例化新玩家。例如,如果你正在制作一款四人本地合作游戏,结合使用 PlayerInput 和 PlayerInputManager 两个组件之后,新玩家只要按下控制器上的开始按钮即可自动加入游戏。

PlayerInputWithGameplayEvents.png

在上面的示例图片中,你可以看到 PlayerInput 组件已设置为通过 Unity 事件将“move”和“jump”动作映射到脚本中的 OnMoveOnJump 方法。

下面这个示例脚本实现了这些方法:

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 组件的文档