这是用户在 2025-8-3 13:22 为 https://learn.unity.com/tutorial/jiao-se-kong-zhi-qi-he-jian-pan-shu-ru?uv=2020.3&projectId=5facf921... 保存的双语快照页面,由 沉浸式翻译 提供双语支持。了解如何保存?
Unity Learn 主页
查看教程内容

角色控制器和键盘输入

教程
初级
1 小时
(1745)
摘要
在上一教程中,你编写了第一个非常简单的脚本,用于使 Ruby 在屏幕上移动。在本教程中,你将向游戏添加一些键盘输入
选择 Unity 版本
最后更新:2021 四月 12
2020.3
2020.2
2020.1
2019.4
2019.3
2019.2
2019.1
2018.4
2018.3
语言
中文

1.通过键盘输入来控制移动

你已经创建一个脚本来移动 Ruby 游戏对象。现在让我们调整脚本,以便通过按键盘上的一个键来驱动 Ruby 的移动。
让我们首先更改代码,让角色水平移动。
此次不是像上一教程中的代码那样每帧向 x 坐标0.1,而是仅在玩家按下键盘上的向右箭头键时才加 0.1。
玩家按向左箭头键时,应该减小 0.1,以便对象向左移动。
为此,你将使用 Unity 输入系统。该系统包含输入设置输入代码(由Unity 提供给你用于查询该帧某个轴的值)。

2.查看默认输入设置

首先让我们查看默认的输入设置,这些设置可以定义游戏使用的输入类型:
  • 找到 Edit > Project Settings,然后选择 Settings 窗口中的 Input 页面。
选择要展开的图像
输入图像描述 (可选)

Input 页面列出所有玩家输入控件(例如,游戏手柄上的一个按键)的 Axes 值。值的范围从 -11(具体值取决于玩家执行的操作)。
例如,对于游戏手柄上的控制杆,可以将水平轴设置为:
  • -1(控制杆在左侧时)
  • 0(控制杆在中间时)
  • 1(控制杆在右侧时)
对于键盘按键,以 2 个键来定义轴:
  • 负值键,被按下时将轴设置为 -1
  • 正值键,被按下时将轴设置为 1
如果查看水平轴,可以看到 left(表示向左箭头键)在 negative button 上,而 right(表示向右箭头键)在 positive button 上。

3.修改代码以使用轴

接下来,你需要修改代码以使用
1.双击 RubyController 脚本。随后将打开代码编辑器2.如下所示修改 Update 函数:
public class RubyController : MonoBehaviour { // 在第一次帧更新之前调用 Start void Start() { } // 每帧调用一次 Update void Update() { float horizontal = Input.GetAxis("Horizontal"); Debug.Log(horizontal); Vector2 position = transform.position; position.x = position.x + 0.1f * horizontal; transform.position = position; } }
3.保存所做的更改。
现在,让我们探讨一下你所做的更改。

4.审查你的脚本更改

新建浮点变量

在添加到 Update 函数的第一行代码中,你声明了一个新变量
float horizontal = Input.GetAxis("Horizontal");
这是一个名为 horizontal浮点变量(请注意,此类型表示一个带小数点的数字)。该变量存储 Input.GetAxis("Horizontal") 提供的结果。

调用 GetAxis 函数

GetAxis 与你在上一教程中遇到的 StartUpdate 一样也是函数。 此处的区别在于你无需编写函数内部的代码,因为 Unity 工程师已经为你完成此工作。你在脚本中书写此类函数的名称时,就是在调用函数。

提供参数

圆括号之间的单词被称为参数。向函数提供此信息的目的是指定函数应执行的操作。在此示例中,你希望获得一个轴的值,所以告诉了函数这个轴的名称。你需要将名称放在引号之间,以便编译器知道这是一个单词,而不是一个特殊关键字(例如变量名或类型)。

点运算符

该脚本还显示了点运算符在函数中的作用方式。在此示例中,你调用了 Input 内“包含”的 GetAxis 函数。 为了保持代码干净,作用于同一功能的函数分组在同一名称下,并可以使用点运算符来访问这些函数。

5.将 Horizontal 值写入控制台

下一行代码是另一个 Unity 函数,该函数允许你在 Console 窗口中写入一些内容:
Debug.Log(horizontal);
你现在已经知道点运算符的作用方式,也就知道 LogDebug 中包含的函数。Debug 包含有助于调试游戏的所有函数。 该函数接受一个参数,并将这个参数写入控制台。此处的示例会将 horizontal 中存储的值写入控制台,该值就是 GetAxis 提供给你的值。

6.调整移动代码

你对移动代码的细微更改是将游戏对象移动的距离大小乘以轴的值:
position.x = position.x + 0.1f * horizontal;
经过这些更改,Ruby 的移动方式将如下所述:
  • 如果你按向左键,则轴将为 -1(即移动距离为 position.x + -0.1f;)。Ruby 将向左移动 -0.1
  • 如果你按向右键,则轴将为 1Ruby 将向右移动 0.1
  • 如果没有按下任何键,则轴将为 0Ruby 不会移动(0.1 * 0 等于 0)。

7.测试你的更改

现在,你可以测试自己的更改:
1. 返回到 Unity 编辑器
2.Play 以进入运行模式
3.按下键盘上的向左和向右箭头键。你按下这些键时,Ruby 应该朝着正确方向移动,而不按下这些键时,Ruby 就不应移动。
4.查看 Console 窗口。现在,按向左或向右箭头键时,该窗口中应该会填入变化的值:
选择要展开的图像
输入图像描述 (可选)

5.Console 窗口顶部,找到 Collapse 按钮。如果启用该按钮,具有相同值(例如 01)的所有行将折叠为一行,从而在 Console 窗口中占据更少的空间。
禁用 Collapse 按钮后,各行会连续显示。这是因为 Unity 在每一帧都会调用你的 Update 函数,所以每秒都会写入很多行(取决于 Unity 一秒内生成的帧数)。
注意:
你可能会好奇,为什么这些值不是简单的 -101。这是因为 Unity 在内部会使轴“平滑”,因此按下此按钮时,不会立即从 0 变为 1。实际上会在给定的时间段内达到中间值,使移动更平顺。
可以禁用此功能,但这超出了本教程的范围。有关更多信息,请参阅 Input Manager 文档

8.练习:添加垂直移动

为了准备此练习,请执行以下操作:
  • 返回到你的代码编辑器,然后删除将值写入控制台的代码行:
Debug.Log(horizontal);
你现在已经检查轴值,因此不再需要此代码。 提示:请注意,你可以在脚本中的任何位置编写 Debug.Log 行,从而将值输出到控制台以检查变量。这有助于查明出现异常情况的原因。

添加垂直移动

现在,请你自行尝试添加垂直移动。以下有一些技巧可以帮助到你:
  • 向上和向下键对应的默认轴被称为垂直轴。
  • Vector2 内存储的 y 值对应于垂直位置
  • 请记住要经常保存你的更改。
如果要回顾用于添加水平移动的过程,可以返回本教程中先前的步骤。此练习的答案在下一步中。

9.查看练习的答案

以下是练习的答案:
public class RubyController : MonoBehaviour { // 在第一次帧更新之前调用 Start void Start() { } // 每帧调用一次 Update void Update() { float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); Vector2 position = transform.position; position.x = position.x + 0.1f * horizontal; position.y = position.y + 0.1f * vertical; transform.position = position; } }

练习总结

你已经在本教程的第一部分中创建了水平移动。对于垂直移动,你应该采取以下步骤:
  1. 创建名为 vertical 的新变量,并将 Input.GetAxis(“Vertical”); 的结果存储在此变量中。此过程与水平移动相同,但垂直轴绑定到向上箭头键和向下箭头键。
  2. 就像我们对水平轴所做的操作一样,这次添加一行代码基于该垂直轴值来更改 y 轴
就是这样!此后,游戏对象的位置现在会在 xy 中包含新位置。如果你同时按向上和向右键,则两个轴的值都将更改,并且 Ruby 将沿对角线移动!

10.时间和帧率

目前,Unity 每秒至少渲染 60 帧。让我们调整此设置:
1.在代码编辑器中,将以下两行添加到 Start 函数中:
public class RubyController : MonoBehaviour { // 在第一次帧更新之前调用 Start void Start() { QualitySettings.vSyncCount = 0; Application.targetFrameRate = 10; } // 每帧调用一次 Update void Update() { float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); Vector2 position = transform.position; position.x = position.x + 0.1f * horizontal; position.y = position.y + 0.1f * vertical; transform.position = position; } }
经过此调整后,Unity 将每秒渲染 10 帧
2.返回到 Unity 编辑器
3.按下 Play 按钮以进入运行模式4.尝试移动 Ruby。你现在可能会感觉游戏很慢,并且 Ruby 的行动速度大大降低。

为什么会这样?

如果查看代码,你会发现每次 Unity 调用 Update 函数时,都会将 Ruby 移动 0.1 个单位,这意味着在每一
position.x = position.x + 0.1f * horizontal;
如果游戏以每秒 60 帧的速度运行,那么 Ruby 将移动 0.1 * 60,因此每秒移动 6 个单位。但是,如果游戏以每秒 10 帧的速度运行,就像刚刚让游戏运行的那样,那么 Ruby 仅移动 0.1 * 10,因此每秒移动 1 个单位! 如果一个玩家的计算机非常陈旧,只能以每秒 30 帧的速度运行游戏,而另一个玩家的计算机能以每秒 120 帧的速度运行游戏,那么这两个玩家的主角的移动速度会有很大差异。这样就会使游戏的难易程度提高或降低,具体取决于运行游戏的计算机。

11.以单位/秒表示 Ruby 的移动速度

要解决此问题,你需要以单位/秒来表示 Ruby 的移动速度,而不是采用单位/帧(目前采用此设置)。 为此,你需要通过将移动速度乘以 Unity 渲染一帧所需的时间来更改移动速度。如果游戏以每秒 10 帧的速度运行,则每帧耗时 0.1 秒。如果游戏以每秒 60 帧的速度运行,则每帧耗时 0.017 秒。如果将移动速度乘以该时间值,则移动速度将以秒表示。 1.代码编辑器中,如下所示修改脚本
public class RubyController : MonoBehaviour { // 在第一次帧更新之前调用 Start void Start() { //QualitySettings.vSyncCount = 0; //Application.targetFrameRate = 10; } // 每帧调用一次 Update void Update() { float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); Vector2 position = transform.position; position.x = position.x + 0.1f * horizontal * Time.deltaTime; position.y = position.y + 0.1f * vertical * Time.deltaTime; transform.position = position; } }
2.保存所做的更改。
现在,让我们探讨一下你所做的更改。

12.审查你的脚本更改

为编译器添加注释

首先,你在先前添加的用于减慢游戏速度的两个代码行前面添加了双斜杠 (//)。这些斜杠跟 StartUpdate 函数上方各代码行中出现的斜杠类似。 行首的双斜杠将该行标记为注释,因此编译器会识别到这一点。编译器将忽略注释行。注释用于向脚本添加信息。当你想向自己或创建游戏的其他人添加有关每一段代码的功能的提醒时,这种添加注释的做法很方便。你也可以使用注释来禁用指令,但不必删除这些代码行,此处的示例就是这样做的。
如果需要再次激活添加了注释的行,以便编译器处理该行,只需删除双斜杠 (//) 即可。因此,你不必在进行代码试验时重新输入(或复制粘贴)这些代码行。

调整移动

然后,你将移动距离 (0.1f * horizontal) 乘以 Time.deltaTimedeltaTime(包含在 Time 内)是一种变量,Unity 会将渲染一帧所用的时间填充到此变量中。

13.测试你的更改

现在,你可以测试自己的更改:
1.返回到 Unity 编辑器
2.Play 以进入运行模式
3.尝试移动 Ruby
等待 - 你的游戏会再次快速运行,但角色现在的移动速度比以前还慢。发生了什么情况?!
实际上,你将移动距离保持在了 0.1,这意味着你的角色每秒将移动 0.1 个单位。角色需要 10 秒才能移动一个单位。这样太慢了。奔跑的角色每秒应移动 34 个单位4.Play 以退出运行模式。
5.返回到代码编辑器
6.将两行代码中的 0.1f 均替换为 3.0f,然后再次进行测试。这次你的角色的移动速度会快得多!
7.现在将 Start 中用于降低游戏速度的两个代码行取消注释(删除 //),然后重试。结果移动过程有点断断续续的感觉,这是因为你没有渲染足够的帧(电影院每秒渲染 24 帧,而此处只有 10 帧)。但是,角色每秒移动的单位数量与游戏运行速度无关;角色在任何计算机上都会以相同速度奔跑,而在速度更慢的计算机上只会显得更加卡顿而已。
8.返回到你的代码并删除 Start 中的那两行代码,因为你现在不需要这些代码。添加这些代码只是为了演示如何控制游戏速度,使游戏在任何计算机上都速度相同。 现在,无论游戏渲染的帧数如何,你的角色都以相同速度奔跑。现在,速度“与帧无关”。

14.检查你的脚本

你的 RubyController 脚本现在应如下所示:
public class RubyController : MonoBehaviour { // 在第一次帧更新之前调用 Start void Start() { } // 每帧调用一次 Update void Update() { float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); Vector2 position = transform.position; position.x = position.x + 3.0f * horizontal * Time.deltaTime; position.y = position.y + 3.0f * vertical * Time.deltaTime; transform.position = position; } }



15.总结

在涉及大量代码的本教程中,你通过轴处理了键盘输入。此外,你还让角色的移动速度保持不变,无论每秒使用多少帧来渲染游戏都是如此。
在下一教程中,你将暂时把代码放到一边,了解如何美化蓝色背景并开始装饰场景

项目:
Ruby's Adventure:2D 初学者
角色控制器和键盘输入
角色控制器和键盘输入
一般教程讨论
0
0
1. 通过键盘输入来控制移动
0
0
2. 查看默认输入设置
0
1
3. 修改代码以使用轴
0
0
4. 审查你的脚本更改
0
0
5. 将 Horizontal 值写入控制台
0
0
6. 调整移动代码
0
0
7. 测试你的更改
0
0
8. 练习:添加垂直移动
0
0
9. 查看练习的答案
0
0
10. 时间和帧率
0
0
11. 以单位/秒表示 Ruby 的移动速度
0
0
12. 审查你的脚本更改
0
0
13. 测试你的更改
0
0
14. 检查你的脚本
0
0
15. 总结
0
0