使用 Smart Shape 构建 OrbitRun | 第 4 部分:音效与收尾工作
短促的音效能让一段精彩的飞行更添乐趣。加入音乐和轨迹,再为起飞和世界变化配上各自的效果。如果关卡加载失败,你还会添加一个重试画面。
从第 3 部分继续,或者打开检查点包中的 OrbitRun-12-personal-best.tap。原始素材包包含此处使用的音频和粒子文件。仅含素材的起始项目以及之后的每个检查点都已导入这些素材。
在图示中,REUSE 表示使用你已经添加的行为。如需回顾手势操作,请参阅第 1 部分中的行为连接指南。轻点图片可查看大图。
13. 添加能记住玩家选择的音乐
先从你放在标题画面上的 Music Button 开始。
先搭建按钮
底部(true)输出会关闭音乐。右侧(false)输出会开启音乐。
- 添加名为 Music Touch 的 Started Touching。
- 添加名为 Music State 的 Get Attribute。将 Music Touch 上一个空闲的底部白色圆点连接到 Music State。
- 添加名为 Music Check 的 If。将 Music State 上一个空闲的底部白色圆点连接到 Music Check。
- 添加名为 Music Off 的 Set Attribute。将 Music Check 底部(true)的圆点连接到 Music Off。
- 添加名为 Music On 的 Set Attribute。将 Music Check 右侧(false)的圆点连接到 Music On。
**属性:**Music Touch 的目标设为 Music Button,Touch Anywhere 设为 Off,Absorbs Touch 设为 On。Music State 读取 Skimmer 的 music 属性。Music Check 检查该 Attribute Value 是否 Equals 1。Music Off 将 music 设为 0;Music On 将其设为 1。
在关闭音乐的分支中,更新标签并保存选择,然后再静音。
- 重用 Music Off。
- 添加名为 Music Off Label 的 Change Label。将 Music Off 上一个空闲的底部白色圆点连接到 Music Off Label。
- 添加名为 Save Mute 的 Modify Save File。将 Music Off Label 上一个空闲的底部白色圆点连接到 Save Mute。
- 添加名为 Mute 的 Set Music Settings。将 Save Mute 上一个空闲的底部白色圆点连接到 Mute。
**关闭设置:**Music Off Label 的目标设为 Music Label,文本为 MUSIC OFF。Save Mute 使用 Modify Save File:Set Key、Dynamic,键为 orbit-music-volume-v1,值为 0。Mute 使用 Set Music Settings:Change Volume 设为 On,音量设为 0,并使用短暂淡出。
开启音乐的分支采用相同顺序,并恢复聆听音量。
- 重用 Music On。
- 添加名为 Music On Label 的 Change Label。将 Music On 上一个空闲的底部白色圆点连接到 Music On Label。
- 添加名为 Save Unmute 的 Modify Save File。将 Music On Label 上一个空闲的底部白色圆点连接到 Save Unmute。
- 添加名为 Unmute 的 Set Music Settings。将 Save Unmute 上一个空闲的底部白色圆点连接到 Unmute。
**开启设置:**Music On Label 的目标设为 Music Label,文本为 MUSIC ON。Save Unmute 使用相同的 Dynamic 键,值为 35。Unmute 将音量改为 35,并使用短暂淡入。
加载保存的选择
场景打开时,加载保存的音量并检查音乐是否已静音。
- 添加名为 Load Music 的 Load from Save File。
- 添加名为 Music 的 Play Music。将 Load Music 上一个空闲的底部白色圆点连接到 Music。
- 添加名为 Restore Muted 的 If。将 Load Music 上一个空闲的底部白色圆点连接到 Restore Muted。
- 重用 Music Off。将 Restore Muted 底部(true)的圆点连接到 Music Off。
**属性:**Load Music 使用键 orbit-music-volume-v1,默认值为 35,并保持在顶层。默认音量和保存的“开启”音量应一致;请选择舒适的聆听音量。Music 使用 orbit-loop,Loop 设为 On,Preload 设为 On,Start Time 设为 0,Persistent 设为 Off。Restore Muted 检查 Load Music 的 Loaded Value 是否 Equals 0。它的 true 连接会重用 Music Off,同时恢复属性、标签和声音。
Play Music 参考文档介绍了这些控件。轻点音轨栏,打开 Sounds,然后选择 orbit-loop:
使用保存的音量
松开后,Volume 中会显示 Load Music · loadedValue。保持 Loop 和 Preload 为 On。
在标题画面和运行过程中切换按钮。标签应立即更新。重玩并确认选择仍然保留。点击音乐按钮不应被识别为俯冲触控。
这样的连接顺序会在淡入淡出开始前保存选择。因此,你不必等淡入淡出结束后才保存设置。即使关闭音乐,短音效仍会播放。
14. 添加动作和奖励反馈
留下一道淡淡的轨迹
目标是添加一段小小的尾迹,让飞船的移动更容易追踪:
下面的起飞效果指南会添加 Trail (Start Trail)。将目标设为 Skimmer,并选择 orbit-trail。设置淡淡的色调、较细的线条和较短的淡出时间。启用 Fade to Transparent,并将轨迹绘制在飞船后方。运行时调整其外观。
奖励快速飞行,但避免频繁重复
设置此分支时,请参考 If、Timer 和 Play Sound 文档。
**属性:**Flow Check 检查 Velocity 的 Speed 输出是否 > 30。Flow Cooldown 使用 Set Behavior State 禁用 Flow Check。它的四个子行为设置如下:
- Flow Sound (Play Sound):
orbit-chime,Loop 设为 Off;音量应低于主要音效 - **Show Flow (Set Visibility):**显示 Flow Label
- **Flow Hide Timer (Timer):**1.4 s,执行一次,Start Immediately 设为 Off。Hide Flow (Set Visibility) 隐藏 Flow Label
- **Flow Reset Timer (Timer):**4 s,执行一次,Start Immediately 设为 Off。Flow Rearm (Set Behavior State) 启用 Flow Check,Executes Immediately 设为 Off
飞行速度较快时,会显示奖励提示并启动冷却计时。
- 重用 Velocity。
- 添加名为 Flow Check 的 If。将 Velocity 上一个空闲的底部白色圆点连接到 Flow Check。
- 添加名为 Flow Cooldown 的 Set Behavior State。将 Flow Check 底部(true)的圆点连接到 Flow Cooldown。
- 添加名为 Show Flow 的 Set Visibility。将 Flow Cooldown 上一个空闲的底部白色圆点连接到 Show Flow。
- 添加名为 Flow Sound 的 Play Sound。将 Flow Cooldown 上一个空闲的底部白色圆点连接到 Flow Sound。
短暂停顿后隐藏提示。再等待一段时间,才允许再次播放提示音。
- 重用 Flow Cooldown。
- 添加名为 Flow Hide Timer 的 Timer。将 Flow Cooldown 上一个空闲的底部白色圆点连接到 Flow Hide Timer。
- 添加名为 Flow Reset Timer 的 Timer。将 Flow Cooldown 上一个空闲的底部白色圆点连接到 Flow Reset Timer。
- 添加名为 Hide Flow 的 Set Visibility。将 Flow Hide Timer 上一个空闲的底部白色圆点连接到 Hide Flow。
- 添加名为 Flow Rearm 的 Set Behavior State。将 Flow Reset Timer 上一个空闲的底部白色圆点连接到 Flow Rearm。
Flight Tick 每秒检查速度 20 次。如果没有冷却计时,它可能在每次检查时都播放提示音。禁用 Flow Check 后,提示音会安静四秒,之后才会再次播放。
添加三个小小的庆祝时刻
粒子控件请参考 Start Particles 文档。下面的指南会为每个事件连接一组 Play Sound 和 Start Particles 行为。声音和粒子的 Loop 均设为 Off。粒子的目标设为 Skimmer,并使用随附预设来生成爆发效果。凭听感调整音量,让反馈在音乐背景下仍清晰可闻。
- 起飞:
orbit-launch音效和orbit-launch-sparks粒子 - 成功切换世界:
orbit-biome音效和orbit-biome-glow粒子 - 结束:
orbit-reward音效和orbit-reward-stars粒子
使用别名 Launch Sound / Launch Burst、Biome Sound / Biome Burst 和 Reward Sound / Reward Burst。两个世界切换成功分支可以共用同一组 Biome Sound 和 Biome Burst 行为。随附的粒子预设是短暂且范围受限的爆发效果;这些事件中不要将它们改成连续发射器。
Generate 报告 Ready 时,启动轨迹和起飞效果。
- 重用 Generate。
- 添加名为 Trail 的 Start Trail。将 Generate 上一个空闲的底部白色圆点连接到 Trail。
- 添加名为 Launch Sound 的 Play Sound。将 Generate 上一个空闲的底部白色圆点连接到 Launch Sound。
- 添加名为 Launch Burst 的 Start Particles。将 Generate 上一个空闲的底部白色圆点连接到 Launch Burst。
两个成功的世界切换都可以使用相同的音效和粒子行为。
- 重用 Aurora Fill Valid。
- 重用 Ember Fill Valid。
- 添加名为 Biome Sound 的 Play Sound。将 Aurora Fill Valid 底部(true)的圆点连接到 Biome Sound。将 Ember Fill Valid 底部(true)的圆点连接到 Biome Sound。
- 添加名为 Biome Burst 的 Start Particles。将 Aurora Fill Valid 底部(true)的圆点连接到 Biome Burst。将 Ember Fill Valid 底部(true)的圆点连接到 Biome Burst。
为每次运行结束添加专属音效和粒子爆发。
- 重用 Finished。
- 添加名为 Reward Sound 的 Play Sound。将 Finished 上一个空闲的底部白色圆点连接到 Reward Sound。
- 添加名为 Reward Burst 的 Start Particles。将 Finished 上一个空闲的底部白色圆点连接到 Reward Burst。
起飞、获得快速飞行奖励,再让本次运行结束。留意起飞、世界切换和结束时各自不同的音效。大约 1.4 秒后,ORBIT FLOW 应消失;飞船保持高速时,提示音不应连续响起。
15. 为卡住的起飞添加恢复方式
如果关卡仍在准备中,超过 15 秒就提供重试选项。返回标题画面前,先取消这次尝试。
**恢复指南的属性:**Loading Watchdog 是一个 15 秒的计时器,只执行一次,Start Immediately 设为 Off。Loading State 读取 Skimmer 的 runState。Loading Check 检查该 Attribute Value 是否 Equals menu。Cancel Preparation 会禁用 Generate。Failed State 将 Skimmer 的 runState 设为 finished。
重用 Hide Menu 和 Show Results。配置三个新的 Change Label 行为:
- Loading Title:**Target:**Results Title;Text:
LET'S TRY THAT AGAIN - Loading Score:**Target:**Results Score;Text:
RETRY - Loading Tip:**Target:**Results Tip;Text:
The moon took too long to prepare.然后是Tap FLY AGAIN for a fresh course.
点击 LAUNCH 时启动看门计时器。15 秒后,检查游戏是否仍处于菜单状态。
- 重用 Disarm Start。
- 添加名为 Loading Watchdog 的 Timer。将 Disarm Start 上一个空闲的底部白色圆点连接到 Loading Watchdog。
- 添加名为 Loading State 的 Get Attribute。将 Loading Watchdog 上一个空闲的底部白色圆点连接到 Loading State。
- 添加名为 Loading Check 的 If。将 Loading State 上一个空闲的底部白色圆点连接到 Loading Check。
- 添加名为 Cancel Preparation 的 Set Behavior State。将 Loading Check 底部(true)的圆点连接到 Cancel Preparation。
- 添加名为 Failed State 的 Set Attribute。将 Cancel Preparation 上一个空闲的底部白色圆点连接到 Failed State。
重用菜单和结果行为来显示重试画面。
- 重用 Failed State。
- 重用 Hide Menu。将 Failed State 上一个空闲的底部白色圆点连接到 Hide Menu。
- 重用 Show Results。将 Failed State 上一个空闲的底部白色圆点连接到 Show Results。
修改结果文本,让玩家知道可以重试。
- 重用 Failed State。
- 添加名为 Loading Title 的 Change Label。将 Failed State 上一个空闲的底部白色圆点连接到 Loading Title。
- 添加名为 Loading Score 的 Change Label。将 Failed State 上一个空闲的底部白色圆点连接到 Loading Score。
- 添加名为 Loading Tip 的 Change Label。将 Failed State 上一个空闲的底部白色圆点连接到 Loading Tip。
先创建一份测试副本。在该副本中,断开 Disarm Start → Generate,让 Loading 和 Loading Watchdog 保持连接。运行并点击 LAUNCH。大约 15 秒后,重试面板应会出现,而且不会启动地形或计时。点击 FLY AGAIN 应返回标题画面。保留或分享测试副本前,请重新连接 Generate。
关卡正常加载时,Ready 会将 runState 改为 running。此时 15 秒检查不会执行任何操作。如果准备失败,你会将 runState 设为 finished,这样已有的重玩按钮就能处理重试。
测试基础功能
在 Generate 已连接的正常项目中运行以下检查:
- 标题画面在点击 LAUNCH 前保持静止,重复点击 LAUNCH 不会启动多次运行。
- 按住时俯冲、松开时滑翔,以及点击音乐按钮都不会触发触控区域。
- 距离从起始位置开始增加;地形准备就绪后倒计时才开始。
- 经过 30 秒后,Luna 会切换为 Aurora;经过 60 秒后,切换为 Ember。
- 到 90 秒时,飞行会停止,且 FLY AGAIN 可以正常使用。
- 更好的距离成绩会在重玩后保留;更差的成绩不会覆盖它。
- 音乐偏好在重玩后仍会保留,关闭音乐时短音效仍可播放。
- 单独进行的恢复测试可以显示 RETRY,并返回菜单。
如果显示异常
- 关卡生成前飞船就坠落:World gravity 为零;Menu Gravity 的目标是 Skimmer;Launch 和 Release 从 Ready 开始
- 点击 LAUNCH 后没有开始关卡:Start Touch 的目标是 Start;Disarm Start 已连接到 Generate;生成的地形跟随 Skimmer
- 触控没有反应:Input Plane 位于 Scene UI,覆盖整个屏幕,透明度为 0%,并且保持可见
- 旋转抖动或翻转:添加 X > 0.1 保护条件,按 Y ÷ X 的顺序计算,然后使用 Arctangent,最后乘以 −1
- 分数从一个很大的数开始:读取世界 X 坐标,并减去飞船的起始 X 坐标 8 m
- 世界标签变了,但地形没变:将目标设为 Generate.terrainObjectID,选择 Top/Middle 槽位,并检查每个 smartShapeError 输出
- 结果出现后飞船仍在移动:禁用 Flight Tick,并将两个速度都设为零,同时关闭两个 Maintain 开关
- 音乐标签与声音不一致:检查
music属性,以及完整的“状态 → 标签 → 保存 → 淡入淡出”连接链 - 存档似乎属于之前的示例项目:在自己的游戏中,为两个存档键使用独特的前缀
下一步:找到流畅感
现在你可以完成一轮游戏,然后再开始下一轮。第 5 部分将重点讲解飞行手感,包括飞船翱翔时逐渐拉远的镜头。之后,你会在山谷中放置电池。

