Unity 2D游戏开发 Ruby's Adventure 2:主角和第一脚本
在上一教程中,你已学习 Unity 编辑器 的布局,并了解到场景 由游戏对象组成,而游戏对象包含的组件将指定相应游戏对象在游戏中的运作方式。
现在是时候将游戏对象 添加到你自己的场景中了!
一、创建新场景
让我们首先创建一个新的空场景以便进行处理。
1. 选择 File > New Scene 。或者,可以使用 Ctrl + N (Windows/Linux) 或 Cmd + N (macOS) 快捷键。

2. 如果显示一个弹窗提示你还有未保存的更改,这是因为你移动或更改了演示场景中的某个对象,所以 Unity 要确认你是否打算放弃这些更改。只需单击 Don't Save。
3. 现在你已创建名为**"Untitled"**的2D空场景。这意味着尚未将这个场景写入磁盘。

接下来,使用恰当名称来保存此场景。选择 File > Save 或者使用 Ctrl/Cmd + S 快捷键。
4. 选择 Scenes 文件夹,并将场景命名为"MainScene"。

现在你有了一个可以使用的场景 。在余下的教程中,你将使用此场景。请记住要经常按 Ctrl/Cmd + S,将你的更改保存到磁盘。这样,如果你退出 Unity 后再返回,就不会丢失已进行的更改。
二、将资源导入项目中
此项目之所以称为 Ruby Adventure ,是因为主角名叫 Ruby ,而你要在 2D 环境中创建一个简单的冒险游戏。你现在了解原因了,那么让我们接下来找到 Ruby!
1. 从本教程顶部的教程资料 下载以下图像,将此图像保存在你的计算机上。

2. 将此文件拖放到 Art > Sprites 下,如果目录不能粗壮乃,按如下步骤创建
- 在 Project 窗口中,找到 Assets 根文件夹。
- 在一个空的空间中右键单击,然后选择 Create > Folder。
- 将新文件夹命名为Art。这样将有助于使项目保持井然有序。
- 双击 Art以打开文件夹。
- 右键单击,然后选择 Create > Sprites
- 双击 Sprites以打开文件夹。
以便 Unity 将此文件复制到 Project 文件夹并采用默认设置将文件导入。

3. 因为你的项目 是采用 2D 模板 创建的,所以会自动将此图像导入为精灵 。要查看此精灵,请在 Project 窗口中选择 Ruby ,然后查看 Inspector 中的 Texture Type 字段:

精灵 是在游戏中绘制的图像。Unity 无法使用你直接为 Ruby 导入的 .png 图像文件,而是需要将此文件转换为可使用的格式。
在此情况下,Import Settings 可以使此图像成为精灵。
三、使用精灵来创建游戏对象
要使用 Ruby 精灵 来创建游戏对象,请执行以下操作:
1. 单击 Project 文件夹中 Ruby 图像旁的小箭头。你会发现,该图"包含"似乎相同的图像,实际上就是 Unity 为你创建的精灵。

2. 将此精灵 从 Project 窗口拖入 Scene 视图,即可将此精灵作为新游戏对象 添加到你的场景 中。请使用 2D 视图。

如果你查看 Inspector,会发现 Unity 已自动将 Sprite Renderer 组件添加到新游戏对象 。该组件在游戏对象 所在的位置绘制一个精灵 (在 Sprite 字段中指定)。
3. 让我们尝试运行一下。使用移动工具 在 Scene 视图中移动精灵 (可以使用键盘上的快捷键 W ),然后查看 Inspector 中的 Transform 组件的 Position 属性值如何变化。务必将精灵 保持在白色矩形内,因为该矩形显示的是摄像机视图的边界。
如果切换到 Game 视图 ,你将在游戏中看到你的精灵 。如果精灵 在 Scene 视图中的白色矩形边界之外,则精灵不在摄像机的视野中,因此你不会在 Game 视图中看到此精灵。
四、为 Ruby 设置坐标
场景 中的一切对象都具有 3 个坐标。坐标 是游戏对象距场景中心(如果对象没有父项)或其父项(如果有父项)的距离。这三个坐标为:
- 水平 (x)
- 垂直 (y)
- 深度 (z)
因为此游戏是 2D 游戏,所以当前可以忽略深度。
要为 Ruby 设置坐标,请执行以下操作:
-
在 Hierarchy 中,选择 Main Camera 游戏对象 。在 Inspector 中,你将看到 Ruby 的位置是 0,0 ,这也是 Unity 的 Main Camera 游戏对象 的默认位置。(暂时忽略 z 坐标。)
-
将 x 和 y 值更改为 0 。现在,Main Camera 游戏对象 将位于场景的中心。
-
在 Hierarchy 中,选择新的 Ruby 游戏对象。
-
在 Inspector 中,将 x 值设置为 -2 并将 y 值设置为 0 。现在,Ruby 将与 Main Camera 垂直对齐,但是在水平方向上,位于 Main Camera 的左侧。(一种有用的思考方式是考虑图形的轴:负值会在水平轴 上将游戏对象 向左移动,在垂直轴上向下移动)。
-
选择 File > Save ,保存你对场景 的更改。或者,可以使用 Ctrl + S (Windows/Linux) 或 Cmd + S (macOS) 快捷键。请记住,在这些教程中,要经常保存更改!
五、项目中的距离单位
在设置游戏对象 位置时,经常使用"单位 "一词。你可能会读到如下内容:"Ruby 游戏对象的位置 为 2 个单位(x 轴)和 -4 个单位(y 轴)。"
这些单位的含义会变化。例如:
- 如果你要创建有关蚂蚁的游戏,可能需要以厘米为单位,并使用大小为 1 个单位 (1 cm) 的蚂蚁精灵。
- 如果你要创建有关太空的游戏,可能需要将每个单位设置为 10 米 ,并创建长度为 10 个单位 (100 m) 的太空飞船。
这些教程在提及距离时仅使用"单位 ";如果觉得有帮助,你可以将每个单位视为 1 米。
六、创建第一个脚本
现在,你可以编写自己的第一个脚本,并向 Ruby 添加运动!
在 Unity 中,脚本是一种特定类型的组件。你可以将脚本添加到游戏对象,你在脚本中编码的任何行为都将应用于此游戏对象。
要创建新脚本,请执行以下操作:
-
在 Project 窗口中,找到 Assets 根文件夹。
-
在一个空的空间中右键单击,然后选择 Create > Folder。
-
将新文件夹命名为"Scripts"。这样将有助于使项目保持井然有序。
-
双击 Scripts 以打开文件夹。
-
右键单击,然后选择 Create > C# Script。
-
将新脚本命名为 RubyController。
七、探索默认脚本
首先,让我们来探索默认脚本 ,双击 RubyController 脚本。或通过代码编辑器打开。我用的是VSCode。安装请参考靠 VSCode安装教程。
此时将打开随 Unity 一起安装的默认代码编辑器。代码编辑器会因你的系统而异。因此,如果你的界面与以下截屏不完全相同,请不必担心重要的是可以使用编辑器来编辑脚本文本。呈现到你面前的内容可能令人望而生畏,但是请放心,本教程将逐步解释所有内容。

然后,让我来讲解脚本的默认结构:
-
using 语句(第 1-3 行):可以暂时忽略,但不要删除,用于引入需要的命名空间。
-
class(第 5-18 行) :表示你正在定义一个新组件 。在此示例中,这个类的名称为 RubyController。从该行之后的花大括号到文件末尾的右花括号之间的所有内容都是你的组件的一部分。
此处 Start 和 Update 是两个函数 ,返回值为void 。这些是函数 。稍后你将探索函数。现在唯一需要记住的部分是函数具有名称,并且两个花括号之间编写的代码将由 Unity 在游戏的不同时间执行。
-
Start () 函数:Unity 仅在游戏开始时执行一次 Start 中的代码。
-
Update () 函数:Unity 在每帧执行 Update 内的代码,游戏通常每秒显示 30 或 60 帧,每帧都会执行该方法内的代码,用于处理需要连续发生的操作,比如读取玩家输入、移动游戏对象等。
为了形成动感,游戏(就像电影一样)是高速显示的静止图像。在游戏中通常会在一秒内显示 30 或 60 张图像。其中的一张图像称为一帧 。创建此图像之前,Unity 会执行在你的所有游戏对象 的 Update 函数中编写的代码。
在此 Update 函数 中,你可以编写想要在游戏中连续发生的任何操作(例如,读取玩家的输入、移动游戏对象或计算经过的时间)。
八、调整 Update 函数
首先,你需要使 Ruby 游戏对象 移动,将以下三行代码 复制到 Update 函数的两个花括号中。
c#
public class RubyController : MonoBehaviour
{
// 在第一次帧更新之前调用 Start
void Start()
{
}
// 每帧调用一次 Update
void Update()
{
Vector2 position = transform.position;
position.x = position.x + 0.1f;
transform.position = position;
}
}
**提醒:**务必记得保存,可通过选择 File > Save 或者按 Ctrl + S (Windows/Linux) 或 Cmd + S (macOS) 进行保存。请记住这些键盘快捷键。每次输完任何代码都可按快捷键以免丢失工作。
接下来是代码说明:
Vector2 position = transform.position;:声明一个名为position的 Vector2 变量,存储 Ruby 当前的位置(从 transform 组件获取)。position.x = position.x + 0.1f;:修改 position 的 x 值,使其在每帧增加 0.1 个单位,实现 Ruby 向右移动。transform.position = position;:将修改后的位置赋值回 transform 组件,使游戏对象实际移动。
最后是变量说明:
- Vector2 : Vector2 是存储两个数字的数据类型。请注意,在 Inspector 中,Transform 值使用 x 表示水平位置 ,使用 y 表示垂直位置 ,使用 z 表示深度 。这 3 个数值组成一个坐标。由于此游戏是 2D 游戏,你无需存储 z 轴位置 ,因此你可以在此处使用 Vector2 来仅存储 x 和 y 位置。
- Transform :是由 Unity 创建的,是游戏对象 上的 Transform 组件 。其成员包含 position ,用于获取游戏对象的当前位置。
在此代码行之前,你只是在修改一个副本,就像在一张草稿纸上做数学题一样。现在你有了新结果,因此需要将结果返回给 Transform 组件,以便这个组件实际知道需要将游戏对象向右移动 0.1 个单位!
计算机对每个新帧都执行此函数,因此与上一帧相比,你的对象将在每个新帧中向右移动 0.1 个单位 。这样就会产生游戏对象不断向右移动的视觉效果。
九、在 Unity 中使用你的代码
这里需要注意将你之前下载的资源包,从Assets目录移走,否则资源包里面有相同的代码,会导致编译失败。

-
返回 Unity 编辑器 ,右下角会出现转轮图标,表示 Unity 正在编译脚本,编译器会将代码翻译成计算机可以理解的语言。
-
编译完成后,将
RubyController脚本拖到 Hierarchy 中的 Ruby 游戏对象上,将脚本组件添加到对象上。
-
单击
Play按钮进入运行模式,可以看到 Ruby 迅速向右移动并离开屏幕。 -
再次单击
Play按钮退出运行模式,Ruby 会回到原来的位置,因为运行模式下的更改会被重置。 -
可以修改代码中的
0.1f为其他值(如0.3f、0.01f或负值),保存文件后回到 Unity,进入运行模式查看修改后的效果。
每次进行更改后,请保存文件,返回到 Unity ,然后进入运行模式 以查看此更改如何影响游戏对象的移动。
十、脚本结构
- 行尾分号 :每行代码以
;结尾,编译器使用分号来确定指令的结束位置,虽然可以将多条指令写在一行,但为了可读性,建议每条指令单独一行。 - 忘记加分号的后果:编译器会报错,提示无法理解脚本,双击红色错误消息可以打开脚本的错误位置,添加分号后保存文件,回到 Unity 即可解决错误。
- 数值格式 :在带小数点的数字后加上
f,表示该数字是浮点数,Unity 内置脚本均使用浮点数,如果忘记添加f,编译器会报错提示无法将双精度数转换为浮点数。
你的 RubyController 脚本现在应如下所示:
c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RubyController : MonoBehaviour
{
// 在第一次帧更新之前调用 Start
void Start()
{
}
// 每帧调用一次 Update
void Update()
{
Vector2 position = transform.position;
position.x = position.x + 0.1f;
transform.position = position;
}
}
十一、总结
在本教程中,你导入了第一个资源 ,即主角 Ruby 的精灵 。你还编写了第一个脚本 ,用于在屏幕上移动 Ruby 。在下一教程中,你要将此移动绑定到键盘输入,以便可以为游戏添加一些交互性!