Unity3d_Rewired官方文档翻译:要点(一):安装、快速开始、基础用法、部署、最佳做法

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

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

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

官方文档地址

要点

安装

Rewired 的安装程序简单易用,会一步步引导你完成安装过程。安装程序应在安装Rewired Package后自动运行,但如果没有自动运行,或者你想在某个时候再次运行,可以从菜单启动安装程序:Window -> Rewired -> Setup -> Run Installer

在安装过程中,会发生一些情况:

  1. Rewired.InputManager 脚本将被添加到脚本执行顺序中,并设置为 -32000,因此它将在其他脚本之前运行。这一点非常重要,不应更改。
  2. YourProjectFolder/ProjectSettings 中的 Unity InputManager.asset 文件将添加新的设置,其中包含 Rewired 所需的所有手柄和鼠标按钮以及轴。这对于使用 Unity 输入系统的平台(如 Webplayer、Android、iOS 等)是必需的。重要提示:如果您已在 Unity 的输入管理器中创建了自定义条目,这些条目将不会被Rewired覆盖,您的原始 InputManager.asset 文件将被备份到安装程序窗口中显示的位置。
  3. 一些包含Rewired Editor必要数据的文件将在 Rewired/Data 中创建。
    安装完成后,即可开始使用 Rewired。

依赖项

Windows

可能需要安装某些依赖项,具体取决于 Windows 版本和所选输入源。有关详情,请参阅部署。

Unity 4.x 上的直接输入(仅限 Unity 4.x,不适用于其他版本的 Unity):
免费版的 Unity 4.x 不支持本地插件。在 Windows Standalone平台上使用直接输入(可选)作为主要输入源需要本地插件。如果要使用直接输入,则需要手动将 Assets/Plugins/x86/Rewired_DirectInput.dll 文件中的 DLL 复制到项目根文件夹(Assets 文件夹上方)。有关构建后所需步骤的其他说明,请参阅部署。

OSX

如需 Xbox 360 控制器支持,请安装this driver驱动程序(包括 XBox One 控制器支持)。

SDL2

如果在任何平台上使用 SDL2 作为输入源,则必须为编辑器和构建程序安装相应的 SDL2 库。您可能还需要在最终软件包中包含 SDL2 库。有关详细信息,请参阅部署。

特殊平台的设置

少数平台需要特殊设置步骤才能运行。有关详细信息,请参阅Special Platform Support

快速开始

本指南将向您介绍如何创建Input Manager并为单人游戏设置基本输入。

  1. 安装Rewired。
  2. 从菜单中在场景中创建Input Manager:
    Window -> Rewired -> Create -> Input Manager(in scene)。

  1. 在Hierarchy视图中选中创建的Rewired Input Manager物体。

  1. 在Inspector视图中,点击“Lunch Rewired Editor”

  1. 在 Rewired Editor 窗口顶部的导航栏中,点击 "Players"。

  1. 您必须至少有一个Player才能使用输入法。单击 "玩Players "框下方的 "New "按钮添加Player。

  1. 稍后我们将回到 "Players "部分来分配控制器映射,但首先需要创建一些Action。单击导航栏中的 "Actions "按钮,然后单击操作框下方的 "New "按钮创建一个新Action。【Action是一个抽象概念,代表游戏中需要通过输入来实现的行为,例如:射击、向前移动、跳跃、蹲下、拾取等。它本身和输入按键没有任何联系,你可以将这个行为映射到任何你想要的按键上。

  1. 为游戏所需的每个输入创建一个Action。如下图所示,创建几个Action。所选Action的属性可在右侧 "Properties "下的字段中编辑。对于移动操作,将类型更改为 "轴(Axis)"。您可以为每个Action赋予一个名称(Name)、一个描述性名称(Descriptive Name),如果类型为轴,还可以赋予一个正名(Positive Name)和一个负名(Negative Name)。将鼠标悬停在每个属性标签上,可查看该属性的描述。

    注意:可以通过先创建动作类别(Action Categories)(或随后移动到类别中)来对Action进行分类,但为了使本示例保持简洁,我们将所有Action都保留在默认类别中。

  1. 每个Action都可以分配一个输入行为(Input Behaviour),它决定键盘按键、按钮和鼠标轴的行为方式。默认情况下,所有Action都分配了 "默认(Default) "输入行为。如果想调整任何设置或创建新的输入行为,请单击导航栏中的 "Input Behaviours "按钮。将鼠标悬停在每个属性标签上,即可查看说明。在本指南中,我们将保持默认行为不变。

  1. 现在让我们创建一个操纵杆映射。点击导航栏中的 "Joystick Maps"。

  1. 您可以为任何一个完全支持的控制器单独创建映射,或者为了节省时间,只需为"游戏手柄模板([T] Gamepad Template)"创建一个地图,所有使用该模板的控制器都会自动为其创建映射。(选择"[T] Gamepad Template",然后点击 "Create Map"。

  1. 现在,你需要创建元素并为其分配Action。点击 "元素(Element) "框下的 "New",创建一个元素。右侧将显示所选元素的 "元素属性(ELement Properties)"。单击属性栏的 "元素(Element)"下拉菜单,分配一个操纵杆元素。在 "动作(Action) "列表中选择一个要分配给该元素的Action。为步骤 8 中创建的每个Action创建一个元素,并为每个元素分配一个Action。【一个元素就代表着一个按键,例如键盘上的“W”、“A”键;鼠标上的左键、右键;XBox手柄上的“X”、“Y”键;PS手柄上的“△”、“口”键等。选择你需要的按键后就可以为其必定一个Action行为

  1. 现在我们将做同样的事情,只不过这次是针对键盘。点击导航栏中的 "Keyboard Maps",点击 "Create Map "创建映射,然后点击 "Element "框下方的 "New "按钮创建一些元素。像上面的操纵杆映射一样,为每个元素分配Action。对于使用坐标轴的移动操作,由于键盘按键的作用类似于按钮而非轴,因此将使用 "Axis Contribution "设置来确定按键对最终轴的贡献是正值还是负值。例如,如果 "W "键应向上移动字符,则Action应设置为 "垂直移动(Move Vertical)","Axis Contribution "应为 "正值(Positive)"。如果 "S "键应向下移动字符,则Action也应为 "垂直移动(Move Vertical)",但 "轴贡献值 "应为 "负值(Negative)"。

  1. 如果要创建鼠标映射,重复上述键盘和操纵杆的相同步骤,但这次要点击导航栏中的 "Mouse Maps"。

  1. 现在我们已经创建了操纵杆、鼠标和键盘映射,需要将它们分配给Player。单击导航栏中的 "Players "页面,选择要为其分配映射的Player。

  1. 点击 "Add Joystick Map "按钮,为玩家分配一个操纵杆映射。如果要分配多个操纵杆映射,可以根据需要添加。在本演示中,只需添加上面创建的映射即可。要选择不同的操纵杆映射,请更改 "Categories "和 "Layout "下拉菜单。确保勾选上 "Start Enabled(开始时启用)",这样该操纵杆映射将默认处于活动状态。游戏开始时,如果有任何操纵杆分配给该Player,它将为该操纵杆加载适当的映射。

  1. 对已创建的键盘映射也执行同样操作。注意:对于键盘控制,请确保勾选上 "Assign Keyboard on Start(启动时分配键盘)"复选框,否则将不会为Player分配键盘,除非通过脚本手动分配。

  1. 鼠标映射也是如此。注意:对于鼠标控制,确保勾选上 "Assign Mouse on Start(启动时分配鼠标)"复选框,否则将不会为Player分配鼠标,除非通过脚本手动分配。

  1. 关闭 Rewired Editor并保存场景。

  2. 现在你需要创建一个脚本来处理角色的输入。由于脚本可能会根据你制作的游戏类型而有很大不同,因此本示例将只展示如何从Rewired中获取输入的基本方法。

  3. 在项目中创建一个新脚本,例如 MyCharacter.cs,并将脚本附加到角色游戏对象上。

注意:此示例并非用于您的项目中。它的作用只是教你如何从Player那里获取输入。您必须编写自己的脚本,以便在场景中移动角色/对象。

// MyCharacter.cs - A simple example showing how to get input from Rewired.Player

using UnityEngine;
using System.Collections;
using Rewired;

[RequireComponent(typeof(CharacterController))]
public class MyCharacter : MonoBehaviour {

    // The Rewired player id of this character
    public int playerId = 0;
    
    // The movement speed of this character
    public float moveSpeed = 3.0f;
    
    // The bullet speed
    public float bulletSpeed = 15.0f;
    
    // Assign a prefab to this in the inspector.
    // The prefab must have a Rigidbody component on it in order to work.
    public GameObject bulletPrefab;

    private Player player; // The Rewired Player
    private CharacterController cc;
    private Vector3 moveVector;
    private bool fire;

    void Awake() {
        // Get the Rewired Player object for this player and keep it for the duration of the character's lifetime
        player = ReInput.players.GetPlayer(playerId);

        // Get the character controller
        cc = GetComponent<CharacterController>();
    }

    void Update () {
        GetInput();
        ProcessInput();
    }

    private void GetInput() {
        // Get the input from the Rewired Player. All controllers that the Player owns will contribute, so it doesn't matter
        // whether the input is coming from a joystick, the keyboard, mouse, or a custom controller.

        moveVector.x = player.GetAxis("Move Horizontal"); // get input by name or action id
        moveVector.y = player.GetAxis("Move Vertical");
        fire = player.GetButtonDown("Fire");
    }

    private void ProcessInput() {
        // Process movement
        if(moveVector.x != 0.0f || moveVector.y != 0.0f) {
            cc.Move(moveVector * moveSpeed * Time.deltaTime);
        }

        // Process fire
        if(fire) {
            GameObject bullet = (GameObject)Instantiate(bulletPrefab, transform.position + transform.right, transform.rotation);
            bullet.GetComponent<Rigidbody>().AddForce(transform.right * bulletSpeed, ForceMode.VelocityChange);
        }
    }
}
  1. 大功告成!你已经学会了如何使用 Rewired 为单人游戏设置基本输入。Rewired 还有更多强大功能,因此请务必阅读其余文档,了解更多高级主题。

基本用法

要通过脚本访问 Rewired 类,请在脚本顶部添加以下一行,这样就不必每次都键入 Rewired 命名空间了:

C#:

using Rewired;

Javascript(在任何 #pragma 语句下面添加)

import Rewired;

Boo

import Rewired

最重要的类

Rewired.ReInput - 主要的静态输入类。可访问Player、Controller等。

Rewired.Player - 通过Player访问输入。

如需了解更多重要类,请参阅Important Classes

有关类的完整列表,请参阅API Reference

"Id "不是 "Index"

在 API 中使用的任何 Id 都是唯一 ID,而不是索引,不能用于遍历项目或获取第一个操纵杆。

调试和故障排除

调试和故障排除最重要的工具就是Debug Information

部署

依赖

Windows Standalone

可选:如果使用 XInput 或 Direct Input,则可能需要安装 Microsoft 的 DirectX End-user Runtimes (June 2010)。您应在游戏安装程序中包含该运行时。如果只使用原始输入(Raw Input)或 Unity 输入,则无需安装。

如果启用了 XInput,只要系统中安装了这些版本的 XInput,Rewired 就能使用它们:

XInput_1_4.dll
XInput_1_3.dll
XInput_1_2.dll
XInput_1_1.dll
XInput_9_1_0.dll

Windows Vista、Windows 7、Windows 8 和 Windows 10 都预装了 XInput 版本。

如果使用直接输入(Direct Input),则必须安装 Visual Studio 2015、2017 和 2019 的 Visual C++ Redistributable

SDL2

如果在任何平台上使用 SDL2 作为输入源(可选),则必须在构建包中包含相应的 SDL2 库,除非您知道目标操作系统已经提供了该库(例如:SteamOS)。您所包含的库以及将其放置在软件包中的位置取决于目标平台和体系结构。如果未包含 SDL2 库,将导致记录错误,输入将退回到 Unity 输入作为输入源。

Windows 和 OSX 的最新库可从SDL2 website获取。

Windows

Unity 5.x+ 不需要特殊操作。

Unity 4.x 上使用的直接输入(Direct Input):
Unity 4.x 免费版不支持本地插件。在 Windows Standalone上使用直接输入(可选)作为主要输入源需要本机插件。如果要使用直接输入,您需要手动将 Assets/Plugins/x86/Rewired_DirectInput.dll 文件中的 DLL 复制到项目根目录(Assets 文件夹上方)。完成构建后,您需要根据所选架构(x86 或 x64)将相应的 Rewired_DirectInput.dll 文件复制到构建文件夹内名为 Plugins 的文件夹中。这是一个绕过 Unity 4.x 原生插件限制的黑客程序。Unity 5.x+ 则不需要此功能。

OSX:SDL2 网站不包含 SDL2 捆绑包,如果要在 Unity 项目的 Plugins 文件夹中包含本地 OSX 库,Unity 需要使用 SDL2 捆绑包格式。您必须手动构建捆绑包,或使用 Rewired 附带的捆绑包。

Linux:要在游戏构建中包含 SDL,必须将 libSDL2-2.0.so.0 文件放在与可执行游戏文件相同的位置。将该库放在 Plugins、Plugins/x86、Plugins/x86_64 或 Mono 或其子目录下的数据文件夹中将不起作用。对于 32 位版本,必须将库复制到 Plugins/x86 文件夹中;对于 64 位版本,必须将库复制到 Plugins/x86_64 文件夹中。

Rewired 包含为每个平台预制的 SDL2 库,但必须通过菜单选项手动安装:

  • Window -> Rewired -> Setup -> Install Libraries -> SDL2

对于 Linux,安装上述库后,可以从 Assets/Plugins/x86 或 Assets/Plugins/x86_64 文件夹中复制 libSDL2-2.0.so.0 文件。Unity 会在构建时自动将 Windows 和 OSX 库复制到正确位置。

注意:Unity 4.x 免费版官方不允许包含本地库,而 Unity 5+ 则允许。Unity 4.x 有一些变通方法,包括将库放在编辑器项目的根文件夹中,然后手动将库复制到最终的游戏构建中。具体步骤取决于您的目标平台。您可以在 Unity 论坛上搜索相关资源。或联系技术支持contact support获取更多信息。

最佳做法

Input Manager

  • 将Input Manager创建为预制体,并使用Rewired Initializer管理所有场景中Input Manager预制体的实例化。

控制器映射

  • 始终为Gamepad Template制作映射。绝大多数使用控制器的玩家都会使用游戏手柄。为了节省时间,为Gamepad Template创建映射,Rewired 可识别的所有游戏手柄都能正常工作。
  • 始终为未知控制器制作映射。如果玩家使用的控制器无法识别,他们至少可以在不手动映射的情况下进行某种输入。有关更多信息和推荐的映射指南,请参阅Please see this for more information and recommended mapping guidelines
  • 始终为用户提供一些重新映射控制器的方法。由于制造商的不良行为(Can you/I add support for this controller?),许多控制器无法被 Rewired 识别。为了正确支持这些控制器并为用户提供最佳体验,您必须为他们提供重新映射控制器的方法。您可以直接在游戏中加入Control Mapper,也可以创建自己的控制器重映射系统(create your own control remapping system)

控制器分配

  • 一定要为用户提供一些更改控制器分配的方法。这一点在制作多人游戏时尤为重要。你不可能知道用户的系统中会出现哪些物理或虚拟设备,在 Rewired 中显示为操纵杆并分配给玩家。设备仿真软件(VJoy、DS4Win、SCPToolkit 等)和某些设备驱动程序可能会创建额外的、无法使用的虚拟设备,而且经常会造成问题。允许用户自己分配控制器可以解决这个问题,还可以让用户交换控制器等。您可以直接在游戏中加入Control Mapper,也可以创建自己的控制器重映射系统(create your own control remapping system)
  • 如果您的游戏是单人游戏:将 "Max Joysticks Per Player(每个玩家最大操纵杆数)"设置为 100,这样玩家就可以使用系统上的所有控制器。

Windows Standalone平台

  • 始终启用 "Use Windows Gaming Input"+"Use XInput"。Windows Gaming Input可与所有兼容 XInput 的控制器(如 Xbox 控制器和Xbox的克隆控制器)通用。它还提供振动支持,包括触发器振动、独立触发值以及同时支持 4 个以上控制器的所有特殊功能。启用 "Use XInput "后,还可在不支持 Windows Gaming Input 的旧系统上使用 XInput。唯一的例外情况是,如果你的游戏需要同时支持 4 个以上的 XBox 控制器(XInput 的限制是 4 个),在这种情况下,可以禁用使用 XInput,以便在系统无法使用 Windows Gaming Input 时使用 Raw Input 作为后备,以同时支持 4 个以上的 XBox 控制器。

Steam