使用 Smart Shape 构建 OrbitRun | 第 4 部分:音效与收尾工作
Logo

短促的音效能让一段精彩的飞行更添乐趣。加入音乐和轨迹,再为起飞和世界变化配上各自的效果。如果关卡加载失败,你还会添加一个重试画面。

从第 3 部分继续,或者打开检查点包中的 OrbitRun-12-personal-best.tap。原始素材包包含此处使用的音频和粒子文件。仅含素材的起始项目以及之后的每个检查点都已导入这些素材。

在图示中,REUSE 表示使用你已经添加的行为。如需回顾手势操作,请参阅第 1 部分中的行为连接指南。轻点图片可查看大图。

13. 添加能记住玩家选择的音乐

先从你放在标题画面上的 Music Button 开始。

先搭建按钮

底部(true)输出会关闭音乐。右侧(false)输出会开启音乐。

动画连接指南:Music button:true 或 false

  1. 添加名为 Music Touch 的 Started Touching。
  2. 添加名为 Music State 的 Get Attribute。将 Music Touch 上一个空闲的底部白色圆点连接到 Music State。
  3. 添加名为 Music Check 的 If。将 Music State 上一个空闲的底部白色圆点连接到 Music Check。
  4. 添加名为 Music Off 的 Set Attribute。将 Music Check 底部(true)的圆点连接到 Music Off。
  5. 添加名为 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。

在关闭音乐的分支中,更新标签并保存选择,然后再静音。

动画连接指南:关闭音乐

  1. 重用 Music Off。
  2. 添加名为 Music Off Label 的 Change Label。将 Music Off 上一个空闲的底部白色圆点连接到 Music Off Label。
  3. 添加名为 Save Mute 的 Modify Save File。将 Music Off Label 上一个空闲的底部白色圆点连接到 Save Mute。
  4. 添加名为 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,并使用短暂淡出。

开启音乐的分支采用相同顺序,并恢复聆听音量。

动画连接指南:开启音乐

  1. 重用 Music On。
  2. 添加名为 Music On Label 的 Change Label。将 Music On 上一个空闲的底部白色圆点连接到 Music On Label。
  3. 添加名为 Save Unmute 的 Modify Save File。将 Music On Label 上一个空闲的底部白色圆点连接到 Save Unmute。
  4. 添加名为 Unmute 的 Set Music Settings。将 Save Unmute 上一个空闲的底部白色圆点连接到 Unmute。

**开启设置:**Music On Label 的目标设为 Music Label,文本为 MUSIC ON。Save Unmute 使用相同的 Dynamic 键,值为 35。Unmute 将音量改为 35,并使用短暂淡入。

加载保存的选择

场景打开时,加载保存的音量并检查音乐是否已静音。

动画连接指南:恢复保存的音乐选择

  1. 添加名为 Load Music 的 Load from Save File。
  2. 添加名为 Music 的 Play Music。将 Load Music 上一个空闲的底部白色圆点连接到 Music。
  3. 添加名为 Restore Muted 的 If。将 Load Music 上一个空闲的底部白色圆点连接到 Restore Muted。
  4. 重用 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 中,选择 loadedValue,并检查生成的引用

松开后,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

飞行速度较快时,会显示奖励提示并启动冷却计时。

动画连接指南:奖励快速飞行,每次只触发一次

  1. 重用 Velocity。
  2. 添加名为 Flow Check 的 If。将 Velocity 上一个空闲的底部白色圆点连接到 Flow Check。
  3. 添加名为 Flow Cooldown 的 Set Behavior State。将 Flow Check 底部(true)的圆点连接到 Flow Cooldown。
  4. 添加名为 Show Flow 的 Set Visibility。将 Flow Cooldown 上一个空闲的底部白色圆点连接到 Show Flow。
  5. 添加名为 Flow Sound 的 Play Sound。将 Flow Cooldown 上一个空闲的底部白色圆点连接到 Flow Sound。

短暂停顿后隐藏提示。再等待一段时间,才允许再次播放提示音。

动画连接指南:隐藏提示;稍后重新启用

  1. 重用 Flow Cooldown。
  2. 添加名为 Flow Hide Timer 的 Timer。将 Flow Cooldown 上一个空闲的底部白色圆点连接到 Flow Hide Timer。
  3. 添加名为 Flow Reset Timer 的 Timer。将 Flow Cooldown 上一个空闲的底部白色圆点连接到 Flow Reset Timer。
  4. 添加名为 Hide Flow 的 Set Visibility。将 Flow Hide Timer 上一个空闲的底部白色圆点连接到 Hide Flow。
  5. 添加名为 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 时,启动轨迹和起飞效果。

动画连接指南:起飞:轨迹、音效和粒子爆发

  1. 重用 Generate。
  2. 添加名为 Trail 的 Start Trail。将 Generate 上一个空闲的底部白色圆点连接到 Trail。
  3. 添加名为 Launch Sound 的 Play Sound。将 Generate 上一个空闲的底部白色圆点连接到 Launch Sound。
  4. 添加名为 Launch Burst 的 Start Particles。将 Generate 上一个空闲的底部白色圆点连接到 Launch Burst。

两个成功的世界切换都可以使用相同的音效和粒子行为。

动画连接指南:切换世界:共用效果

  1. 重用 Aurora Fill Valid。
  2. 重用 Ember Fill Valid。
  3. 添加名为 Biome Sound 的 Play Sound。将 Aurora Fill Valid 底部(true)的圆点连接到 Biome Sound。将 Ember Fill Valid 底部(true)的圆点连接到 Biome Sound。
  4. 添加名为 Biome Burst 的 Start Particles。将 Aurora Fill Valid 底部(true)的圆点连接到 Biome Burst。将 Ember Fill Valid 底部(true)的圆点连接到 Biome Burst。

为每次运行结束添加专属音效和粒子爆发。

动画连接指南:结束:音效和粒子爆发

  1. 重用 Finished。
  2. 添加名为 Reward Sound 的 Play Sound。将 Finished 上一个空闲的底部白色圆点连接到 Reward Sound。
  3. 添加名为 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 秒后,检查游戏是否仍处于菜单状态。

动画连接指南:检查起飞是否卡住

  1. 重用 Disarm Start。
  2. 添加名为 Loading Watchdog 的 Timer。将 Disarm Start 上一个空闲的底部白色圆点连接到 Loading Watchdog。
  3. 添加名为 Loading State 的 Get Attribute。将 Loading Watchdog 上一个空闲的底部白色圆点连接到 Loading State。
  4. 添加名为 Loading Check 的 If。将 Loading State 上一个空闲的底部白色圆点连接到 Loading Check。
  5. 添加名为 Cancel Preparation 的 Set Behavior State。将 Loading Check 底部(true)的圆点连接到 Cancel Preparation。
  6. 添加名为 Failed State 的 Set Attribute。将 Cancel Preparation 上一个空闲的底部白色圆点连接到 Failed State。

重用菜单和结果行为来显示重试画面。

动画连接指南:恢复:显示重试面板

  1. 重用 Failed State。
  2. 重用 Hide Menu。将 Failed State 上一个空闲的底部白色圆点连接到 Hide Menu。
  3. 重用 Show Results。将 Failed State 上一个空闲的底部白色圆点连接到 Show Results。

修改结果文本,让玩家知道可以重试。

动画连接指南:恢复:说明重试方式

  1. 重用 Failed State。
  2. 添加名为 Loading Title 的 Change Label。将 Failed State 上一个空闲的底部白色圆点连接到 Loading Title。
  3. 添加名为 Loading Score 的 Change Label。将 Failed State 上一个空闲的底部白色圆点连接到 Loading Score。
  4. 添加名为 Loading Tip 的 Change Label。将 Failed State 上一个空闲的底部白色圆点连接到 Loading Tip。

先创建一份测试副本。在该副本中,断开 Disarm Start → Generate,让 Loading 和 Loading Watchdog 保持连接。运行并点击 LAUNCH。大约 15 秒后,重试面板应会出现,而且不会启动地形或计时。点击 FLY AGAIN 应返回标题画面。保留或分享测试副本前,请重新连接 Generate。

在测试副本中断开 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 部分将重点讲解飞行手感,包括飞船翱翔时逐渐拉远的镜头。之后,你会在山谷中放置电池。

所有检查点 · 原始素材