3D 游戏套件演练
Tutorial
·
Beginner
·
+0XP
·
130 mins
·
(50)
Unity Technologies

1. 演练简介
本深度指南将引导你完成从构建关卡(使用 ProBuilder 和 PolyBrush)到使用 3D 游戏套件中提供的所有可交互功能和布景的各种任务。
你可以将大多数教程用作独立的演练,但是在整个过程中,请参考相关教程以获得更深入了解。
如果你想快速入门,请参考《快速入门指南》,因为该指南含有更小、更独立的教程和示例。
首先按照此处提供的《快速入门指南》来创建新场景。
2. 使用 ProBuilder 进行编辑
你的新场景已经有一块可让 Ellen 奔跑的地面,接下来我们看一看具体情况:
- 导航到 Hierarchy 窗口
- 选择名为 Plane 的游戏对象

此 Plane 是使用 ProBuilder 工具创建的。该工具可以让你在 Unity 中创建并编辑 3D 对象。ProBuilder 窗口处于打开状态的原因是我们在场景中有一个 ProBuilder 网格 (ProBuilder Mesh)。

如果此窗口未打开,可从顶部菜单将其打开:
- 单击 Tools > ProBuilder > ProBuilder Window

灰盒测试
灰盒测试就是在场景中创建简单形状或几何体,以便勾勒和规划你想要制作的关卡。在游戏开发中,灰盒测试是关卡设计的早期阶段,你可以在此阶段中快速构建原型并尝试各种构想。ProBuilder 是灰盒测试的绝佳工具,因此让我们在场景中创建一个新形状:
- 导航到 ProBuilder 窗口
- 单击 New Shape 旁边的“+”符号

此时还将打开 Shape Tool 窗口。

使用 Shape Selector 下拉菜单可以创建许多不同的形状。

现在,我们将创建一个立方体(默认形状):
- 选择 Cube
- 将 Dimensions 设置为 3,3,3
- 单击 Build Cube

现在,你在场景中间已构建一个立方体。由于我们的平面 (Plane) 比立方体的中心高一点,所以立方体会与平面相交。

可以使用移动工具来移动立方体。请单击 Scene 视图中的任何箭头,将立方体移到所需的位置。
可以使用 ProBuilder 中的多个工具来更改立方体的形状。要了解有关使用 ProBuilder 在 Unity 内创建 3D 模型的更多信息,请查看 ProBuilder101 教程以及文档。
现在,让我们删除此立方体:
- 在 Hierarchy 窗口中选择 Cube
- 按键盘上的 Delete 键(在 Mac 上按 Cmd + Backspace)

接下来,让我们继续编辑和绘制地平面。
3. 创建酸池 (Acid Pool)
PolyBrush
地面由 ProBuilder 平面组成。这些通常是平坦的表面,但是我们可以使用 PolyBrush 来创建不平坦的表面并绘制纹理来让此网格类似于地面。我们将在地面创建一个凹陷位置,然后在此位置可以添加酸池,作为针对 Ellen 的危险元素。
网格:网格由 3D 空间中排列的三角形组成,可产生实体对象的效果。三角形由其角点或顶点定义。
注意:PolyBrush 当前为 Beta 版,因此使用此工具时可能会遇到一些错误。
对于我们将构建的关卡,可以通过缩放此平面来使其变大一点:
- 在 Hierarchy 中选择 Plane
- 导航到 Inspector
- 将 X 轴的 Scale 设置为 2
- 将 Y 轴的 Scale 保持为 1
- 将 Z 轴的 Scale 设置为 2

让我们打开 PolyBrush 窗口并开始编辑:
- 选择 Tools > PolyBrush > PolyBush Window


注意:PolyBrush 当前为 Beta 版,因此布局可能会改变。
选中平面后:
- 在 PolyBrush 窗口中单击 Push/Pull 图标

- 选择平面,然后在 Scene 视图中将鼠标光标悬停在此平面上
- 只要你移动鼠标,就会出现 Push/Pull 辅助图标。

- 单击鼠标左键,然后通过上拉顶点来抬高地面
- 或者按住 Ctrl 并单击鼠标左键,然后通过下按顶点来降低地面
现在,你已经了解基本知识,请使用 Ctrl + 单击鼠标左键的方式在平面上创建一个小凹陷,从而构建一个池。该池无需太深。
- 完成编辑后,再次单击 Push/Pull 图标以取消选择该工具。

你应该得到以下类似的结果。

有关 PolyBrush 及其使用方法的更多信息,请访问教程和文档
目前,让我们继续创建第一个危险元素。
添加酸 (Acid)
为了找到酸,我们需要导航到 Project 窗口。这是所有预制件和工具的存储位置:
- 选择 Assets > 3D GameKit > Prefabs > Interactables
- 左键单击 Acid 预制件并将其拖入 Hierarchy
酸 (Acid) 将出现在场景中的某个位置。在 Unity 中,你可以使用框选 (Frame Selecting) 功能来快速找到对象:
- 在 Hierarchy 中选择 Acid
- 将鼠标光标悬停在 Scene 视图中
- 按键盘上的 F 键
这将在 Scene 视图中找到并框选酸 (Acid)。

目前,酸太大,因此我们将其缩小一点:
- 选择酸后,按键盘上的 R 键以使用缩放工具
- 单击并拖动中间的白盒,使酸变小

酸也处于错误的位置。使用移动工具(选择酸并按 W)将酸置于平面下方,使其略微透过池的生成位置。

你可以继续定位和缩放酸,直到获得所需的结果。
提示:酸只需要大于池的空间即可。
- 按 Play 并测试你的场景以检查冒泡的酸池。

注意:通过 3DGamekit 工具栏菜单新建场景时,将添加默认的 DeathVolume 区域,该区域的面积极大,能够为你提供充足的编辑空间。降低下面的地形时要小心,因为 Ellen 会在进入时死亡。

顶视图 - 默认关卡死亡体积

侧视图 - 默认关卡死亡体积
添加死亡体积
目前,Ellen 可以在酸液中洗澡而不会受伤,因此这时的酸在很大程度上不是危险元素。

要在 Ellen 踏入酸液时,让酸液杀死她(对不起,Ellen),请执行以下操作:
- 在 Hierarchy 中选择 Acid
- 在 Inspector 中,单击 Add Component
- 在搜索框中键入“death”
- 选择 Death Volume 脚本

此时会将 Death Volume 脚本添加到 Acid。这是我们制作的脚本,用于指示游戏使 Ellen 失去所有生命值。

- 按 Play 对关卡进行测试。尝试跑入酸池,这时 Ellen 会死亡并在不久后重生。
4. 使用 Polybrush 进行顶点着色
PolyBrush 提供了一个非常有用的 3D 美术师功能,称为顶点着色。该功能使你可以在顶点(即连接在一起以构成表面的点)上绘制,而不是直接在游戏对象的表面上绘制。
与使用推/拉 (Push/Pull) 功能来创建酸池 (Acid Pool) 和死亡体积 (Death Volume) 的方式类似,绘制功能将使用顶点在表面上进行绘制。这些顶点在截屏中突出显示,线条表示顶点之间多边形的边。

最初,这可能很奇怪,因为你可能希望能够直接在表面上绘制,而使用顶点绘制时,采用的是该顶点以及沿表面边缘最近的顶点来“混合”它们之间的颜色/纹理。
此过程由材质进行处理:材质利用着色器(脚本)将纹理(位图图像)进行分组,并在游戏对象上渲染这些纹理。有关这些主题的更详细说明,请访问手册的材质、着色器和纹理页面。
为了直观了解这一点,让我们马上开始绘制吧!
绘制和材质
你先前使用游戏套件来创建场景时,创建的平面已附加了着色器材质。在后续步骤中,你将了解如何创建这样的平面,并更深入地了解视觉样式和材质的组成要素。
让我们首先设置一个基本平面并附加一个材质。
- 除非已经打开 ProBuilder,否则请从 Tools > ProBuilder > ProBuilder Window 打开 ProBuilder

- 从 ProBuilder 窗口中选择 New Shape

- 在 Shape 窗口中,从下拉选单中选择 Plane

这会将已附加一些默认值的平面添加到 Scene 视图中,并会将该平面放置在先前创建的默认平面旁边。为了与演示中的平面类似,请将 ProBuilder 窗口中的 Plane 值设置为:
- Width:20
- Height:20
- Width Segments:10
- Height Segments:10

在 Inspector 视图中,设置以下项:
- Position:X:-30,Y:0,Z:-10
此设置应该会将平面放置在关卡中生成的现有平面旁边,如果使用这些值时平面没有完全对齐,请根据需要进行调整。

返回到 Shape Tool 窗口并单击 Build Plane
查看 Inspector,你可以看到当前附加的 Shader 就是 Standard Vertex Color(显示为绘色)。


此过程将更新 Project 视图以显示项目中的所有材质。

在 3D 游戏套件中,附加到主平面的默认材质是 Default_Ground_Mat,让我们进一步筛选这些结果。
- 在 Search 字段中的 t: Material 文本旁键入 default_ground_mat

- 将 Default_Ground_Mat.mat 从 Project 视图拖放到 Scene 视图中的平面上,从而向平面添加材质。

注意,在 Inspector 中,材质现在已更新为 Default_Ground_Mat

因此,你现在可以使用材质在平面上绘制。
- 选择 Tools > Polybrush > Polybrush Window

- 选择 Polybrush 窗口顶部的 Paint Vertex Colors 选项卡

注意纹理是如何平铺在平面表面区域上的:默认图案位于左侧,顶点绘制的版本位于右侧。

要查看当前映射的纹理,请在 Project 视图中选择 Assets > 3DGamekit > Art > Textures > Environment > Ground。
提示:要更快地导航到此处,可以使用 Default_Ground_Mat Shader,单击材质预览旁边的箭头,然后选择其中一个纹理。这两种方法都会将你定向到 Project 视图中的正确文件夹。

要开始绘制新平面,请从 Polybrush 窗口中选择 Red 绘制颜色以设置画笔颜色。

因此,你可以使用映射的纹理来进行绘制,在此示例中则是使用 Moss_Albedo 纹理在顶点上进行绘制。
在 Scene 视图中,使用画笔辅助图标,通过将画笔辅助图标朝平面上的顶点移动,你可以在编辑器中实时查看纹理混合情况。要永久保存此状态,只需进行单击。

如果你希望添加某种 MuddyGround 纹理,请在调色板 (Palette)中将画笔颜色切换为蓝色,如果要添加带有 SmallStone 的 MuddyGround 纹理,请将画笔颜色切换为绿色。这样会给你的表面带来丰富的变化。

现在,轮到你用画笔发挥创意了!通过结合使用推/拉 (Push/Pull) 功能、调整画笔大小以及使用画笔彩色纹理,你就可以创建各种各样的绘制网格。
提示:为了尝试不同的颜色,你可以在编辑器中实时预览颜色以查看 3D 游戏套件中应用的不同纹理和混合。
从对象移除 ProBuilder 脚本
在场景中使用 ProBuilder 创建的对象时,最好在完成编辑后移除 ProBuilder 脚本以防止游戏中出现任何不必要的开销。这样做将从场景中的单个选定对象或所有 ProBuilder 对象移除脚本。
- 单击 Tools > ProBuilder > Actions,然后选择从所有对象剥离脚本或仅从单个选定对象剥离脚本。

此操作为永久性操作,因此在执行此操作之前,请确保你已对网格和顶点绘制进行所有必要的更改,编辑器将在你完成此操作之前警告你。
5. 使用环境预制件
我们已构建关卡几何体,允许你将相应几何体放置在需要的位置。你可以在 Prefabs > Environment 中找到它们。

例如,让我们将一个岩石模型拖动到场景中:
- 在 Project 窗口中,选择 Prefabs > Environment > Rock
- 单击 CliffBig01
- 在 Inspector 底部的预览窗口中预览此模型

- 在预览窗口中的模型上左键单击并拖动,从而旋转模型并从不同角度查看模型。
提示:如果你看不到此窗口,请单击 Inspector 底部的灰条并向上拖动鼠标。
有关性能的注意事项
当你旋转模型时,将看到模型的某些部分缺失。这是正常的,因为很多几何体缺少背面。这样可以使较大场景具有更好的性能,并防止这些场景降低计算机的速度。

添加到场景中的几何体和特效越多,计算机需要处理的事项就越多。在某些计算机上可以处理令人难以置信的大量几何体和特效,而在其他计算机上可以处理的几何体和特效非常少。在构建关卡时务必记住这一点。如果在按 Play 后你的计算机开始变慢,你可能需要移除某些几何体。
我们使用了如上所述的一些方法来使你能够尽可能多地进行构建。项目将自动检测你的计算机硬件,并确定你可以看到多少几何体和特效及其细节级别,这一点与 PC 游戏根据你的计算机来改变设置的方式相似。如果你需要重置这些设置,或这些设置未自动完成,请选择 Kit Tools > Auto Detect Quality Settings。

如果要手动更改这些设置并查看设置明细,请选择 Edit > Project Settings > Quality。此时将打开 Inspector 中的信息,供你根据需要进行调整。
细节级别
我们用于改善性能的另一种方法是使用 LOD 组。LOD 表示细节级别 (Level of Detail)。对象远离摄像机并且观察者不会注意到差异时显示细节级别较低的网格。这是因为具有更简单几何体的网格对硬件的要求更低。
让我们来看看 CliffBig01 示例:
- 将 CliffBig01 拖入 Scene 视图中
- 在 Hierarchy 中,单击 CliffBig01 旁的箭头以显示出子对象。

单击每个子对象,然后在 Scene 视图中观察子对象的变化。

在这里,我们可以看到细节变化。我们将这些网格设置为在距摄像机不同的距离处显示。
- 单击 CliffBig01 旁的箭头以将其折叠
- 确保已选中 CliffBig01
- 在 Inspector 中查看 LOD Group 组件

在这里,你可以看到哪些模型将在距摄像机多远的位置显示。你无需更改这些设置,因为我们都已经为你设置好了。根据自动为你选择的质量设置,LOD 组距离会有所不同。
有关 LOD 组的更多信息,请参阅我们的文档
6. Rock Painter 和 Vegetation Painter
我们创建了 Rock Painter 和 Vegetation Painter 来进一步完善你的场景。这些工具使你可以放置具有不同大小和旋转度的植被和岩石,同时使这些植被和岩石与发生绘制的表面对齐。
要使用这些工具,请执行以下步骤:
- 在 Hierarchy 中,找到 VegetationPainter
- 单击箭头以展开子对象

- 单击 GroundCover
- 在 Scene 视图中,将鼠标光标悬停在地面上
- 左键单击,将一些草/睡莲叶放置在所需的位置。

你可以更改放置的对象类型,为此需要执行以下操作:
- 导航到 Inspector
- 在 Instance Painter 组件中显示了 Painter 中每个预制件的图像。

- 所选的预制件将变灰
- 单击突出显示的白色框以选择用于绘制的预制件。
你可以在 Instance Painter 组件顶部找到 Painter 的控制方式。一些基本的控制方式如下:
- 左键单击:绘制
- Ctrl (Cmd) + 左键单击:删除
- Alt + 滚动:增大画笔大小
- 空格键:随机化位置和旋转
你绘制的任何对象都将被存储为父对象的子对象。例如:
- 导航到 Hierarchy
- 展开 GroundCover

绘制的任何此类对象都将作为子对象存储于此处。你也可以单击这些对象以单独编辑和放置它们。
此过程与绘制 VegetationSmall、VegetationMedium 和 VegetationLarge 相同

以相同方法绘制岩石:
- 在 Hierarchy 中,找到 RockPainter
- 单击箭头以展开子对象
- 单击 RocksSmall
- 将鼠标光标悬停在要放置岩石的目标区域上,然后单击即可放置。

这些工具可以在你装饰关卡时帮助你快速增添变化。你可以找到这些工具并按照从 Prefabs 文件夹拖入预制件的传统方式来放置它们。
- 导航到 Project 窗口
- 选择 Assets > 3DGameKit > Prefabs > Environment
在这里可以找到 Rocks、VegetationSmall、VegetationMedium、 VegetationLarge 的文件夹。

可以在 Scene 视图中单击并拖动上述任意对象,从而将它们放入你的关卡内。请注意,以这种方式拖动对象时,不会将位置、旋转和大小随机化。
继续在场景中放置对象。不要忘了偶尔按一下 Play 来测试游戏关卡,看看游戏中的各种对象是否正常。
我们创建了一个小环境,用于在后续章节中向你展示游戏机制。尽情享受创作乐趣,让你构建的关卡富有创意!


7. 组织你的场景
在 Unity 中创建任何场景时,重要的是使 Hierarchy 中的内容保持整洁,这样你就可以轻松找到所需的对象或游戏机制。以下的一些提示虽然对于使用本游戏套件而言并不是必需的技巧,但可以让你的项目保持美观和良好的条理性。
在 Hierarchy 中,我们创建了多个部分来对场景中各种类型的对象进行分类。

这些部分都是空游戏对象。除了协助我们识别场景中对象的类型外,这些部分没有其他作用。请注意,每个特定部分下方的所有对象都不是该部分的子对象,也不应该是其子对象。
让我们创建一个新的部分来存储所有额外的关卡装饰:
- 在 Hierarchy 顶部,选择 Create > Create Empty

此时将在 Hierarchy 的底部新建一个名为 GameObject 的空游戏对象

在 Hierarchy 中,确保将 GameObject 突出显示为蓝色(表示已将其选中)。现在,我们可以重命名该游戏对象:
- 导航到 Inspector
- 在 Inspector 顶部,单击名称字段
- 输入以下名称:----- Environment -----
当你拥有大量对象时,这样对各个部分命名可帮助你查找对象。

现在,我们将 CliffBig01 移到正确的部分中,以便将来更容易找到。
- 在 Hierarchy 中,找到 CliffBig01
- 左键单击并按住拖动 CliffBig01,直到它处于 ----- Environment ----- 之下,然后松开鼠标左键

提示:确保不要在另一个对象的上方松开鼠标左键,因为这样会使拖动的对象成为子对象。
当一个对象即将成为另一个对象的子级时,会出现一个视觉指示。在进行拖动时,视觉指示如下所示:

将对象拖动到 ----- Environment ----- 下面时,请确保看到一条水平线。此线条表明将如下位置下方放置对象:

如果你误将对象放置为标签的子对象,只需将对象移回,然后重试。
8. 游戏边界
构建关卡时,你可能会发现在测试中可以轻松地从关卡逃脱,并到达你不希望玩家能够进入的区域。不能总是通过添加更多的几何体来解决此问题,我们可以添加隐形墙来阻止玩家逃脱。
为此,我们可以在空游戏对象上添加碰撞体并将此游戏对象添加到场景中:
- 在 Hierarchy 顶部,选择 Create > Create Empty
- 在 Inspector 中,将此游戏对象重命名为 GameBoundary
- 在 Inspector 中,单击 Add Component
- 在搜索框中,键入 Box Collider

- 单击 Box Collider 以将其添加到你刚创建的 GameBoundary 游戏对象
现在,让我们在场景中找到此对象:
- 在 Hierarchy 中选择 GameBoundary
- 将鼠标光标悬停在 Scene 视图上
- 按键盘上的 F 键以框选该对象

现在可通过绿色轮廓看见 Box Collider。将此对象定位、旋转和缩放到关卡中的任何问题区域。
我们需要确保 Ellen 无法穿过此碰撞体。为此,我们设置了一个特定的层,并选中 GameBoundary:
- 在 Inspector 中,单击 Layer 下拉菜单
- 左键单击 Environment 以将其设置到该层。

我们已将游戏边界放置在玩家可以轻松跳起来并逃脱的区域,不要忘了按 Play 来测试游戏边界。

9. 进一步深入了解移动的平台
我们将了解如何通过游戏套件来添加各种游戏元素。我们已设置一个演示关卡来展示这些元素,但是你可以使用自己构建的场景或使用新场景。
如果你使用过 2D 游戏套件,尽管我们调整了一些元素来简化工作流程,但你可能已经熟悉某些技巧。
移动的平台可以用于将玩家从一个地方移到另一个地方。让我们将一个移动平台添加到场景中:
- 导航到 Project 窗口
- 选择 Assets > 3D GameKit > Prefabs > Interactables

Interactables 文件夹包含为此游戏套件创建的预制游戏元素。
- 左键单击 MovingPlatform 预制件,然后将其拖入 Scene 视图或者 Hierarchy
- 注意:如果将此预制件移到 Hierarchy 中,请勿忘记使用框选功能(键盘快捷键:F)来找到它
- 还可以通过 Inspector 在 Transform 组件中定位、旋转和缩放对象

提示:将鼠标光标悬停在 X、Y 或 Z 上,然后左键单击并向左或向右拖动,即可分别增大或减小这些值。
- 将整个对象定位在你希望平台开始的位置。
我们已将我们的对象定位在先前创建的酸池之上。

现在让我们来看看如何制作平台并设置其路径来更改平台将移动到的位置。
辅助图标
移动的平台附带 3 个辅助图标,可让你轻松改变平台的运动。在屏幕中,你可以看到你可以设置变换位置,从而将平台置于世界 (1)、起始位置 (2) 和结束位置 (4),并以移动虚线来表示相互之间的距离 (3)。

在 Inspector 窗口中,找到 Simple Translator (Script),并勾选 Activate 框以启用 MovingPlatform 的移动。

在此过程中,如果在选中 Activate 之前已移动 Start 位置,你会发现 Moving Platform 贴靠到 Start 位置,而不是 Transform 组件中设置的初始位置。这是为了确保平台始终从正确位置开始,并根据 Simple Translator 脚本中设置的行为进行移动。
提示:按住 Ctrl (Cmd) 键的同时移动辅助图标,即可贴靠到网格并按增量移动。这种做法有助于获得笔直路径。
Ellen 需要在环境中穿梭并避开酸池,因此需要调整 End 辅助图标,否则它将执行默认的 Z 轴移动(这对玩家而言不是很有用)。
为了在编辑器中查看 Moving Platform 的当前移动情况,你可以在 0 到 1 的范围内移动 Preview Position 的滑动条。你会在 Scene 窗口中看到平台在游戏中的该移动阶段应该移到的位置。

这是非常有用的功能,有助于你检查是否与场景中其他游戏对象有任何可能的重叠或者用于预览行为。
Duration
要改变从 Start 到 End 的时序速度,你可以更改 Duration 值。该值默认设置为 5(以秒为单位)。减小此值会加快时序,更大的值则会降低移动速度。
设置移动的平台
- 单击 End 辅助图标上的 Y 控制柄(绿色),按 Ctrl(Cmd) 键进行贴靠,然后向下拖动至所需高度。

在本例中,我们希望是直接向下移动。请拖动 End 辅助图标的 Z 控制柄(蓝色)并贴靠 (Ctrl/Cmd),然后将此辅助图标拖动到起点 (Start Point) 下方。

如果你现在移动 Preview Position 滑动条,Moving Platform 应该移向新的终点 (End Point) 位置。
- 此示例的最后一步是将 Loop Type 设置为 Ping Pong(当前设置为 Once)。更改此设置将重复从 Start 到 End 再返回的序列。

Loop Type
Once - 线性 - 从 Start 移动到 End,并在到达 End 时停止

只需要将玩家从 Start 传送到 End 时,Once 是最常使用的循环类型。
Ping Pong - 双向循环 - 从 Start 移动到 End,然后从 End 移动到 Start,形成持续的运动循环。

Ping Pong 循环类型是当平台为玩家提供的路线应该持续可用时最常使用的类型。
Repeat - 单向循环 - 从 Start 移动到 End,然后返回到 Start 进行重复。

对于单向序列(平台在 Start 处生成,并从 Start 移动到 End),Repeat 是最常使用的循环类型。你可以在 3D 游戏套件的关卡 2 的酸坑中看到此类型 (3D Game Kit > Scenes > Gameplay)。

附带压力垫的游戏命令
游戏命令使场景中的游戏对象可以通过收发命令来与其他游戏对象进行通信。这可以帮助你设计复杂的行为和脚本。
在 3D 游戏套件中,游戏命令基于发生的事件并且因对象而异。在此示例中,我们将了解如何设置 PressurePad 预制件以使用游戏命令来激活在 MovingPlatforms 教程中添加的 MovingPlatform 预制件。
- 要准备 MovingPlatform 以便从 PressurePad 进行交互,请禁用 Activate 属性。

链接可交互对象

- 前往 Project 视图,然后导航到 3DGamekit > Prefabs > Interactables。
- 将 PressurePad 从 Project 窗口拖放到 Scene 视图中,放置在将与 PressurePad 相连的 MovingPlatform 附近。

在 Inspector 中,你将编辑的组件是 Send On Trigger Enter 脚本。

此脚本将允许你通过使用 Interactive Object 选项来连接到其他游戏对象(这会将 Game Command Receiver 链接到 Hierarchy 中的相关游戏对象)。
在此示例中,我们将链接到 Hierarchy 视图中已有的 MovingPlatform。
- 为此,单击 Interactive Object 的选择按钮,然后选择 MovingPlatform,并将 Interaction Type 设置为 Activate。

你应该会在 Scene 视图中看到一条带有方向箭头的连接线,这条线从 PressurePad 连接到 MovingPlatform。这条线显示了两个游戏对象之间的关系,并显示出游戏命令从发出方 (Sender) 到接收方 (Receiver) 的流向。

- 运行游戏并在 One Shot PressurePad(应该保持按下状态)上行走即可激活 MovingPlatform 并开始循环序列。

10. 使用计数器和开关
我们可以将多个对象连接在一起。接下来,我们将查看如何在开门前使用 Counter 对 3 次开关激活进行计数。
- 首先,选择 Project 窗口 > Assets > 3DGameKit > Prefabs > Interactables。将 Switch 和 DoorSmall 拖入 Scene 视图中,从而添加这两个对象。
现在,让我们连接 Switch 和 DoorSmall,以便在激活 Switch 时会将门打开。
- 在 Hierarchy 中,单击 Switch 将其选中

- 在 Hierarchy 中,单击 DoorSmall 并将其拖到 Switch 的 Send On Trigger Enter 组件的 Interactive Object 字段中

- 在 Scene 视图中,应该有一条带箭头的白线显示从 Switch 到 DoorSmall 的连接。

- 在 Hierarchy 中,选择 Switch
- 按 Ctrl + D(在 Mac 上按 Cmd + D)以复制 Switch
- 再重复一次以获得另一个 Switch
你应该会看到 Switch、Switch (1) 和 Switch (2)。
这些开关将显示在 Hierarchy 的最底部。为了使项目保持井井有条,Ctrl + 单击(Cmd + 单击)每个开关,并在 Hierarchy 中拖动,使这些开关靠近在一起。

这些开关在复制后将位于与原件相同的位置:
- 在 Hierarchy 中,逐个选择每个开关,并将它们并排放置,从而形成一排。

你还可以看到,我们复制该对象时,也复制了与门的连接。与任一个这些开关碰撞后,门都会打开。如果愿意,你可以按 Play 试一试。
我们希望在激活所有 3 个开关后,门才打开:
- 在 Project 窗口中,选择 Assets > 3DGameKit > Prefabs > Interactables
- 找到 Counter 预制件并将其拖入场景中
- 将该预制件放在开关附近

此对象并未实际存在于场景中,因为它将包含一些游戏机制。你可以使用变换工具来查看此对象。由于我们在场景中看不到 Counter,所以我们将通过 Hierarchy 来选择它。
提示:你可以添加标签来提高这类对象在 Scene 视图中的可见度:
- 选择 Counter。
- 单击 Inspector 顶部的蓝色框。
- 从下拉选单中选择颜色标签。

这样就会向对象添加标签。

如果看不到标签,可能是因为 Scene 视图中的图标太小。你可以进行此更改:
- 在 Scene 视图的顶部,单击 Gizmos 下拉选单
- 调整滑动条来更改 Scene 视图中的图标大小

我们现在已在场景中具有可以对若干发送方进行计数的 Counter,接下来需要将来自每个 Switch 的“Open”游戏命令发送到 Counter。
- 在 Hierarchy 中,选择 Switch
- 单击 Counter,然后将其拖到 Send On Trigger Enter 脚本中的 Interactive Object 字段内
这样将替换门(作为接收命令的对象)。

在 Scene 视图中,箭头将连接到 Counter。

- 对 Switch (1) 和 Switch (2) 重复上述步骤
现在,所有的 3 个开关都会将命令发送到 Counter

我们可以在 Counter 上的 Game Command Receiver 脚本中仔细检查这一点。

现在,如果我们进入运行模式并跑向每个开关,什么都不会发生。我们需要告诉 DoorSmall 在 Counter 达到 3 时打开。
- 在 Hierarchy 中选择 Counter
- 在 Inspector 中,更改 Gameplay Counter 脚本的以下相关设置
- Interaction Type:Open
- Is One Shot:True(勾选此框)
- Target Count:3

上述设置将接收 Open 类型的命令,仅计数一次,并设置目标数量以使 Counter 达到 3。
现在,我们让 Counter 向门发送一条命令。
- 选择 Counter 后,输入 Send Game Command 脚本的以下设置
- Interaction Type:Open
- 将 DoorSmall 从 Hierarchy 拖到 Interactive Object 字段
- One Shot:已启用(勾选此框)

现在每个开关将向 Counter 发送一条命令,而 Counter 在收到 3 个命令后向门发送 Open 命令。

按 Play 对关卡进行测试。你应该能够与每个开关碰撞,并且在碰撞所有 3 个开关后,门就会打开。
可以将 Counter 用于需要满足一项指标才能发生的许多情况。除了 Enable 和 Open,Send Game Command 还有各种 Interaction Type 选项:

向玩家指示进度
通常在游戏中,我们会把这些种类的机制放在彼此相隔很远的位置。我们已经在此项目的示例游戏中进行了这种操作。一般而言,游戏设计中的一种良好做法是通过用户界面或游戏中的指示器向玩家指示进度。
我们将调整游戏命令 (Game Command) 和计数器 (Counter),从而显示使用每个开关 (Switch) 时在门附近照亮的水晶 (Crystal)。这样将向玩家显示该门在世界中有 3 个开关,并指示已激活的开关数量。
- 在 Project 窗口中,选择 Assets > 3DGameKit > Prefabs > Interactables
- 找到 Crystal 预制件并将其拖入场景中

水晶 (Crystal) 对我们的关卡而言有点过大,所以我们需要调整水晶的大小:
在 Hierarchy 中选择 Crystal
- 导航到 Inspector 并查看 Transform 组件
- 将 Scale 设置为以下值:
- X:1
- Y:1
- Z:1

- 使用变换工具将水晶放置于门附近的某个位置
- 在 Hierarchy 中选择 Crystal 后,两次按下 Ctrl + D(在 Mac 上按 Cmd + D),从而将其复制两次。
- 在 Hierarchy 中选择 Crystal (1) 和 Crystal (2)(Ctrl + 单击,或在 Mac 上按 Cmd + 单击),然后进行拖动以便将它们重新排序在 Crystal 附近

- 在 Scene 视图中,使用变换工具将水晶定位到所需位置

我们已将水晶放置在门旁边,便于玩家看到。我们希望在开关激活时改变水晶的颜色:
- 在 Hierarchy 中,选择 Switch
- 在 Inspector 中,向下滚动到底部,然后单击 Add Component
- 在搜索框中,键入“Send on Trigger Enter”
- 按 Enter 或单击“Send on Trigger Enter”脚本,从而将此脚本添加到 Switch 对象

这样会将另一个 Send On Trigger Enter 脚本添加到该 Switch。我们可以通过这种方式向水晶发送命令,从而在激活开关后使水晶变色。
- 将刚才添加的 Send On Trigger Enter 脚本中的值设置为以下值:
- Interaction Type:Activate
- 将 Crystal 从 Hierarchy 拖到 Interactive Object 字段中
- One Shot:已启用(勾选此框)
- Layers:Player

这样,在激活开关后就会向水晶发送命令来进行激活。

按 Play 对机制进行测试。让 Ellen 跑到第一个开关,此时应该也会激活第一个水晶。

对其余的每个开关和水晶组合重复上述步骤。确保将 Switch (1) 与 Crystal (1) 匹配,并将 Switch (2) 与 Crystal (2) 匹配。每个开关现在会向 Counter 及相应的水晶发送命令。

用户界面 (UI) 提示
要完成开关游戏元素,我们需要提示用户这些开关的功能及其重要性。最常见的方法是通过主角与玩家对话。在 3D 游戏套件中,此提示采用 InfoZone 预制件的形式。
- 在 Project 视图中,选择 3DGamekit > Prefabs > Interactables,然后选择 InfoZone 预制件
<IMAGE>
- 将 InfoZone 拖到 Hierarchy 中的 ----- UI ----- 组下方
务必将 InfoZone 添加到空标签之下
- 将球形碰撞体移动到开关上,并调整碰撞体的大小以包括区域内的所有 3 个开关,但不要太过,因为你不想在 Ellen 远离开关时显示触发器。

- 在 Inspector 中,将 Layer 设置为 Environment(如果系统尚未自动进行此设置)

- 在 Inspector 中,启用 Sphere Collider 组件的 Is Trigger

下一步是链接 DialogueCanvas 预制件,从而让游戏可以在玩家进入触发器区域时使用游戏命令向玩家提供有关开关的必需信息。
- 选择 3DGamekit > Prefabs > UIPrefabs,然后找到 DialogueCanvas 预制件

- 将 DialogueCanvas 拖到 Hierarchy 中的 UI 下方
- 停用此预制件,因为我们只希望在玩家进入 InfoZone 的触发器区域时才显示此预制件
- 选择场景中的 InfoZone,然后在 Inspector 中找到 Interact on Trigger 脚本组件
- 将 Layers 设置为 Player(如果系统尚未自动进行此设置)
- 通过将 Dialogue Canvas Controller 脚本拖入空对象字段,将 On Enter (Object) 和 On Exit 设置为此脚本

- 将 On Enter 函数设置为来自 DialogueCanvasController 函数列表的 ActivateCanvasWithText
- 更新文本字段以向玩家提供一些有用文本。我们使用了以下文本:
- “If I switch all of these on maybe the door will open”

- 将 On Exit 函数设置为 DeactivateCanvasWithDelay,并将 Delay 设置为等于 1

现在已将所有对象放置完毕,接下来你可以将开关和水晶移到其他区域,并将它们隐藏,让玩家无法看到,从而使游戏更具挑战性。“游戏命令”链接保持关联状态,并让你可以在关卡中更动态地使用这些对象。务必将 DialogueCanvas 添加到多个区域,从而向玩家告知你项目中的关键游戏机制。
11. 进一步深入了解敌人
3D 游戏套件包含 3 个预制的敌人:Chomper、Spitter 和 Grenadier。
所有这三个敌人均由 EnemyController 脚本控制,每个敌人均附加有特定的行为(ChomperBehavior、SpitterBehavior 和 GrenadierBehavior)。
Chomper

Chomper 是近战敌人,在发现玩家时会跑向玩家,并在距离足够近时发动攻击。
Time To Stop Pursuit 设置是在 Chomper 停止追赶玩家并返回原始位置之前玩家必须脱离 Chomper 视线的时间长度(以秒为单位)。
Spitter

Spitter 在发现玩家后会向玩家发射爆炸性酸液。如果玩家离 Spitter 太近而 Spitter 目前没有发射酸液,Spitter 就会尝试逃跑。
Flee Distance(逃跑距离):逃跑过程中,一旦距离玩家足够远,Spitter 就将停止逃跑并继续攻击。
Grenadier

Grenadier 是一个更强悍、更高大的敌人。如果玩家在很远的地方,则 Grenadier 会向玩家发射弹跳手榴弹。如果玩家在正面且很近,则 Grenadier 会击打玩家。如果玩家离 Grenadier 很近,但不在正面,则 Grenadier 会在破坏性爆炸中展开临时护盾。
只有从背后攻击 Grenadier 的发光核心才能伤害 Grenadier。
Melee Range(近战范围):如果玩家与 Grenadier 的距离小于此范围,则 Grenadier 发起拳击(如果玩家在正面)或者展开护盾。
Range(范围):如果玩家很靠近 Grenadier 而尚未进入近战范围,则 Grenadier 将向玩家发射弹跳手榴弹。如果玩家被发现但尚未进入该范围,则 Grenadier 将靠近玩家。
通用设置
所有敌人的各自行为都有 Player Scanner 属性。你可以使用该属性来设置敌人如何发现玩家。

有关这些设置的说明,请参阅 TargetScanner 文档。
此外,所有敌人都具有 Damageable 组件。该组件定义敌人的生命值以及如何伤害敌人(例如,只能从背后伤害 Grenadier)。
该组件的位置为:
Chomper 和 Spitter:位于根游戏对象上,就在自身的行为脚本旁边。
Grenadier:在 Hierarchy 中位于 Grenadier 的一个名为 DamageablePart 的子游戏对象上

Scene 视图辅助图标
选择一个敌人时,某些设置会在 Scene 视图中可视化。

蓝色圆圈代表 Player Scanner 的 Detection Radius 和 Detection Angle。敌人仅在玩家走进该圆圈后才能发现玩家。
小黄线球体是 Player Scanner 的 Height Offset(即,Scanner 的“眼睛”所在的位置)。系统将检查此球体和玩家之间的视线是否无遮挡。
红色圆圈对应于 Damageable 组件的 Hit Angle 值。玩家必须在该区域内击中敌人,才能造成伤害。
添加 Chomper
让我们将一个 Chomper 添加到场景:
- 选择 Assets > 3DGameKit > Prefabs > Characters > Enemies > Chomper
- 将 Chomper 预制件拖入场景
- 将 Chomper 放置在 Ellen 附近的某个位置,以便我们可以快速测试

我们可以看到一个非常大的蓝色区域覆盖着场景。这是 Chomper 的 Detection Radius(Chomper 可以看到的区域)。如果 Ellen 步入此区域,Chomper 将发起攻击。在 Hierarchy 中选择 Chomper 后,我们可以调整此设置:
- 在 Inspector 中,找到 Chomper Behaviour 脚本
- 在 Detection Radius 中,将值更改为 4。另一种实现方法为快速滚动各个值,将鼠标光标悬停在 Detection Radius 文字上,然后单击并向左拖动来快速减小值或向右拖动以增大值。

- 按 Play,然后跑向 Chomper 以进入其 Detection Radius 范围
当你进入 Chomper 的 Detection Radius 范围时,Chomper 会发现 Ellen 并发起攻击,但是 Chomper 会在原地奔跑而无法移动。

这是因为我们尚未告知 Chomper 的 AI 可以在哪个表面上行走。我们使用 Unity 的 NavMesh 系统来进行此设置。Chomper 的 AI 由 NavMesh Agent 组件进行处理。这样就能使 Chomper 在我们设置的表面上行走,并在世界中导航时避开障碍物及其他 Chomper、Spitter 和 Grenadier。

我们无需更改此处的任何设置,因为 Chomper 和其他敌人都已完成了设置,因此会按照特定方式行动和导航。
让我们添加 NavMesh Surface,从而将地面设置为可让敌人行走:
- 在 Hierarchy 中,选择 Plane(即地面)

- 在 Inspector 底部,单击 Add Component
- 搜索“NavMeshSurface”
- 按 Enter 键或者单击搜索结果 NavMeshSurface 以将其添加到 Plane

- 在 NavMesh Surface 脚本中,将 Agent Type 设置为 Chomper

此设置将表明哪种 Agent 可以在表面上行走。请注意,该列表中只显示 Chomper,没有列出 Spitter 或 Grenadier。这是因为所有敌人都使用 Chomper 的 Agent 设置。
- 对于 Include Layers 下拉选单,首先单击 Nothing

- 现在,在 Include Layers 下拉选单中,选择 Environment 和 Vegetation

这是取消选择多个层并重新选择所需层的快速方法。
- 单击 Bake 按钮

这将烘焙场景中的 NavMesh 并使大多数表面适合敌人行走。在 Scene 视图中,我们会看到敌人可以在突出显示的浅蓝色区域内行走。

NavMesh Surface(突出显示的蓝色区域)中的任何缝隙均表示敌人将无法在这些区域中行走。

在此示例中,我们可以看到墙壁前的缝隙。这意味着敌人将无法穿过我们设置的墙或门。
让我们按 Play 来测试 Chomper。现在我们可以跑向 Chomper,而 Chomper 将冲向我们并发起攻击。如果你朝略微远离 Chomper 的方向奔跑,则其 NavMesh Agent 将使用 NavMesh Surface 在世界中导航,从而追逐你。
如果你在场景中添加更多 Chomper 或其他敌人,这些敌人将使用相同的 NavMesh Surface;无需在添加新敌人时重复此设置。
如果现在要将新部件添加到关卡或更改场景中对象的位置,你需要返回到平面并单击 NavMesh Surface 脚本中的 Bake 来重新烘焙 NavMesh Surface。

添加 Spitter
- 将 Spitter 预制件从 3DGamekit > Prefabs > Characters > Enemies > Spitter 拖入你的场景来添加该预制件。
如果查看 Inspector,你将发现 Spitter 非常像 Chomper。

Spitter 是一种远程类型敌人。当 Ellen 离得太近时,Spitter 会通过 Fleeing Distance 属性来决定在试图攻击之前是否应该逃跑。然后会使用 Range Weapon 向 Ellen 发射酸液。
提示:如果 Fleeing Distance 大于 Detection Area,则 Spitter 仅在被检测到时才逃跑,并可能产生持续逃跑模式。
理想情况下,你最初将 Spitter 放置在与 Ellen 相距较远的位置,以使 Spitter 有更好的机会发动攻击,并对 Ellen 产生更大的威胁性。如果希望 Spitter 考虑环境,你需要将 View Blocker Layer Mask 从 DoNotDraw 更改为 Environment。

我们在场景中的更高区域添加 Spitter,以便 Ellen 在移动的平台上行走时,Spitter 比 Ellen 更有优势,使玩家更难以击倒 Spitter。
添加 Spitter 后运行场景以查看 Spitter 的行为,并尝试不同的 Detection Radius 距离和 Fleeing Distance 值。

添加 Grenadier
从 3DGamekit > Prefabs > Characters > Enemies > Grenadier 添加 Grenadier,然后将其拖入场景。

Grenadier 是 boss 级别的敌人,应对这样的敌人时,你需要考虑更多细节。在场景中选择 Grenadier 时,Damage Radius 设置为 Rear,只是为了迫使玩家瞄准 Grenadier 的核心。

行为脚本非常类似于 Chomper 和 Spitter,但通过以下不同功能的属性结合了近战和远程攻击:Fist Weapon、Grenade Launcher 和 Shield。
要查看 Damageable 组件,请在 Hierarchy 中展开 Grenadier 并找到 DamageablePart

你将看到 Damageable 脚本以及与生命值、无敌状态持续时间和击中区域有关的内容。

在 Damageable 组件的事件区域中,有一些附加到 Grenadier 的函数:On Death、在击中时显示粒子的函数以及在击中时重置弱点的函数。

12. 创建陷阱
在收到向一些 Spitter 投掷箱子的游戏命令时,我们将使用游戏命令来旋转对象。
- 在 Hierarchy 中的 Gameplay 组下创建一个新的空游戏对象
- 将此对象命名为 PlatformTrap

将 PlatformTrap 的位置移动到你希望旋转平台的任何位置。此位置将用作旋转平台的轴心点。

对轴心点进行变换现在意味着我们在后续步骤中附加其他游戏对象,围绕轴心点位置(而不是游戏对象的当前位置)旋转这些游戏对象。
- 将 PlatformShort 从 3DGamekit > Prefabs > Environment > Stonework 拖入到 Hierarchy 中,然后将该预制件的位置变换到轴心 PlatformTrap 附近的位置

- 对同一文件夹内的 PlatformSupportShort 预制件执行同样的步骤,将这个预制件变换到平台下方。
- 在 Hierarchy 中,选择 PlatformShort 和 PlatformSupportShort
- 在 Inspector 中,禁用 Static 参数。这样做将允许游戏对象在父对象旋转时随之移动。

- 在 Hierarchy 中保持这两个对象的选中状态,将它们拖到 PlatformTrap 空游戏对象上,使结果如下所示

提示:对象应该被蓝色气泡围绕才能被添加
选择父级 PlatformTrap

- 在 Inspector 中选择 Add Component 以添加 Game Command Receiver 和 Simple Rotator 组件。

这样将会允许父组 (PlatformTrap) 接收游戏命令并旋转子对象,而无需进行单独设置。
让我们来更改 SimpleRotator 组件中的一些设置,以使旋转更逼真可信。
更改以下设置:
- Interaction Type:Activate
- Is One Shot:已选中
- Accel Curve:线性递增(单击此框并选择第二条默认线)
- Loop Type:Once
- Axis Z:1
- End Angle:-60

如果你移动 Preview Position 滑动条,应该会看到 PlatformTrap 类似于陷阱门一样旋转。

提示:如果该对象的行为不符合预期或者旋转方式很奇怪,请从 Hierarchy 中的 PlatformTrap 组中将 PlatformShort 和 PlatformSupportShort 取出,将 PlatformTrap 移到你需要旋转的位置,然后将 Platform 和 Support 添加回该组中。
与 MovingPlatform 教程相似,让我们使用压力垫来激活 PlatformTrap 上的旋转。
- 将 PressurePad 从 Prefabs > Interactables 拖到场景中的 PlatformTrap 附近

- 选择 PressurePad,然后将 PlatformTrap 组从 Hierarchy 拖入 Game Command Receiver 的 Send On Trigger Enter 的 Interactive Object 字段中
- 将 Interaction Type 更改为 Activate

应该会有一条可视链接显示发送和接收方向

- 此时运行场景,压力垫会激活旋转。

- 为了伤害 Spitter,请从 3DGamekit > Prefabs > Interactables 中添加一个 DestructibleBox,为此需要将该预制件拖入场景并变换到所需位置,放置于 PlatformTrap 上。
- 在 Hierarchy 中,展开 DestructibleBox 组并选择 DestructibleBox 子游戏对象。

- 在 Inspector 中,添加 Contact Damager 组件,并将 Damaged Layers 设置为 Enemy

Amount 值应与敌人的 Damageable 组件中的 Max Hit Points 值匹配。
- 运行场景并激活陷阱以查看箱子是否会击中下方的敌人。

13. 添加重生检查点
检查点是大多数现代游戏的常见元素。你可以在 3D Gamekit > Prefabs > Utilities > Checkpoint 中找到游戏套件所提供的预制件。

Ellen 死后,她将在所触碰到的最后一个检查点处重生。为确保玩家获得有关他们将在何处重生的更新信息,你应该在游戏中使用对象或视觉提示来说明玩家已触及检查点。
在此示例中,我们要将另一个水晶 (Crystal) 添加到场景中,这次将由“进入检查点”事件通过发送“游戏命令”来激活。
- 要添加检查点,你只需将检查点拖放到场景中并调整位置以确保玩家可以进入碰撞体。请调整大小以确保此区域不会太大。

- 在 Inspector 中,将 Layer 设置设为 Checkpoint。

- 从 3D Gamekit > Prefabs > Interactables 中添加一个水晶 (Crystal)
- 将该水晶放在检查点区域附近

- 为了在 Hierarchy 中使此水晶的用途更明显,请在 Inspector 中将其重命名为 CheckpointCrystal
- 选择 Checkpoint 以链接这两个对象
- 单击 Add Component
- 键入 Send On Trigger Enter
- 通过按 Enter 键或单击搜索结果来确认添加组件

- 将 Interaction Type 设置为 Activate
- 将 One Shot 设置为已启用
- 将 Layers 设置为 Player。这样就会允许 Ellen 与该区域碰撞
- 通过选择相应的游戏对象,将 Interactive Object 设置为 GateCheckpoint

- 为了验证两者之间的关联性,请选择 CheckpointCrystal,并在 Inspector 中验证 Game Command Receiver 是否已附加 Sender

此时按 Play 以运行游戏,并走入检查点以查看水晶现在是否在进入时激活。激活后,杀死 Ellen 将使她在检查点体积的中心位置重生。

14. 拾取武器
在 3D 游戏套件中,默认情况下,Ellen 已激活自己的武器,可以攻击怪物。在本示例中,我们将考虑禁用她的攻击能力,并在基座上拾取某个对象时再次激活攻击能力(类似于游戏的演示关卡的运作方式)。
- 要禁用 Ellen 的攻击能力,请选择 Ellen,然后在 Inspector 中找到 Player Controller 组件
- 禁用 Can Attack 设置

在 3DGamekit > Prefabs > Interactables 中找到 Weapon Pedestal 预制件,然后将其拖入场景以进行添加。

- 在 Hierarchy 视图中,展开 WeaponPedestal 组以显示该预制件中的其他游戏对象。

三个游戏对象为:
- StaffTakeTrigger
- WeaponPedestal
- Staff
- 在 Hierarchy 视图中选择 StaffTakeTrigger 游戏对象
在 Inspector 中,你会看到已有 Sphere Collider 组件以及 Interact On Trigger 脚本组件,并且脚本属性中存在一些预定义值。这是为了节省基座的设置时间,并让你可以使用现成的逻辑,而无需编写代码。

为了允许基座更新 Ellen 的攻击能力,我们需要从 Hierarchy 附加 Ellen 游戏对象。
- 将 Ellen 从 Hierarchy 视图拖入顶部属性字段。该字段接受这个游戏对象后,从标题为 PlayerController.SetCanAttack 的下拉选单中选择一个函数,此设置将默认为 True(已启用)。

- 运行场景,Ellen 应该不能在生成时攻击,随后走到基座上,碰撞体应该会激活 Ellen 的攻击能力,并让棍棒消失。
15. 恢复生命值
在本教程中,我们将允许 Ellen 在遭受敌人攻击后恢复失去的生命值。此过程会使用 Ellen 的 Damageable 组件,并使用 ResetDamage() 使 Ellen 完全恢复。
添加 Spitter 敌人
为了确保 Ellen 受到伤害,并允许你快速测试生命值系统,我们将在场景中的 Ellen 起点附近放置一个 Spitter 敌人。
在打开的场景中导航到 Hierarchy 视图,并在 3DGamekit > Prefabs > Characters > Enemies > Spitter 文件夹中找到 Spitter

将 Spitter 拖入到 Scene 视图中,然后调整其位置和旋转以符合你的需求。确保 Ellen 处在蓝色检测圆圈内,以便你一进入运行模式,Spitter 就会看到 Ellen。这样会节省时间,因为你无需跑向更远位置的敌人。

要调整 Detection Radius,请在选中 Spitter 后在 Inspector 视图中找到 Spitter Behaviour Script 组件。
更改 Detection Radius 字段。本示例中使用的是 8,但如果需要,请调整大小以适合你的特定设置。

添加 Health Crate
在 Hierarchy 视图中,通过在搜索框中搜索“Health Crate”来查找 HealthCrate 预制件

或者在 3DGamekit > Prefabs > Interactables > HealthCrate 文件夹中找到该预制件

将 HealthCrate 预制件从 Hierarchy 视图拖入 Scene 视图,然后将此预制件放入合适位置。根据你的喜好进行旋转和移动。

在 Scene 视图中选择 HealthCrate 后,观察 Inspector 视图中的 Interact On Trigger (Script) 组件。

此脚本组件允许 HealthCrate 调用与一组游戏对象相关的事件,从而允许游戏对象与 HealthCrate 之间进行交互。在此示例中,玩家将 Ellen 移向其碰撞体区域时,就会发生这些情况。
目前还没有设置任何游戏对象或函数来恢复 Ellen 的生命值,所以如果我们现在尝试在运行模式下与 HealthCrate 碰撞,什么情况都不会发生!
试一试,进入运行模式,让 Ellen 受到 Spitter 的伤害,并尝试通过与 Health Crate 碰撞来恢复她的生命值。
Interact On Trigger
为了确保 Ellen 完全恢复,需要将场景中的游戏对象添加到 Interact On Trigger。
注意:如果愿意,可以采用拖放方法来执行以下步骤,但是我们将研究改用圈选方法。
如果你决定这样做,请确保通过 Hierarchy 视图在当前场景中使用 Ellen,而不是通过 Project 视图使用预制件。
如果在运行模式期间取消选择了 HealthCrate,请再次进行选择。
在 On Enter() 的空白 Object 字段中,按圈选按钮

选择顶栏中的 Scene 选项卡。默认情况下会选中 Assets。

搜索 Ellen(如果已重命名玩家角色,应该搜索相应的名称)

选中“Ellen”(其他均与特定部件有关)。
现在已将 Ellen 选为与 OnEnter() 交互的游戏对象,接下来便可以选择此函数来恢复生命值了。
Ellen 旁边的 Interact On Trigger (Script) 下拉菜单字段目前显示为 No Function。

在下拉菜单中,选择 Damageable > ResetDamage()

现在,此步骤已在场景中将 HealthCrate 与 Ellen 关联起来以用于恢复生命值,因为在 Ellen 进入碰撞体时,HealthCrate 将调用 ResetDamage()。
此时运行关卡以测试 Spitter 造成的伤害,与 Health Crate 的碰撞现在将完全恢复她的生命值。
16. 场景传送
场景内传送
为了在场景内传送玩家,我们需要设置一种过渡。为此,我们将创建两个预制件:
- TransitionStart
- TransitionEnd
首先,我们需要设置过渡的起点:
- 在 Project 窗口中,选择 Prefabs > SceneControl
- 找到 TransitionStart 预制件
- 将 TransitionStart 拖到 Scene 视图。
- 将这个预制件放置在玩家行走时接触碰撞体(绿框)的位置。在下面的示例中,我们将预制件放置在门的另一侧:

要设置目的地,请执行以下操作:
- 将另一个 TransitionStart 预制件从 SceneControl 文件夹拖入 Scene 视图中
在 Inspector 中:
- 将该预制件重命名为 TransitionEnd
现在,我们将两者关联在一起:
在 Hierarchy 中,选择 TransitionStart 游戏对象
在 Inspector 中,找到 TransitionPoint 组件
将 Ellen 游戏对象从 Hierarchy 拖入 Transition Point 组件的 Transitioning Game Object 字段
将 Transition Type 设置为 Same Scene

这样可确保 Ellen 是传送的唯一对象,并且是在同一场景中传送她。
现在,让我们来设置目的地:
- 将 TransitionEnd 游戏对象拖入 TransitionPoint 组件的 DestinationTransform 字段。
- 将 Transition When 设置为 On Trigger Enter

On Trigger Enter 表示仅在玩家进入碰撞体时(而不是按键时)激活过渡。如果你希望仅在玩家按下交互键 (E) 时才进行传送,请将 Transition When 设置为 Interact Pressed。
传送到另一场景
要使玩家过渡到新场景,我们需要两个预制件:
TransitionStart 与上一节中使用的预制件相同,可将玩家“发送”到目的地。此预制件包含一个 Transition Start 组件。该组件可以定义传送起点位置以及传送应将玩家送到何处等所有属性。将此预制件放置在你希望过渡开始的位置。
TransitionDestination 是一个“接收”玩家的预制件。此预制件包含一个 Transition Destination 组件。将此预制件放置在你希望过渡到的另一个场景中。
请参阅 3D 游戏套件资源包内包含的组件参考指南以了解这两个组件的完整详细信息。
设置 TransitionDestination
让我们首先设置目的地,以便获得稍后在我们设置起点时需要的所有信息。要向场景添加过渡,请打开该场景,导航到 Project 窗口,然后选择 Prefabs > SceneControl > TransitionDestination。将此预制件放置在场景中你希望传送器到达的位置。
TransitionDestinaton 预制件包含一个 Scene Transition Destination 组件:

- 首先,将 Destination Tag 设置为一个字母。
具体设置为哪个字母不重要,只要具有该字母的这个 Scene Transition Destination 组件在场景中具有唯一性即可。
下一步,指定应该接收哪个游戏对象。将玩家游戏对象 (Ellen) 从 Hierarchy 窗口拖到 Transitioning Game Object 字段。

最后,确保你的目的地场景位于编辑器的 Build Settings 中。
- 为此,请选择 File > Build Settings,然后单击 Add Open Scenes。

设置 TransitionStart
这些设置与上一节中的相应设置基本相同,但有一些差异:
- 将 Transition Type 设置为 Different Zone
- 将 New Scene Name 设置为要发送到的目的地场景。
- 将 Transition Destination Tag 设置为你在 Transition Destination 组件中设置的 Destination Tag 字母。

- 按 Play 并走到过渡所在的位置。你应该一直走到 Zone1 的起点!