第 5 部分:添加金币和积分
简介
完成第 4 部分后,你现在应该已经有了一个关卡和一个可以跑跳的角色。
现在,我们需要给玩家一个目标。在本教程的这一部分中,我们将添加可收集的硬币和一个用来统计硬币数量的分数。
藏在砖块里的硬币是 Mario 最具标志性的特色之一。让我们从创建这一功能开始本教程吧。
将硬币藏在砖块里
撞击砖块
我们会先创建第一个砖块,并采用一种便于快速修改的方式,让它可以装入任意数量的硬币。完成后,你可以复制这个砖块,并将它放在想要的位置。
本教程基于第 4 部分,并假设你已经从 Hub 分支出了第 4 部分的项目。
先选择一个要藏硬币的砖块。在对象属性中,轻点“Behaviors”按钮,打开行为编辑器。
在 Object 分类中,添加 Collided 行为。每当两个指定对象互相接触时,Collided 行为就会触发一个事件。
轻点刚添加的 Collided 行为,查看其属性。你会看到两个用于选择对象的框(分别称为 Object A 和 Object B)。第一个框(Object A)已自动选中,它就是你要应用这些行为的对象。你可以轻点此处进行更改,不过我们先保持原样。
空框用于选择第二个对象(Object B),Collided 行为会检测它与第一个对象之间的碰撞。轻点空框,然后选择你在本指南第 4 部分中添加的玩家角色。
选好对象后,你可以设置 Object B 的哪个部分会触发碰撞事件。关闭所有开关,只保留“On Top”选项。这样,只有玩家角色的顶部碰到砖块时,Collided 行为才会生效。
现在砖块会检测玩家的头部是否碰到它,接下来让砖块上下弹跳。为此,我们会使用 Move By 行为先向上移动砖块,再让它回到原位。
在 Transform 分类中,添加 Move By 行为,并将其连接到之前添加的 Collided 行为。
轻点 Move By 行为,查看其属性。我们希望玩家撞到砖块时,砖块向上移动,因此要修改 Y Value。将它设置为一个较小的数值,这样砖块只会轻微弹起。我使用的是 0.20 米。
你还需要修改 Duration。Duration 是完成移动所需的时间。默认值为 1,这意味着砖块会在 1 秒内移动 0.2 米,对我们的需求来说太慢了。将 Duration 改为 0.10 秒。
**注意:**如果将 Duration 设为零,对象会立即移动到新位置,不会平滑地播放动画。另外,请留意标有“Linear”的框。这是应用于移动的运动补间效果。如果行为设置了 Duration,对象就会按照此效果移动。
现在让砖块弹回原位:再添加一个 Move By 行为,并将它连接到前一个行为。
再次修改属性。这次我们要让砖块向下移动。要让它向下移动,请将 Y Value 设为负数。由于我们希望砖块回到原位,因此将它设置为 -0.20 米。你还需要将 Duration 改为 0.10 秒。
此时按下播放,玩家就可以从下方撞击砖块,砖块也会上下弹跳。不过,我们还需要解决几个问题。
-
我们的逻辑有一个小问题。如果玩家不停地快速跳跃,没有等砖块回到原位,砖块就会不断向上移动。
-
砖块会一直弹跳。如果我们只想让它吐出几枚硬币,并在硬币用完后停止,该怎么办?
-
现在它还不会给玩家硬币。
我们先解决问题 1。这其实很容易修复:玩家撞到砖块时关闭碰撞行为,砖块完成移动后再重新开启。
为此,切换到 Custom 分类,添加“Behavior Off”,然后将它连接到 Collided 行为。
接下来,在 Behavior Off 属性中,轻点标有“Select Behavio r”的空框。在列表中找到正确的 Collided 行为。请注意,列表会显示所有对象的全部行为,并按照对象名称排序。
现在,你需要在砖块弹跳结束后重新开启 Collided 行为。只需在 Custom 分类中添加一个 Behavior On 行为,并将它连接到第二个 Move By 行为。在该行为的属性中,务必选择要重新开启的 Collided 行为。
针对问题 2,我们会使用一个盒子容器来设置每块砖里有多少枚硬币。这样就可以轻松地调整特定砖块里的硬币数量。
首先,在 Custom 分类中添加一个盒子容器。它不需要连接到任何东西,因此可以放在屏幕上的任意位置。你也可以将这个盒子容器重命名为“Coins”,以便稍后查找(如果想了解如何重命名行为,请参阅第 4 部分)。
在 Coins 盒子容器的行为属性中,将“Default Value”属性改为 3。这就是砖块里硬币的数量。
现在,在 Logic 分类中添加一个 Add Values 行为,并将它连接到之前添加的第二个 Move By 行为。我们会用这个 Add Values 行为记录玩家每次撞击砖块的次数。
连接好 Add Values 行为后,轻点它以查看行为属性。属性中有两个输入框,Add Values 行为会输出所输入数值的总和。
这里我们要用相加结果统计撞击次数,因此在上方的输入框中输入 1,然后将 Add Values 行为的相加结果输出到第二个输入框中。
这样,每次运行该行为时,相加结果都会递增。第一次运行时,由于还没有相加结果,因此计算的是 1+0。第二次运行时,会计算 1+1,因为上一次的相加结果已保存下来。
接下来,你需要检查 Add Values 的相加结果是否与之前添加的 Coins 盒子容器中的值相同。
为此,在 Logic 分类中添加一个 IF 行为,并将它连接到上一步的 Add Values 行为。
连接 IF 后,轻点它以查看行为属性。IF 行为会根据两个输入框的值和所选条件,检查指定条件是否成立。
在这里,我们会输出(共享)Add Values 行为的相加结果,并将它放入 IF 的第一个输入框。
然后将盒子容器的内容输出到第二个输入框。
输入这些值后,只有当 Add Values 的相加结果等于 Coins 盒子容器中存储的值时,连接到 IF 的下一个行为才会执行。
现在,你需要关闭 Collided 行为,并更换砖块的图像,这样玩家就不能再获得硬币了。为此,在 Custom 分类中添加一个新的 Behavior Off 行为,并将它连接到 IF。和之前一样,选择要关闭的 Collided 行为。
为了让玩家知道硬币已经用完,你可以在 Transform 分类中添加 Change Graphic 行为,并将它连接到 IF。
连接好之后,在 Change Graphic 行为属性中选择一张新图像。轻点行为属性中的第二个框,然后选择新图像。
现在按下播放,你可以跳起来撞击砖块三次,然后砖块就会停止。
获取分数
设置 UI
接下来要做的,就是让玩家在撞击砖块时实际获得分数和硬币!
首先,我们要在屏幕角落添加一个计数器,告诉玩家目前获得了多少分。
按下返回按钮,从行为编辑器返回主编辑器。然后轻点屏幕右侧的三个点,调出 Layers 栏(也可以从屏幕边缘向内滑动)。
选择 Global UI 图层。UI 图层位于场景中的其他图层上方,通常用于放置按钮、摇杆和标签。UI 元素会固定在屏幕上的同一位置,并会随着场景中的其他内容一起移动。
注意:放置在 Global UI 图层上的对象会出现在项目的每个场景中。如果只想让对象出现在一个场景中,请使用 Scene UI 图层。
选中 Global UI 图层后,轻点 Dock 上的 Special Objects 烧瓶图标,或将它拖入场景。
在弹出菜单中选择 Label,场景中就会放置一个标签。
轻点新添加的标签,打开对象属性。在标签属性中,你可以更改文字颜色、字体、显示内容等。
轻点较大的文本框,将文字改为“分数:”。
接下来,轻点“Alignment”展开对齐属性。将 Width 设为 110,将 Height 设为 64。
注意:将这两个值设为 0 会移除文本区域,使文字可以无限向水平方向延伸。
标签属性设置完成后,使用 Move/Transform 工具将新标签放到屏幕角落,并确保它不会遮挡玩家的视野。
放好标签后,再向场景中添加一个标签。我们会用它来显示分数。这次将文字设为 0,因为玩家初始分数为零。和之前不同,这次我们要指定宽度和高度。将 Width 设为 500pt,Height 设为 64pt。这样就会创建一个固定大小的区域,用于显示文字。如果文字太多,超出该区域,就会被截断。
另外,将水平对齐方式设为左对齐(Flush Left)。
完成标签属性设置后,将它放到“分数”标题旁边。
获取分数
现在,我们需要让玩家每次获得硬币时增加分数。切换回主图层,然后返回藏有硬币的砖块的行为设置,添加所需的行为。
在 UI 分类中,将“Add To Score”行为拖到画布上,并将它连接到本指南前面添加的第二个 Move By 行为。
接下来,轻点 Add To Score 行为,并打开 Infinite Score 开关。如果此开关关闭,那么达到指定分数时,下一个行为就会触发。另外,请确保已选择 “0” 标签作为正确对象,因为 Add To Score 行为会自动选择场景中的一个随机标签。
现在按下播放,玩家每次撞击砖块都会获得 1 分。
现在,你可以复制这个砖块(如第 3 部分所学),并将它放置在关卡各处。
单独放置的硬币
你的第一枚硬币
有时,你可能只想在关卡中直接放置硬币,而不是把它们藏在砖块里。操作相当简单,下面我们就来讲解。
先将硬币图像添加到场景中,然后轻点它以查看对象属性。
在对象属性底部,确保选中 physics 标签页。
在 physics 标签页中,将硬币设为可穿透。这样玩家就可以继续跑过硬币,不会被挡住或减速。
接下来,我们要调整硬币的碰撞边界。碰撞边界定义了对象的物理形状,大小或形状可能与对象的视觉外观不同。要调整碰撞边界,请轻点 Collisions 图标。
在 Collision Editor 中,你可以使用左侧的工具栏来修改碰撞形状,或创建独特的碰撞形状。
本指南中,我们会选择“Circle”选项来创建圆形碰撞边界。
接下来,拖动圆形上的绿色圆点来调整碰撞边界的大小。让碰撞边界与硬币大小相同。请注意,如果碰撞边界大于对象,那么玩家还没实际碰到硬币图像,就可以与它互动。
完成碰撞边界的创建后,轻点工具栏中的勾号图标,确认并保存新形状。
再次轻点硬币以查看对象属性。这次打开硬币的行为编辑器。
在 Object 分类中,将“Collided”行为添加到画布上。和之前一样,打开 Collided 行为属性,并将绿色太空人玩家选为 Object B。
接下来,在 UI 分类中,将 Add to Score 行为拖到画布上,并将它连接到 Collided 行为。同样,在行为属性中打开 Infinite Score 开关,并确保选中了正确的分数标签。
最后,在 Object 分类中添加 Destroy Object 行为,并将它连接到 Collided 行为。这样玩家一碰到硬币,硬币就会被彻底移除。
按下播放后,现在你就可以碰到硬币,让它消失。
就这样!现在你的平台游戏里已经有可收集的硬币了。接下来只需复制硬币,并把它们放置在关卡各处。试着发挥创意来安排硬币的位置吧!
你可以从 Hub 下载第 5 部分的完成版本,看看实际效果。
在第 6 部分中,我们将加入敌人,为游戏增加一些难度。


