Unity3d_Rewired官方文档翻译:概念(二):InputBehaviour、Controllers、ControllerMaps

发布时间 2024-01-12 17:32:52作者: 尽头之外

仅翻译了官方文档中的Essentials(要点)、Concepts(概念)两部分,这是文档中最重要的部分,理解了这两部分的内容应该足以让你将Rewired运用到你的项目中,之后再去阅读文档的其他部分也能更容易理解。

斜体加下划线部分为添加的注解,非官方文档内容。若你发现有翻译、注解不正确的,请留言告知,以免再继续误导他人,感谢。

概念

Input Behaviours

Input Behaviour是一种修改器,能以多种方式影响Action的某些属性或更改其最终值。例如,Input Behaviour允许您设置数字轴模拟选项(灵敏度、重力等)、如何处理鼠标轴、应用控制器类型特定的灵敏度、设置按钮双击速度、设置按钮死区等。

每个Action总是分配一个Input Behaviour。如果有许多Action需要以相同的方式执行,则不必重复创建Input Behaviour,只需为每个动作分配相同的Input Behaviour即可。

创建/编辑Input Behaviour

你需要在Rewired Editor中创建和编辑Input Behaviour。

每个玩家,运行时可修改

在运行时,Input Behaviour都会被复制给每一个玩家。这样,如有必要,您就可以在运行时单独修改每个Player的Input Behaviour。此外,还可将Input Behaviour保存为 XML 并重新加载。更多信息,请参阅Modifying Input Behaviors during runtime

操纵杆轴灵敏度(Joystick Axis Sensitivity)

通过该功能可以更改特定Action或多个Action的操纵杆轴灵敏度。例如,可用于更改分配给Player的所有操纵杆的镜头转动灵敏度。

数字轴设置(Digital Axis Setting)

这些设置可将按钮和键盘按键视为轴,并返回-1 至 1 的值,而不是通常情况下的 "True "和 "False"。例如,当使用键盘进行移动控制时,这可以让角色的移动更加流畅。根据 "数字轴设置"(重力和灵敏度),动作的 GetAxis 值可随时间推移而平滑变化。

鼠标轴设置(Mouse Axis Settings)

Input Behaviour支持多种鼠标轴模式。

自定义控制器轴灵敏度(Custom Controller Axis Sensitivity)

通过该功能可以更改特定Action或多个Action的自定义控制器轴灵敏度。例如,可用于更改分配给Player的所有自定义控制器的镜头转动灵敏度。

按钮死区(Button Dead Zone)

如果你将轴映射为按钮,这将非常有用。

按钮双击速度(Button Double Press Speed)

如果需要检测双击,请设置双击速度并调用 player.GetButtonDoublePressDown 或 player.GetButtonDoublePressHold。

按钮重复(Button Repeating)

如果需要检测定期重复按下的按钮,可为这些事件设置重复率和可选延迟,然后调用button repeating method listed here]的其中一种按钮重复方法。

按钮短按和长按(Button Short and Long Press)

如果需要检测短按或长按,请为这些事件设置所需的时间和可选的过期时间,然后调用Short or Long Press methods listed here的短按或长按方法之一。

按钮按下缓冲器(Button Down Buffer)

这将使 player.GetButtonDown 在单帧之外的额外时间返回 TRUE。

Controller

Controller是一个虚拟对象,代表某种类型的物理或虚拟控制器。每个Controller对象都包含一个元素(按钮、轴等)列表,每个元素都代表控制器上的一个物理或虚拟元素。虽然您可以直接从Controller对象访问元素输入值,但在 Rewired 中一般没有必要这样做,因为您通常是通过 Rewired 基于Player的Action驱动输入系统来访问输入值的。

控制器类型

Rewired 中的控制器类型有

  • Joysticks
  • Keyboard
  • Mouse
  • Custom Controller

不同的控制器类型在Player确定输入值的方式上存在一些差异。

操纵杆(Joysticks)

操纵杆是最常见的控制器类型,包括大多数连接到系统的外部非鼠标、非键盘 USB 或蓝牙输入外设。(Rewired 无法将某些特殊类型的设备视为游戏杆)。游戏杆的形式多种多样,如游戏手柄、飞行摇杆、方向盘、平衡板等。

当控制器连接到系统时,Rewired 会尝试识别该控制器并加载硬件定义。如果找到了硬件定义,它将具有人类可读的元素名称、标准化的轴方向,并可在 Rewired Editor中为其创建默认映射,这样玩家就可以直接连接并使用,甚至还可能与Controller Template兼容,以实现更快的映射。有关已识别控制器的更多信息,请参阅Supported Controllers。对于所有其他未识别的控制器,请参阅see this for more information

操纵杆分配

要在 Rewired 基于Player的系统中使用操纵杆,首先必须为控制操纵杆的Player分配操纵杆。一旦将操纵杆分配给Player,Rewired 将尝试从Input Manager中为该特定操纵杆分配给Player的默认值中加载任何操纵杆映射。

然后,Player在计算其输入Action的值时,会将该操纵杆作为输入源之一,前提是Player也有一个或多个将操纵杆元素映射到Action的 "操纵杆映射"。一个Player可以分配任意数量的操纵杆,也可以在任意数量的Player之间共享操纵杆(这种情况很少见)。

操纵杆可以通过脚本从Player身上分配和移除,但更常见的做法是让 Rewired 自动为Player分配操纵杆。

操纵杆自动分配

默认情况下,操纵杆将根据 "Rewired Editor - Setting"页面中的"Joystick Auto-Assignment"设置自动分配给Player(System Player除外)。通过这些设置,您可以根据游戏需要更改操纵杆自动分配给Player的各种选项。如果希望通过脚本手动分配操纵杆,可以禁用操纵杆自动分配功能。每个Player还可以通过Rewired Editor或脚本有选择地禁用操纵杆自动分配功能。

注意:一个常见问题是,当你连接了多个控制器,并希望单个Player能够使用任何一个已连接的控制器时。根据默认设置,Rewired 将只为每个Player分配一个控制器。为了允许为同一Player自动分配多个手柄,必须将 "每个玩家的最大手柄数"(Max Joysticks Per Player)设置为大于 1 的值。 所有这些设置都是可配置的,并对其功能进行了说明。

操纵杆链接和断开事件

您可以通过使用事件来检测手柄何时连接或断开。

键盘(Keyboard)

键盘在许多方面的工作原理与操纵杆杆类似,但也有一些明显的不同之处:

  • 目前,Rewired 只支持一个通用键盘。连接到系统上的多个键盘只能作为一个键盘使用。
  • 键盘不发送连接/断开事件。

键盘分配

与操纵杆类似,键盘必须先分配给Player,Player才能使用它进行输入。不过,将键盘分配给Player的方法与操纵杆不同。

要允许Player在游戏开始时使用键盘,应确保在 "Rewired Editor - Player"页面选中 "开始时分配键盘"(Assign Keyboard on Start)。(默认情况下,键盘会在游戏开始时分配给所有Player)。

通过脚本手动分配键盘:

  • player.controllers.hasKeyboard - 设置为 "True",让Player可以使用键盘。

键盘映射

与操纵杆一样,Player只有在分配了一个或多个启用的键盘映射后,才能返回键盘按键的输入值。

鼠标(Mouse)

鼠标在许多方面的工作原理与操纵杆类似,但也有一些明显的不同之处:

  • 目前,Rewired 只支持一个通用鼠标。连接到系统上的多个鼠标只能作为一个鼠标使用。
  • 鼠标不会发送连接/断开事件。

鼠标分配

与操纵杆类似,鼠标必须先分配给Player,Player才能使用它进行输入。不过,将鼠标分配给玩家的方法与操纵杆不同。

要允许玩家在游戏开始时使用鼠标,应在 "Rewired Editor - Player"页面勾选 "开始时分配鼠标"(Assign Mouse on Start)。

通过脚本手动分配鼠标:

  • player.controllers.hasMouse - 设置为 "True "可让Player使用鼠标。

鼠标映射

与操纵杆和键盘一样,只有在分配了一个或多个启用的鼠标映射后,Player才能返回鼠标输入的输入值。

启用/禁用

所有控制器都可以通过脚本设置 Controller.enabled 属性来启用或禁用。禁用的控制器不会生成任何输入。

Controller Maps

控制器映射系统是 Rewired 最独特、最强大的功能之一。

控制器映射表是单个控制器中的元素与Action之间的绑定映射表。

控制器映射归Player而非Controller对象所有,因此更改一个Player的映射不会影响其他Player的映射,即使他们使用的是同一个控制器。分配给Player的每个控制器都必须有自己的控制器映射,并定义了绑定,这样基于Action的输入才能发挥作用。

您可以为已知控制器类型和Controller Template创建预定义控制器映射配置,并在运行时或分配兼容的操纵杆时加载映射。控制器的预定义映射是在 Rewired Editor中创建的。

如果创建了用户控制分配界面,用户就可以为任何操纵杆或控制器自定义控制器映射。(有关信息,请参阅Creating a Controller Mapping screen)。

多个映射表是可以共存的,因此您可以根据需要为每个控制器设置多个映射表。举个例子:如果您有多种游戏模式(如步兵、坦克、飞机),您可以在一张映射表上设置通用控制,并在各自的映射表上设置特定模式的控制。根据需要,您还可以拥有更多映射表:在菜单中使用菜单映射表,在保存/加载和退出等控制中使用系统映射表,在键盘上为不同Player使用多个映射表【应该是类似使用一个键盘游玩本地多人合作游戏,最早玩真三国无双5时就是一个键盘一人用一边】,等等。所有映射表都可以同时存在,并可根据需要启用或禁用,例如在更改游戏模式时。

共享控制器(例如键盘)可由任意数量的Player使用任意数量的映射表进行映射。

映射表可以保存为XML和JSON格式的文件。

每个控制器映射属于一个映射表类别(Map Category)和一个布局(Layout)。在Rewired Editor中或从 API 中选择控制器映射表时,两者的组合可用于识别控制器映射表。

分配/加载控制器映射

在Input Manager中创建控制器映射(操纵杆映射、键盘映射等)时,您将定义一个默认映射,可供任何Player使用。要让某个Player使用控制器映射,必须先将其分配给该Player并启用。您可以在"Rewired Editor - Player"页面中分配控制器映射表,当游戏启动,Rewired初始化时,它将把映射表加载到Player中。您也可以通过脚本在运行时分配/加载控制器映射。

启用/禁用控制器映射

控制器映射可通过脚本随意启用或禁用。如果您想改变游戏模式,并启用不同的控制,这将非常有用。例如,打开菜单界面。当Player查询动作的输入值时,禁用的控制器映射不会返回任何值。控制器映射存储在Player类中。

控制器映射必须处于启用状态,才能被处理并有助于输入。可在"Rewired Editor - Player"页面中设置分配的游戏开始时加载的映射的起始启用状态。

每个控制器映射中的单个Action->元素映射(动作绑定)也可通过脚本启用或禁用。

操纵杆映射

当控制器(不包括鼠标和键盘)连接到系统时,Rewired 会尝试识别该控制器并加载硬件定义。当操纵杆分配给Player时,如果已在 Rewired 输入管理器中创建了与该操纵杆兼容的操纵杆映射,则会将操纵杆映射加载到Player中。

如果想让玩家插入控制器就能 "正常工作",则应为每个要明确支持的控制器创建一个操纵杆映射。为了节省时间,您可以为Controller Template创建一个操纵杆映射,其中包括您希望支持的控制器。

Player返回的操纵杆输入由分配给Player的一个或多个操纵杆映射中与Action绑定的按钮和轴决定。当激活绑定到Action的按钮或轴时,Player将返回该Action的值。您可以在Rewired Editor中创建这些映射,并将其分配给每个Player,它们将在启动时加载。您还可以在运行时启用、禁用、移除、添加、加载和保存操纵杆映射。

操纵杆必须分配给一个Player,在该Player中至少有一个具有有效按钮/轴映射的操纵杆映射,并在通过Player返回任何输入之前启用。

操纵杆映射是如何加载的

特定操纵杆的映射不存在于Player中,除非该操纵杆当前已连接并分配给该Player。默认情况下,Rewired 会在检测到操纵杆时自动为每个Player分配操纵杆。在分配时,会根据 "Rewired Editor - Player"页面中为特定Player定义的设置加载操纵杆映射。

键盘映射

Player返回的键盘输入由分配给Player的一个或多个键盘映射中绑定到Action的按键决定。当按下与Action绑定的键时,Player将返回该Action的值。您可以在Rewired Editor中创建这些映射,并将其分配给每个Player,这些映射将在启动时加载。您还可以在运行时启用、禁用、删除、添加、加载和保存键盘映射。

键盘与操纵杆类似,必须先将其分配给Player,然后才能接收来自它的输入。(这可以在Rewired Editor中或通过 player.controllers.hasKeyboard 属性进行设置)。

鼠标映射

Player返回的鼠标输入由绑定到分配给Player的一个或多个鼠标映射中的Action的轴和按钮决定。当与Action绑定的按钮或轴被激活时,Player将返回该Action的值。你可以在 Rewired Editor中创建这些映射,并将其分配给每个播放器,它们将在启动时加载。您还可以在运行时启用、禁用、移除、添加、加载和保存鼠标映射。

鼠标与操纵杆类似,必须先将其分配给一个播放器,然后才能从中接收输入。(这可以在重接线输入管理器中或通过 player.controllers.hasMouse 属性进行设置)。

Controller Template

Controller Template代表一种通用的控制器布局,适用于所有兼容的控制器,为这些控制器提供了一个通用的工作界面。为Controller Template创建映射后,任何实现该模板的控制器都将自动继承该映射,而无需专门为该控制器创建映射。例如,Rewired 附带一个游戏手柄模板。当你为该游戏手柄模板创建映射时,你无需再为本页所列的任何游戏手柄创建单独的映射,因为游戏手柄模板已涵盖了所有这些手柄。这样就能更快地为各种控制器创建预定义的控制器映射。此外,如果将来模板中添加了更多控制器,您已创建的地图也将适用于这些新控制器。

无模板的控制器

对于目前没有Controller Template的其他控制器,你必须为每个控制器创建一个映射,以便开箱即支持(这意味着你不希望用户在玩之前手动映射它们)。如果不创建映射,但又希望用户能使用该控制器,则必须制作一个重映射界面,让用户可以手动映射其控制器(更多信息请参阅Creating a Controller Mapping Screen)。

未知控制器(仅限操纵杆)

对于无法识别的控制器(supported controllers此处未列出的控制器),Rewired 将使用未知控制器映射(无论您是否为此定义了映射)。这是一个通用映射,只是一个轴和按钮的顺序列表,每个轴和按钮都按照控制器硬件定义的顺序与控制器上的轴和按钮相对应。您应始终为用户提供重新映射控制器的方法,以便他们可以按照自己的喜好设置未知控制器。

请注意,即使控制器对 Rewired 来说是未知的,但已保存的映射数据仍可针对这些控制器进行保存和加载。这意味着,如果用户为未识别的控制器自定义了控制器映射,他们仍可保存配置,并在退出和重启游戏后继续使用相同的控制器布局。控制器数据的所有保存和加载均由开发人员来实现。

建议您创建未知控制器映射,这样未识别的控制器至少可以在一定程度上立即工作,而无需用户手动映射。虽然您无法知道用户插入的控制器上的哪个轴或按钮对应哪个元素,下表显示了未知游戏手柄最常见的布局:

Controller Element Maps To
Left Stick X Axis 0
Left Stick Y Axis 1 (inverted)
Right Stick X Axis 2
Right Stick Y Axis 3 (inverted)
Buttons Button 0-X
D-Pad (optional) Hat 1

在Windows Standalone和Windows App Store上使用XInput兼容游戏手柄的特别注意事项

在 Windows Standalone和 Windows Unity 编辑器中,启用 "Use XInput"(禁用 "Use Windows Gaming Input")后,以及在 Windows App Store和 Windows 10 Universal中,Rewired会对所有兼容 XInput 的控制器使用 XInput,而不是所选的主输入源。这对创建操纵杆映射有一定影响:

使用 XInput 时,Rewired 无法确定实际控制器类型,因为 XInput 无法提供该信息。Rewired 唯一能识别控制器的信息就是它与 XInput 兼容。因此,所有 XInput 设备都被视为 "XBox 360 控制器"。这意味着,在启用使用 XInput 的情况下,如果你插入一个 XBox One 控制器,Rewired 无法识别这是一个 XBox One 控制器,也无法加载你专门为 XBox One 控制器创建的操纵杆映射。相反,它只会将其识别为 "XInput 游戏手柄",并从你创建的 XBox 360 控制器映射中加载操纵杆映射。这是 XInput 固有的限制。

与 XInput 相比,Windows Gaming Input 的限制更少、功能更多,而且可以独立识别 Xbox 360 和 Xbox One 控制器,因此建议使用 Windows Gaming Input 而不是 XInput。

但由于Rewired的游戏手柄模板与这些控制器兼容,因此最简单的方法就是创建一个游戏手柄模板操纵杆映射,启用 "Use XInput "或 "Use Windows Gaming Input"后,它将适用于任何 XInput 设备。这样,你就不必担心要为 XBox 360 控制器、XBox One 控制器等分别制作映射,一切都能正常使用。这也适用于跨平台。

在 iOS、tvOS 和 OSX 上使用 MFI 游戏手柄的特别注意事项

Rewired 支持 iOS、tvOS 和 OSX 上的许多 MFI 游戏手柄。不过,这些平台识别控制器的方式不同,因此会影响加载哪些操纵杆映射。

iOS/tvOS

所有兼容 MFI 的游戏手柄都会被简单识别为 "iOS MFI Gamepad",并将加载您创建的 "iOS MFI Gamepad "操纵杆映射(如果有的话)。支持所有 MFI 游戏手柄。为特定控制器(如 赛睿 Nimbus)创建的操纵杆映射将不会加载,也不适用于 iOS/tvOS。

OSX

如果启用了 "Use Game Controller Framework"(使用游戏控制器框架)或主输入源设置为 "Game Controller"(游戏控制器),所有符合游戏控制器框架 "Extended Gamepad"(扩展游戏手柄)配置文件的游戏手柄(有特定定义的除外)都将被识别为 "iOS MFI Gamepad",并将加载 "iOS MFI Gamepad"操纵杆映射。具有特定定义的控制器将不使用 "iOS MFI Gamepad "定义,而是使用特定的控制器定义。具有特定定义的控制器包括 Xbox 控制器、索尼 Dual Shock 4 和索尼 Dual Sense 控制器。

如果禁用了 "Use Game Controller Framework"(使用游戏控制器框架),或正在使用不支持游戏控制器框架的主输入源,则无法自动识别 MFI 兼容游戏手柄,只能像 OSX 上的其他控制器一样进行单独识别。将加载为特定控制器创建的操纵杆映射,如 赛睿 Nimbus。为 "iOS MFI 游戏手柄 "创建的操纵杆映射不会在 OSX 上加载。

为了覆盖所有支持的 MFI 和其他游戏手柄,只需为游戏手柄模板创建操纵杆映射,它们就能跨平台使用。通过使用该模板,您不必担心任何这些特定平台的问题。

控制器映射如何处理输入

该图说明了Player类如何将从控制器接收的输入映射到Action。本图展示了可以使用 Rewired 创建的更高级输入方案的一个示例。

本图中的映射基于一种输入方案,允许您在各种游戏模式之间切换。任何时候都只有一种游戏模式处于活动状态。这样做的目的是允许根据游戏的当前状态设置不同的控制集。例如,当用户打开菜单时,游戏模式将变为菜单模式,所有在菜单模式下不再有效的地图控制将被禁用。这可以通过使用 "映射表类别(Map Categories)"来实现。

  • GamePlay Shared:代表所有游戏模式通用的控制:步兵、车辆和飞机。其中可能包括 "开火 "等操作。
  • Vehicle:表示车辆控制的特定控制。
  • System:表示系统控制,如切换到菜单模式、保存、加载、暂停等。

在本例中,当前游戏模式为 "车辆",因此只有 "车辆"、"游戏共享 "和 "系统 "类别中的映射当前处于活动状态。

下面两张图展示了Player中的控制器映射如何处理源控制器元素的输入,并将结果返回给调用脚本。请注意,某些控制器映射被禁用,而其他控制器映射则被启用(禁用的映射显示为灰色)。禁用控制器映射时,输入不会通过。

该图更详细地显示了Player、Controller、控制器映射、Action->元素映射、控制器元素和Action之间的关系。具体来说,它显示了控制器映射中的单个动作元素映射是如何将动作绑定到控制器元素的。