当前位置:   article > 正文

使用新的输入系统在 Unity 中构建第三人称控制器_unity第三人称控制器

unity第三人称控制器

如果你随机挑选几款游戏,每款游戏可能会有不同的艺术风格和机制、不同的故事,甚至根本没有故事,但它们都有一个共同点:所有游戏都需要读取和处理输入来自键盘、鼠标、游戏手柄、操纵杆、VR 控制器等设备。

构建第三人称控制器。 在这篇文章中,我将向您展示如何在 Unity 中使用新的Input System 驱动的跟随摄像头 Cinemachine 软件包以及由 Unity Technologies 的另一个强大软件包

我们的第三人称控制器将处理来自键盘和鼠标以及标准游戏手柄的输入,并且由于 Unity 中的新输入系统非常智能,您很快就会看到,添加对另一个输入设备的支持不需要任何额外的代码.

最重要的是,您将看到如何设置空闲、奔跑、跳跃和跌倒动画,以及如何在它们之间平滑过渡。 我们将把控制器的核心实现为状态机,重点是干净的架构和可扩展性。

如果您以前从未听说过状态机或 状态 设计模式,请不要担心,我将逐步解释所有内容。 但是,我假设您对 C# 和 OOP 概念(如 继承 和 抽象 类)有基本的了解。

在本文结束时,您将能够轻松地使用您自己的状态扩展我们的控制器,并且您将掌握一种设计模式,您会发现它在许多不同的上下文中都很有用。

说到设计模式,除了状态模式,我们还会使用另一种,在游戏开发中非常常见,如果不是最常见的话: 观察者 模式。

旧版与新版 Unity 输入系统

在我们开始构建我们的播放器控制器之前,让我们简单谈谈新旧 Unity 输入系统之间的区别。 我不会重复您可以在文档中阅读的内容,而是强调主要区别。

如果您以前使用过 Unity,您可能已经知道如何使用旧的输入系统。 当您希望仅在按下给定键时每帧执行一些代码时,您可以这样做:


超过 20 万开发人员使用 LogRocket 来创造更好的数字体验 了解更多 →


void Update()
{
  if (Input.GetKeyDown(KeyCode.Space)) 
  { 
    // Code executed every frame when Space is pressed
  }
}

中将键和轴与名称绑定来使其更好一点 您可以通过在Project Settings > Input Manager ,然后像这样编写脚本:

{ 
  if (Input.GetKeyDown("Jump")) 
  { 
    // Code executed every frame when key bound to "Jump" is pressed
  }
}

当你想从轴上读取值时,你可以这样做:

void Update()
{
  float verticalAxis = Input.GetAxis("Vertical");
  float horizontalAxis = Input.GetAxis("Horizontal");
  
  // Do something with the values here
}

这很简单,对吧? 新的输入系统稍微复杂一些,但带来了很多优势。 我想你会在本教程结束时完全欣赏它们。 现在,我将仅举几个例子:

  • 基于事件的 API 取代了状态轮询 Update方法,带来更好的性能

  • 添加对新输入设备的支持不需要额外的编码,这很棒,尤其是对于跨平台游戏

  • 新的输入系统带有一套强大的 调试工具

新输入系统的要点在于在输入设备和动作与基于事件的 API 之间添加了一个抽象层。 您创建一个 Input Action 资产,通过编辑器中的 UI 将输入与操作绑定,并让 Unity 为您生成 API。

然后你写一个简单的类来实现 IPlayerActions为玩家控制器提供输入事件和值来消费,这正是我们在这篇博文中要做的。

创建一个新的 Unity 项目

如果您想继续,我鼓励您这样做,我建议使用 Unity 2021.3.6f1 。 创建一个新的空 3D 项目,首先,转到 Window > Package Manager 。 选择 Unity Registry ,键入 从 Packages 下拉列表中 Cinemachine in the search field, select the package, and hit install. Then do the same for the InputSystem包裹。

安装时 InputSystem, Unity 会提示您重新启动。 之后,返回 Package Manager 窗口,选择 Packages: In Project ,并确认两个包都已安装。

除了 IDE 的代码集成支持之外,您还可以删除其他包。 就我而言,它是 Visual Studio 编辑器包。

设置输入系统

要设置新的 Unity 输入系统,我们首先需要将输入绑定到操作。 为此,我们需要一个 .inputactions资产。 让我们通过右键单击 Project 选项卡并选择 Create > Input Actions 添加一个。

给它命名 Controls.inputactions并通过双击这个新资产打开绑定输入的窗口。

在右上角单击 All Control Schemes ,然后从弹出的菜单中选择 Add Control Scheme... ,将新方案命名为 Keyboard and Mouse,然后通过空列表底部的加号,添加 键盘 和 鼠标 输入设备。


来自 LogRocket 的更多精彩文章:

  • 不要错过 The Replay 来自 LogRocket 的精选时事通讯

  • 了解 LogRocket 的 Galileo 如何消除噪音以主动解决应用程序中的问题

  • 使用 React 的 useEffect 优化应用程序的性能

  • 之间切换 在多个 Node 版本

  • 了解如何 使用 AnimXYZ 为您的 React 应用程序制作动画

  • 探索 Tauri ,一个用于构建二进制文件的新框架

  • 比较 NestJS 与 Express.js


重复上一段的过程,但这次将新方案命名为 Gamepad ,并将 Gamepad 添加到输入设备列表中。 此外, 选择可选。 从两个要求选项中

返回 Controls (Input Action) 窗口,单击最左侧标记为 Action Maps to a plus symbol 的列,并将新添加的记录命名为 Player. 中间一列是我们现在要将输入与动作绑定的地方。

已添加一项操作,它被标记为 New Action. 右键单击该操作并将其重命名为 Jump,然后用小三角图标展开它,选择绑定 <No Binding>,然后在右列的 Binding Properties 旁边的下拉图标 中,单击Path 。

您可以 部分找到空格 在 键盘 ,也可以单击 收听 按钮,然后只需按键盘上的空格键。 回到绑定属性,在 Path 下面,勾选 的Keyboard and Mouse 下 Use in control scheme 。 请注意,这些是我们之前添加的方案。

空间现在分配给跳跃动作,但我们还需要另一个游戏手柄绑定。 在“ 操作 ”列中,单击加号。 选择 Add binding ,然后在 Path 设置 Button South 中,从 Gamepad 部分 。 这次,在 Use in control scheme 下,勾选 Gamepad 。

让我们添加另一个动作,这次是移动。 标签旁边的加号 使用动作 ,添加新动作并为其命名 Move. 保持 Move选择动作并在右栏中,将 动作类型 更改为 值 , 将控制类型 更改为 向量 2 。

第一个绑定槽,再次默认标记为 <No Binding>, 已经添加了。 让我们将它用于游戏手柄,因为对于键盘,我们将添加不同类型的动作。 在 Path 中, 找到并分配 左摇杆。 从 Gamepad 部分

操作旁边的加号 现在,使用Move 添加新绑定,但这次选择 Add Up/Down/Left/Right Composite 。 您可以将新绑定的名称保留为 2D Vector ,重要的是为每个组件分配一个键。

将 W 、 S 、 A 和 D 分别分配给 Up、Down、Left 和 Right 或箭头键,如果您愿意的话。 不要忘记 使用中勾选键盘 和 鼠标 的 在每个控制方案 。

我们需要添加的最后一个动作是旋转相机以环顾四周。 让我们为这个动作命名 Look. 对于此操作,还将 Action Type 设置为 Value 并将 Control Type 设置为 Vector 。 对于 Keyboard and Mouse 控制方案, 部分绑定Delta 从 Mouse ,这是鼠标从上一帧到当前帧的 X 和 Y 位置的变化量,对于 Gamepad 方案,绑定 Right Stick 。

我们现在拥有键盘和鼠标以及游戏手柄设置的所有输入绑定。 我们需要在 Controls (Input Action) 窗口中做的最后一件事是单击 Save Asset 按钮。

请注意,当我们保存资产时,Unity 生成了一个 Controls.cs为我们归档 Assets文件夹,就在旁边 Controls.inputactions. 在构建我们的文件时,我们将需要在此文件中生成的代码 InputReader类,我们将在下一节中进行。

建立一个 InputReader班级

到目前为止,我们只在 Unity 编辑器中工作。 现在是时候编写一些代码了。 在您的资产中创建一个新的 C# 脚本并将其命名 InputReader. 这 InputReader类应该继承自 MonoBehavior因为我

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/873887
推荐阅读
相关标签
  

闽ICP备14008679号