游戏原型系列 vol.16 3D游戏套件演练 part2
摘要
本节我们还是接着上一节继续使用3D Game Kit这套工具,快速搭建游戏场景。
7.组织场景
在Unity中创建任何场景时,保持层次结构中的内容整洁很重要,这样您就可以轻松找到所需的对象或游戏机制。以下是一些技巧,可以使您的项目保持美观和井井有条,尽管并非必须使用此工具包。
在层次结构中,我们创建了一些部分来帮助对场景中的对象类型进行排序。

这些由空的GameObjects组成。它们除了帮助我们识别场景中物体的类型外没有其他功能。请注意,每个命名节下面的所有对象都不是该节的子对象,也不应该是该子对象的子对象。
让我们创建一个新部分来存储所有额外的装饰。
在层次结构的顶部,转到“ 创建” >“ 创建空物体”

这将在层次结构的底部创建一个名为GameObject 的新的空GameObject 。

在层次结构中,确保GameObject 突出显示为蓝色,表明您已选择它。我们现在可以重命名它;
导航到检查器
在检查器顶部,单击“名称”字段
输入名称-----Environment-----
以这种方式命名将在您拥有更多内容时帮助您查找对象。

现在让我们将CliffBig01 移到正确的部分,以便稍后找到它。
在层次结构中找到CliffBig01
左键单击,按住并拖动CliffBig01,直到它处于-----Environment-----中,然后松开左键

提示:确保不要放开左键单击另一个对象的顶部,因为这会使它成为子集。
当某物在拖动时成为对象的子对象时,有一个视觉指示器,它看起来像这样;

将对象拖到-----Environment----- 下时,请确保看到一条水平线。这表明它将像下面那样放置对象;

如果您不小心将其作为标签的子标签放置,只需将其移回并重试即可。
8.游戏边界
建立关卡时,您可能会发现在测试中,您可以轻松地从关卡中逃脱,并走到希望玩家能够去的地方。不能总是通过添加更多的几何体来解决此问题,我们可以添加不可见的墙以防止玩家逃脱。
为此,我们可以在一个空的GameObject 上添加一个Collider 并将其添加到场景中;
在层次结构的顶部,转到“ 创建” >“ 创建空物体”
在检查器中将此重命名为GameBoundary
在检查器中,单击“ 添加组件”。
在搜索框中输入Box Collider

单击Box Collider ,将其添加到刚创建的GameBoundary GameObject 中
现在,让我们在场景中找到该对象;
在层次结构中选择GameBoundary
将鼠标悬停在“ 场景视图”上
按˚F 键盘上的到框架中选择的对象。

该盒形碰撞体是一个绿色的轮廓可见。将对象定位,旋转并缩放到关卡中的任何问题区域。
我们需要确保该对撞机将阻止Ellen通过它。我们为此选择了一个特定的图层,并选择了GameBoundary 。
在检查器中,单击“ Layyer” 下拉菜单
左键单击环境将其设置为该图层。

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

9.深入了解移动平台
我们将看一下使用套件添加各种游戏元素的方法。我们已经设置了一个演示级别来显示这些场景,您可以使用自己建立的场景进行跟踪,也可以使用新场景。
如果您使用了2D游戏套件,尽管我们已经调整了一些元素以简化工作流程,但其中某些技巧可能是熟悉的。
移动平台可用于将您的播放器从一个地方移到另一个地方,让我们在场景中添加一个;
导航到“ 项目”窗口
转到Assets> 3D GameKit > Prefabs>Interactables

在Interactables 文件夹中,您可以找到为此工具包创建的预制游戏元素。
左键单击并将MovingPlatform 预制件拖动到“ 场景视图” 或“ 层次结构”中
注意:如果将其移到层次结构中,请不要忘记使用“ 框架选择” 来找到它(键盘快捷键-F)
您还可以通过“变换”组件中的检查器来定位,旋转和缩放对象

提示:将鼠标悬停在X,Y或Z和“左键单击”上,向左或向右拖动将分别增加或减少这些值。
将整个对象放置在您希望平台开始的位置。
我们已将其定位在我们先前创建的“酸池”之上。

现在,让我们看一下制作平台并设置其路径,以更改平台要移动到的位置。
Gizmos
移动平台附带3个小控件,可让您轻松更改平台的运动。在屏幕上,您可以看到它允许您设置“变换位置”以将其放置在世界(1),开始位置(2)和结束位置(4)中,并且在虚线平移线上显示的距离(3)。

在“检查器”窗口中,找到“ Simple Translator”(脚本),然后选中“ Activate(激活)”框以启用MovingPlatform 的移动。

如果在此过程中您在“ 激活” 之前选中了“ 开始” 位置,则将注意到“ 移动平台” 将捕捉到“ 开始” 位置,而不是在“ 变换”中设置的初始位置。这是为了确保平台始终从正确的位置开始,并根据“Simple Translator脚本”中设置的行为进行转变 。
提示:移动Gizmo时按住Ctrl(Cmd)键可将其捕捉到网格并增加移动,这确实有助于获得直线路径。
Ellen需要穿越环境并避免酸池,因此需要调整End Gizmo,否则它将执行默认的“ Z轴平移”,这对玩家不是很有帮助。
要在编辑器中查看“ 移动平台” 的当前平移运动,可以将“ 预览位置” 的滑块移动到0到1的范围内。您将在“ 场景” 窗口中看到平台移动到游戏中的位置里调动的那个平台。

这是一项非常有用的功能,可帮助您查看场景中与其他GameObject的任何潜在重叠或预览行为。
持续时间
要更改从开始到结束的顺序速度,您可以更改持续时间值,该值默认设置为5,以秒为单位。减小此值将导致更快的序列,而增大值将导致较慢的转换。
设置移动平台
单击“结束Gizmo”上的Y手柄(绿色),按Ctrl(Cmd)捕捉,然后将其向下拖动到所需的高度。

在此示例中,我们希望它是向下的平移。拖动End Gizmo的Z手柄(蓝色),然后单击Snap(Ctrl / Cmd)将Gizmo拖动到起点下方。

如果现在移动“ 预览位置” 滑块,则“ 移动平台” 应朝新的“终点”位置移动。
在这个例子中的最后一步是将设置Loop type(循环型)到Ping Pong(乒乓)这是目前设定为Once。更改此设置将重复从开始到结束的顺序,然后再次返回。

循环类型
Once- 线性-从起点移动到终点,并在到达终点时停止

当您只需要将玩家从起点传输到终点时,通常使用一次循环类型。
Ping Pong- 双向循环-从开始到结束,然后从结束到开始,给出连续的运动循环。

当平台为玩家提供的路线应连续可用时,最常使用“乒乓”循环类型。
重复- 单向循环-从开始移动到结束,然后返回到开始重复。
重复循环类型最常用于单向序列,其中平台将从“开始”生成并移至“结束”。这可以在3D游戏套件(3D游戏套件>Scenes(场景)>Gameplay(游戏方式))的2级酸性坑中看到。

带压垫的游戏命令
游戏命令使场景中的游戏对象可以通过发送和接收命令与其他游戏对象进行通信。这可以帮助您设计复杂的行为和脚本。
游戏命令基于发生的事件,并且在3D游戏套件中随对象的不同而变化。在此示例中,我们将研究如何设置PressurePad 预制件,该预制件将使用“游戏命令” 激活在MovingPlatforms 教程中添加的MovingPlatform 预制件。
要为MovingPlatform 准备来自PressurePad的交互作用,请禁用Activate属性。

Linking Interactable Object(链接可交互对象)

转到“ 项目” 视图,然后导航到3DGamekit>预制件>交互对象。
将“ PressurePad(压力板)” 从“ 项目” 窗口拖放到将要与“ 压力板” 耦合的“ 移动平台” 附近的“ 场景” 视图中。

在Inspector中,您将要编辑的组件是“触发时输入Enter” 脚本。

通过此脚本,您可以使用“ 交互式对象” 选择将其他游戏对象挂钩,该选择将“ 游戏命令接收器” 链接到“ 层次结构”中的相关GameObject 。
在此示例中,我们将链接到“ 层次结构” 视图中已经存在的MovingPlatform 。
为此,请单击“ 交互对象” 的“ 选择” 按钮,选择“ 移动平台”,然后将“ 交互类型” 设置为“ 激活” 。

从PressurePad 到MovingPlatform,您应该在“场景”视图中看到一条带有方向箭头的链接线。此形象化两个GameObjects和节目流之间的关系的发件人到接收器为游戏命令。

玩游戏并在One Shot PressurePad 上行走(应保持按下状态)以激活MovingPlatform并开始循环序列。
10.使用计数器和开关
我们可以将多个对象连接在一起。接下来,我们将研究在打开门之前使用计数器对3次开关激活进行计数。
首先,请转到“ 项目”窗口>“ 资产” > 3DGameKit >“ 预制件” >“可交互对象” 。通过将它们拖动到“ 场景视图”中,添加一个Switch 和DoorSmall 。
现在,让我们连接Switch(开关)和DoorSmall,以便在激活开关时打开门。
在层次结构中,单击“ Switch” 将其选中

在层次结构中,单击并将DoorSmall 拖放到Interactive Object的“Send On Trigger Enter(触发时输入)” 组件中的“ 交互式对象” 插槽中。

在“ 场景视图”中,应该有一条白色箭头线,显示从Switch 到DoorSmall 的连接。

在层次结构中,选择“ Switch”
按Ctrl + D (在Mac上为Cmd + D )以复制该Switch
再重复一次,即可获得另一台Switch
您应该看到Switch ,Switch(1)和Switch(2)。
这些将显示在层次结构的最底部。为了使您的项目井井有条,请按住Ctrl键并单击(Cmd +单击),然后将它们一起拖动到“ 层次结构”中。

它们将在与原件相同的位置复制;
在“ 层次结构”中,分别选择每个开关,并将它们一个接一个地放置,以使它们形成一行。

您还可以看到,由于我们复制了对象,因此它也复制了与门的连接。与这些开关中的任何一个碰撞将打开门。您可以按“ 播放” ,然后尝试一下。
当所有三个开关都已激活时,我们想打开门。
在“ 项目”窗口中,转到“ 资产” >“ 3DGameKit” >“ 预制件” >“ Interactables”
找到Counter 预制并将其拖到场景中
将其放置在开关附近

该对象在场景中没有物理存在,因为它将保留游戏机制,您可以使用“ 变换工具” 来查看它。由于我们无法在场景中看到它,因此我们将通过层次结构选择“ Counter(计数器)” 。
提示:您可以通过添加标签使这些对象在“ 场景视图”中更清晰可见。
选择Counter(计数器)。
在检查器顶部,单击蓝色框。
从下拉菜单中选择一个颜色标签。

这将为您的对象添加标签。

如果看不到它,则可能是场景视图中的图标太小。您可以更改此设置;
在场景视图的顶部,单击Gizmos 下拉菜单
调整滑块,这将更改场景视图中图标的大小

现在,我们有一个计数器在可以指望一些发件人的场景,我们需要发送的计数器的“ 打开” 游戏命令每个开关。
在层次结构中,选择“Switch”
单击并将计数器拖到“ 触发时输入” 脚本中的“ 交互对象” 插槽中
这将取代“门”作为向其发送命令的对象。

箭头似乎已连接到“ 场景视图” 中的“ 计数器”。

对开关(1)和开关(2)重复上述步骤
现在,所有3个开关都将向计数器发送命令

我们可以在Counter 的Game Command Receiver 脚本中再次检查。

现在,如果我们进入“播放”模式并碰到每个开关,将什么也不会发生。当计数器达到3 时,我们需要告诉DoorSmall 打开。
在层次结构中选择计数器
在检查器中,在“ 游戏计数器” 脚本上更改以下设置
互动类型:Open
Is One Shot:正确(勾选方框)
目标数量:3

这将收到“打开”类型的命令,仅计数一次,并将目标数量设置为3。
现在,让计数器将命令发送到门。
选择“ 计数器”后,在“ 发送游戏命令” 脚本中输入以下设置
互动类型:Open
将DoorSmall 从层次结构拖动到Interactive Object 插槽
One Shot:已启用(勾选框)

现在,每个开关将向计数器发送一个命令,当计数器收到3个命令后,它将向门发送一个打开命令。

按“ 播放” 测试您的水平。完成所有3个操作后,您应该能够与每个开关发生碰撞,并且门将打开。
计数器可用于许多需要采取措施的条件。发送游戏命令允许启用和打开之外的各种交互类型:

向玩家指示进度
通常,在游戏中,我们会将这些机制彼此分开。我们已经在该项目的示例游戏中做到了这一点。通常,在游戏设计中,无论是通过用户界面还是游戏指示器来向玩家指示进度,这是一种很好的做法。
我们将调整游戏命令和计数器,以显示使用每个开关时,门附近的水晶都亮起来。这将向玩家显示世界上该门有3个开关,并指示它们已激活了多少个。
在项目窗口中,转到Assets> 3DGameKit>Prefabs>Interactable
找到Crystal 预制并将其拖入场景

对于我们的关卡来说,Crystal有点大,所以让我们调整一下它的大小;
在层次结构中选择水晶
转到检查器并查看“变换”组件
将比例设置为以下;
X:1
Y:1
Z:1

使用变形工具将水晶放置在门附近
在“层次结构中选定的水晶”下,按Ctrl + D(在Mac上为Cmd + D)两次,将其复制两次。
在层次结构中选择Crystal(1)和Crystal(2)(在Mac上为Ctrl +单击或Cmd +单击),然后拖动以在Crystal附近对其重新排序

在“场景视图”中,使用“变换工具”将晶体定位到所需位置

我们将自己的产品放在门旁边,以使其对玩家显而易见。让我们在激活开关时改变它们的颜色;
在层次结构中,选择“ Switch”
在检查器中,向下滚动到底部,然后单击“ 添加组件”
在搜索框中,输入“ Send on TiggerEnter(发送触发输入)”
点击Enter 或单击名为“ Send on Trigger Enter ” 的脚本将其添加到Switch对象

这将向开关添加另一个“按触发输入发送”脚本。当开关被激活时,我们可以使用它向Crystal发送命令以更改颜色。
在我们刚刚添加到以下内容的“触发输入时发送”脚本中设置值;
互动类型:激活
将Crystal从层次结构拖动到“交互式对象”插槽中
One Shot:启用(勾选框)
Layer:Player

激活开关后,这将向Crystal发送命令以进行激活。

通过按播放测试。使Ellen启动到第一个开关,它还应该激活第一个Crystal。

对其余的每个开关和晶体组合重复这些步骤。确保将开关(1)与水晶(1)和开关(2)与水晶(2)匹配。现在每个交换机将向计数器及其晶体发送命令。

用户界面(UI)提示
要完成开关的游戏元素,我们需要向用户提示开关的功能以及它们的重要性。这通常是通过主角与玩家的对话来完成的。在3D游戏套件中,它采用InfoZone 预制件的形式。
在“项目”视图中,转到3DGamekit>预制件>交互对象,然后选择InfoZone 预制件
<图像>
将infozone 拖到----- UI ----- 组下的“ 层次结构”中
记住将其添加到“Empty”标签下
将球体碰撞器移到开关上并调整其大小,以将该区域中的所有3个开关包括在内,但不要太远,因为您不希望触发器在Ellen远离它们时显示。

如果尚未在Inspector中自动设置图层,则将其设置为Environment

已为Inspector中的Sphere Collider组件设置“ Is Trigger(启用触发器)”

下一步是链接DialogueCanvas Prefab,当游戏使用“ 游戏命令” 进入触发区域时,该对话框将允许游戏告诉玩家所需的开关信息。
转到3DGamekit>预制件> UIPrefabs 并找到DialogueCanvas 预制件

将DialogueCanvas 拖动到UI 下的层次结构中
停用它,因为我们只希望它在玩家进入InfoZone的触发区域时显示
在场景中选择InfoZone ,然后在Inspector中找到Interact on trigger Script组件
如果尚未自动将图层设置为Player
通过将其拖动到空白对象插槽中,将“On Enter进入(对象)”和“On Exit(退出时)”设置为“对话画布控制器脚本”

从DialogueCanvasController 函数列表中将On Enter Function 设置为ActivateCanvasWithText
更新文本字段以向玩家提供一些有用的文本。我们使用了以下内容
“如果我把所有这些都打开,也许门会打开。”

将退出函数设置为DeactivateCanvasWithDelay 并将Delay 设置为1

现在,所有这些都已放置完毕,您可以将开关和水晶移动到其他区域,并将其隐藏在玩家中,以使其更具挑战性。游戏命令链接将保持连接状态,并允许您在关卡中更动态地使用对象。确保将DialogueCanvas 添加到需要向玩家通知项目中关键游戏机制的区域。