这是用户在 2025-8-3 13:21 为 https://learn.unity.com/tutorial/zhu-jiao-he-di-yi-ge-jiao-ben?uv=2020.3&projectId=5facf921edbc2a200... 保存的双语快照页面,由 沉浸式翻译 提供双语支持。了解如何保存?
Unity Learn 主页
查看教程内容

主角和第一个脚本

教程
初级
30 分钟
(2024)
摘要
在上一教程中,你已学习 Unity 编辑器的布局,并了解到场景游戏对象组成,而游戏对象包含的组件将指定相应游戏对象在游戏中的运作方式。
现在是时候将游戏对象添加到你自己的场景中了!
材料
选择 Unity 版本
最后更新:2021 四月 12
2020.3
2020.2
2020.1
2019.4
2019.3
2019.2
2019.1
2018.4
2018.3
语言
中文

1.创建新场景

让我们首先创建一个新的空场景以便进行处理。
1.选择 File > New Scene。或者,可以使用 Ctrl + N (Windows/Linux) 或 Cmd + N (macOS) 快捷键。
选择要展开的图像
输入图像描述 (可选)

2.如果显示一个弹窗提示你还有未保存的更改,这是因为你移动或更改了演示场景中的某个对象,所以 Unity 要确认你是否打算放弃这些更改。只需单击 Don’t Save

3.现在你已创建名为“Untitled”的空场景。这意味着尚未将这个场景写入磁盘。
选择要展开的图像
输入图像描述 (可选)

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

现在你有了一个可以使用的场景。在余下的教程中,你将使用此场景。请记住要经常按 Ctrl/Cmd + S,将你的更改保存到磁盘。这样,如果你退出 Unity 后再返回,就不会丢失已进行的更改。

2.将资源导入项目中

此项目之所以称为 Ruby’s 2D Adventure,是因为主角名叫 Ruby,而你要在 2D 环境中创建一个简单的冒险游戏。你现在了解原因了,那么让我们接下来找到 Ruby!
1. 从本教程顶部的教程资料下载以下图像,将此图像保存在你的计算机上。
选择要展开的图像
输入图像描述 (可选)

2.将此文件拖放到 Art > Sprites 下,以便 Unity 将此文件复制到 Project 文件夹并采用默认设置将文件导入。
选择要展开的图像
输入图像描述 (可选)

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

精灵是在游戏中绘制的图像。Unity 无法使用你直接为 Ruby 导入的 .png 图像文件,而是需要将此文件转换为可使用的格式。
在此情况下,Import Settings 可以使此图像成为精灵

3.使用精灵来创建游戏对象

要使用 Ruby 精灵来创建游戏对象,请执行以下操作: 1. 单击 Project 文件夹中 Ruby 图像旁的小箭头。你会发现,该图“包含”似乎相同的图像,实际上就是 Unity 为你创建的精灵。
选择要展开的图像
输入图像描述 (可选)


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

选择要展开的图像
输入图像描述 (可选)

如果你查看 Inspector,会发现 Unity 已自动将 Sprite Renderer 组件添加到新游戏对象。该组件在游戏对象所在的位置绘制一个精灵(在 Sprite 字段中指定)。
3.让我们尝试运行一下。使用移动工具Scene 视图中移动精灵(可以使用键盘上的快捷键 W),然后查看 Inspector 中的 Transform 组件的 Position 属性值如何变化。务必将精灵保持在白色矩形内,因为该矩形显示的是摄像机视图的边界。
如果切换到 Game 视图,你将在游戏中看到你的精灵。如果精灵Scene 视图中的白色矩形边界之外,则精灵不在摄像机的视野中,因此你不会在 Game 视图中看到此精灵。

4.为 Ruby 设置坐标

场景中的一切对象都具有 3 个坐标。坐标游戏对象距场景中心(如果对象没有父项)或其父项(如果有父项)的距离。这三个坐标为:
  • 水平 (x)
  • 垂直 (y)
  • 深度 (z)
因为此游戏是 2D 游戏,所以当前可以忽略深度。
要为 Ruby 设置坐标,请执行以下操作: 1.Hierarchy 中,选择 Main Camera 游戏对象。在 Inspector 中,你将看到 Ruby 的位置是 0,0,这也是 UnityMain Camera 游戏对象的默认位置。(暂时忽略 z 坐标。)
2.x 和 y 值更改为 0。现在,Main Camera 游戏对象将位于场景的中心。
3. 在 Hierarchy 中,选择新的 Ruby 游戏对象
4.Inspector 中,将 x 值设置为 -2 并将 y 值设置为 0。现在,Ruby 将与 Main Camera 垂直对齐,但是在水平方向上,位于 Main Camera 的左侧。(一种有用的思考方式是考虑图形的轴:负值会在水平轴上将游戏对象向左移动,在垂直轴上向下移动)。
5.选择 File > Save,保存你对场景的更改。或者,可以使用 Ctrl + S (Windows/Linux) 或 Cmd + S (macOS) 快捷键。请记住,在这些教程中,要经常保存更改!

5.“Ruby's Adventure:2D 初学者”项目中的距离单位

在设置游戏对象位置时,经常使用“单位”一词。你可能会读到如下内容:“Ruby 游戏对象的位置2 个单位(x 轴)和 -4 个单位(y 轴)。”
这些单位的含义会变化。例如:
  • 如果你要创建有关蚂蚁的游戏,可能需要以厘米为单位,并使用大小为 1 个单位 (1 cm) 的蚂蚁精灵。
  • 如果你要创建有关太空的游戏,可能需要将每个单位设置为 10 米,并创建长度为 10 个单位 (100 m) 的太空飞船。
这些教程在提及距离时仅使用“单位”;如果觉得有帮助,你可以将每个单位视为 1 米

6.创建新脚本

现在,你可以编写自己的第一个脚本,并向 Ruby 添加运动!
在 Unity 中,脚本是一种特定类型的组件。你可以将脚本添加到游戏对象,你在脚本中编码的任何行为都将应用于此游戏对象。
要创建新脚本,请执行以下操作:
1. 在 Project 窗口中,找到 Assets 根文件夹。
2.在一个空的空间中右键单击,然后选择 Create > Folder
3.将新文件夹命名为“Scripts”。这样将有助于使项目保持井然有序。
4.双击 Scripts 以打开文件夹。
5.右键单击,然后选择 Create > C# Script
6.将新脚本命名为 RubyController

7.探索默认脚本

首先,让我们来探索默认脚本
  • 双击 RubyController 脚本。
此时将打开随 Unity 一起安装的默认代码编辑器。代码编辑器会因你的系统而异。因此,如果你的界面与以下截屏不完全相同,请不必担心。重要的是可以使用编辑器来编辑脚本文本。
呈现到你面前的内容可能令人望而生畏,但是请放心,本教程将逐步解释所有内容。
选择要展开的图像
输入图像描述 (可选)

using(第 1 到 3 行)

1.可以暂时忽略以“using”开头的行,但不要将它们删除。

class(第 5 到 18 行)

2. 暂时只需要记住“class”(类)表示你正在定义一个新组件。在此示例中,这个类的名称为 RubyController。从该行之后的花大括号到文件末尾的右花括号之间的所有内容都是你的组件的一部分。
在这些花括号内有两个相似的段,这两段都有一行以 void 开头,然后包含一个名称(此处为 StartUpdate)和一对圆括号,这一行之后跟着一对花括号 { }(每个花括号单独成一行,与类相同)。
这些是函数。稍后你将探索函数。现在唯一需要记住的部分是函数具有名称(此处为 StartUpdate),并且两个花括号之间编写的代码将由 Unity 在游戏的不同时间执行。

Start 函数(第 8 到 11 行)

3. Unity 仅在游戏开始时执行一次 Start 中的代码。

Update 函数(第 14 到 17 行)

Unity 在每执行 Update 内的代码。 为了形成动感,游戏(就像电影一样)是高速显示的静止图像。在游戏中通常会在一秒内显示 3060 张图像。其中的一张图像称为一。创建此图像之前,Unity 会执行在你的所有游戏对象Update 函数中编写的代码。
在此 Update 函数中,你可以编写想要在游戏中连续发生的任何操作(例如,读取玩家的输入、移动游戏对象或计算经过的时间)。

8.调整 Update 函数

首先,你需要使 Ruby 游戏对象移动:
  • 将以下三行代码复制到 Update 函数的两个花括号中。
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) 进行保存。请记住这些键盘快捷键。每次输完任何代码都可按快捷键以免丢失工作。
接下来,我们仔细研究你添加的每一行。

9.声明变量

在第一行中,你声明了一个名为 Position变量,并将 Ruby 的当前位置存储在此变量中:
Vector2 position = transform.position;

什么是变量

变量是你命名的位于计算机内存中的位置。稍后,你可以使用该名称来获取在该位置存储的值。变量就像是存储在架子上的箱子,正面写着名称,里面装的是值。

什么是 Vector2 变量

变量名称之前的第一个单词 (Vector2) 是变量的类型。类型告诉计算机你要存储什么类型的数据,以便此数据可以在内存中获得适当的空间大小。Vector2 是存储两个数字的数据类型。请注意,在 Inspector 中,Transform 值使用 x 表示水平位置,使用 y 表示垂直位置,使用 z 表示深度。这 3 个数值组成一个坐标。由于此游戏是 2D 游戏,你无需存储 z 轴位置,因此你可以在此处使用 Vector2 来仅存储 xy 位置。

等号

等号表示:“将右侧的值存储到左侧的变量中”。所以在这里,你要告诉 position 变量存储 Transform 的当前 xy 位置值。

获取 Ruby 的位置

Transform 也是一种变量(是由 Unity 创建的,而不是你),包含脚本所在的游戏对象上的 Transform 组件
transform 和 position 之间的点相当于“包含”,因此在这里你将获取 Transform 内部“包含”的位置。

总结

总之,你将 Transform 组件中包含的位置存储在 Vector2 类型的变量中。现在,内存中有一个名为“position”的位置,其中包含游戏对象的当前位置。

10.移动游戏对象

第二行中,与第一行一样,也使用点来访问其他对象中“包含”的内容:
position.x = position.x + 0.1f;
Vector2 是两个数字,所以它“包含”xy。在此处,你将访问 x 值,即水平位置
为了将游戏对象稍微向右移动,你已经将 x 值增大 0.1,并将结果存回 x 中。
现在,存储在内存中的 position 变量中的 x 坐标向右移动 0.1 个单位(正值将游戏对象向右移动,而负值将游戏对象向左移动)。

11.存储游戏对象的新位置

第三行中,你将新位置存储在 Transform 的位置内:
transform.position = position;
在此代码行之前,你只是在修改一个副本,就像在一张草稿纸上做数学题一样。现在你有了新结果,因此需要将结果返回给 Transform 组件,以便这个组件实际知道需要将游戏对象向右移动 0.1 个单位
计算机对每个新帧都执行此函数,因此与上一帧相比,你的对象将在每个新帧中向右移动 0.1 个单位。这样就会产生游戏对象不断向右移动的视觉效果。

12.在 Unity 中使用你的代码

让我们来查看你的代码的效果:
1.返回到 Unity 编辑器。在右下角,你应该会看到一个小的转轮图标,这表示 Unity 当前正在“编译”你的脚本。
选择要展开的图像
输入图像描述 (可选)

请注意,在某些计算机上,编译可能会非常快,所以图标的显示时间极短。编译器作为一种工具,可以将你的代码翻译成计算机可以理解的语言,因为计算机不会阅读英文!该图标消失时,你便可以在 Unity 中使用自己的代码。
2.选择角色游戏对象,然后将新脚本拖放到 Inspector 中。或者,单击 Inspector 中的 Add Component 按钮,然后搜索 Ruby Controller(每个新脚本都是一个新组件)。
现在,你应该会在 Inspector 中的 TransformSprite Renderer 组件下看到你的组件,这表示脚本已附加到你的游戏对象
选择要展开的图像
输入图像描述 (可选)

3.单击 Play 按钮以进入运行模式,并观察你第一个脚本的结果:一个角色迅速向右逃跑并飞快离开屏幕!
4.再次单击 Play 按钮以退出运行模式。你会注意到 Ruby 已经回到原来的位置。这是因为,退出运行模式时,运行模式期间所做的任何更改都会被“重置”。这样你就可以测试和修改值,而不会破坏你的游戏。每次完成对所做更改的测试后,务必退出运行模式
5. 你可以再次打开脚本并使用加到 x 的值来运行。尝试将 0.1f 更改为 0.3f0.01f,甚至设置为负值! 每次进行更改后,请保存文件,返回到 Unity,然后进入运行模式以查看此更改如何影响游戏对象的移动。

13.脚本结构

你现在已经测试脚本,接下来让我们细看一下你的脚本的语法(即,脚本的编写方式)。
为了唤起你的记忆,下面再次列出了你添加到 Update 函数的三行代码:
Vector2 position = transform.position; position.x = position.x + 0.1f; transform.position = position;

14.脚本结构:行尾

每行以“;”结尾。编译器(此工具可以将英语代码翻译成计算机可以理解的语言)使用分号来定义一条指令的结束位置和下一条指令的起始位置。 这意味着你本来可以编写:
Vector2 position = transform.position; position.x = position.x + 0.1f; transform.position = position;
但是如你所见,这种形式提高了阅读难度!按照惯例,你应该将每条指令放在新的一行。

如果你忘记添加分号,会怎样?

按照惯例,你应该将每条指令放在新的一行。
务必在一行的结尾处添加 ; 分号!
让我们测试一下,忘记添加分号会怎样:
1. 尝试在脚本编辑器中删除第一行的 ;,然后返回到 Unity。你的 Console 窗口现在应该有一条红线,其中写有“error”字样:
Assets/RubyController.cs(17,8): error CS1525: Unexpected symbol 'position'
这是编译器在告诉你,它无法理解你的脚本。在此示例中,编译器告诉你在 RubyController 脚本的第 17 行第 8 列中不应该出现“position”一词。这是因为你删除了 ;,所以编译器继续读取到 transform.position 之后,然后无法理解为什么在那里还有另一个“position”单词!
2.双击红色错误消息。你的脚本编辑器将打开到正确文件的正确行位置。
3.重新添加 ;,保存该文件,然后返回到 Unity
4.红线现在应该消失了,也就是说你的脚本又能正常运行了!

15.脚本结构:数值格式

在带小数点的数字之后,加上一个“f”。这样做就会告诉计算机该数字是浮点数,以便计算机可以正确存储该数字。
你用于编写该脚本的语言 (C#) 有两种类型的小数:浮点双精度。顾名思义,双精度使用的内存大小是浮点的两倍,但是其精度也是浮点的两倍。
现在只需记住:
  • 这两种类型不兼容(不能将双精度和浮点数相加)
  • 由于所有 Unity 内置脚本均使用浮点,因此你需要向小数添加“f”来使用浮点数
如果你在 Console 窗口中遇到一个错误,指出无法将双精度数转换为浮点数,编译器的意思是你可能忘记在小数后加上“f”

16.检查你的脚本

你的 RubyController 脚本现在应如下所示:
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; } }

17.总结

在本教程中,你导入了第一个资源,即主角 Ruby精灵。你还编写了第一个脚本,用于在屏幕上移动 Ruby。
在下一教程中,你要将此移动绑定到键盘输入,以便可以为游戏添加一些交互性!

项目:
Ruby's Adventure:2D 初学者
主角和第一个脚本
主角和第一个脚本
一般教程讨论
0
0
1. 创建新场景
1
2
2. 将资源导入项目中
0
2
3. 使用精灵来创建游戏对象
0
0
4. 为 Ruby 设置坐标
0
1
5. “Ruby's Adventure:2D 初学者”项目中的距离单位
0
1
6. 创建新脚本
0
0
7. 探索默认脚本
0
0
8. 调整 Update 函数
0
0
9. 声明变量
0
0
10. 移动游戏对象
0
0
11. 存储游戏对象的新位置
0
0
12. 在 Unity 中使用你的代码
0
2
13. 脚本结构
0
0
14. 脚本结构:行尾
0
0
15. 脚本结构:数值格式
0
0
16. 检查你的脚本
0
0
17. 总结
0
0