使用 Smart Shape 建立 OrbitRun|第 4 部分:音效與最後潤飾
Logo

短促的音效能讓一趟愉快的飛行更加精彩。加入音樂和尾跡,再為發射與世界切換加上專屬音效。你也會新增一個重試畫面,以防關卡載入失敗。

從第 3 部分接續,或從檢查點素材包開啟 OrbitRun-12-personal-best.tap。原始素材包包含本篇使用的音訊和粒子檔案。僅含素材的起始專案和之後的所有檢查點都已匯入這些素材。

在圖解中,REUSE 代表使用先前已加入的行為。如需回顧手勢操作,請參閱第 1 部分中的行為連接方式。點按圖片即可開啟完整尺寸。

13. 加入會記住玩家選擇的音樂

從你放在標題畫面上的 Music Button 開始。

先建立按鈕

底部(true)輸出會關閉音樂。右側(false)輸出則會開啟音樂。

動態連接指南:Music button:true 或 false

  1. 新增 Started Touching,命名為 Music Touch。
  2. 新增 Get Attribute,命名為 Music State。將 Music Touch 上未使用的底部白色圓圈連接到 Music State。
  3. 新增 If,命名為 Music Check。將 Music State 上未使用的底部白色圓圈連接到 Music Check。
  4. 新增 Set Attribute,命名為 Music Off。將 Music Check 底部(true)的圓圈連接到 Music Off。
  5. 新增 Set Attribute,命名為 Music On。將 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. 新增 Change Label,命名為 Music Off Label。將 Music Off 上未使用的底部白色圓圈連接到 Music Off Label。
  3. 新增 Modify Save File,命名為 Save Mute。將 Music Off Label 上未使用的底部白色圓圈連接到 Save Mute。
  4. 新增 Set Music Settings,命名為 Mute。將 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. 新增 Change Label,命名為 Music On Label。將 Music On 上未使用的底部白色圓圈連接到 Music On Label。
  3. 新增 Modify Save File,命名為 Save Unmute。將 Music On Label 上未使用的底部白色圓圈連接到 Save Unmute。
  4. 新增 Set Music Settings,命名為 Unmute。將 Save Unmute 上未使用的底部白色圓圈連接到 Unmute。

**開啟設定:**Music On Label 的目標設為 Music Label,文字為 MUSIC ON。Save Unmute 使用相同的 Dynamic 金鑰,值設為 35。Unmute 將音量調為 35,並使用短暫淡入。

載入已儲存的選擇

場景開啟時,載入已儲存的音量並確認音樂是否為靜音狀態。

動態連接指南:還原已儲存的音樂選擇

  1. 新增 Load from Save File,命名為 Load Music。
  2. 新增 Play Music,命名為 Music。將 Load Music 上未使用的底部白色圓圈連接到 Music。
  3. 新增 If,命名為 Restore Muted。將 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 秒,執行一次,Start Immediately 設為 Off。Hide Flow (Set Visibility) 隱藏 Flow Label
  • **Flow Reset Timer (Timer):**4 秒,執行一次,Start Immediately 設為 Off。Flow Rearm (Set Behavior State) 啟用 Flow Check,Executes Immediately 設為 Off

高速飛行會顯示獎勵訊息並開始冷卻。

動態連接指南:獎勵一次高速飛行

  1. 重用 Velocity。
  2. 新增 If,命名為 Flow Check。將 Velocity 上未使用的底部白色圓圈連接到 Flow Check。
  3. 新增 Set Behavior State,命名為 Flow Cooldown。將 Flow Check 底部(true)的圓圈連接到 Flow Cooldown。
  4. 新增 Set Visibility,命名為 Show Flow。將 Flow Cooldown 上未使用的底部白色圓圈連接到 Show Flow。
  5. 新增 Play Sound,命名為 Flow Sound。將 Flow Cooldown 上未使用的底部白色圓圈連接到 Flow Sound。

稍作停頓後隱藏訊息。等待久一點再允許播放下一次提示音。

動態連接指南:隱藏訊息,稍後重新啟用

  1. 重用 Flow Cooldown。
  2. 新增 Timer,命名為 Flow Hide Timer。將 Flow Cooldown 上未使用的底部白色圓圈連接到 Flow Hide Timer。
  3. 新增 Timer,命名為 Flow Reset Timer。將 Flow Cooldown 上未使用的底部白色圓圈連接到 Flow Reset Timer。
  4. 新增 Set Visibility,命名為 Hide Flow。將 Flow Hide Timer 上未使用的底部白色圓圈連接到 Hide Flow。
  5. 新增 Set Behavior State,命名為 Flow Rearm。將 Flow Reset Timer 上未使用的底部白色圓圈連接到 Flow Rearm。

Flight Tick 每秒會檢查速度二十次。若沒有冷卻,它可能每次檢查都播放提示音。停用 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. 新增 Start Trail,命名為 Trail。將 Generate 上未使用的底部白色圓圈連接到 Trail。
  3. 新增 Play Sound,命名為 Launch Sound。將 Generate 上未使用的底部白色圓圈連接到 Launch Sound。
  4. 新增 Start Particles,命名為 Launch Burst。將 Generate 上未使用的底部白色圓圈連接到 Launch Burst。

兩種成功的世界切換都可以使用相同的音效和粒子行為。

動態連接指南:世界切換:共用效果

  1. 重用 Aurora Fill Valid。
  2. 重用 Ember Fill Valid。
  3. 新增 Play Sound,命名為 Biome Sound。將 Aurora Fill Valid 底部(true)的圓圈連接到 Biome Sound。將 Ember Fill Valid 底部(true)的圓圈也連接到 Biome Sound。
  4. 新增 Start Particles,命名為 Biome Burst。將 Aurora Fill Valid 底部(true)的圓圈連接到 Biome Burst。將 Ember Fill Valid 底部(true)的圓圈也連接到 Biome Burst。

為一趟飛行的結束加上專屬音效和粒子爆發。

動態連接指南:結束:音效與粒子爆發

  1. 重用 Finished。
  2. 新增 Play Sound,命名為 Reward Sound。將 Finished 上未使用的底部白色圓圈連接到 Reward Sound。
  3. 新增 Start Particles,命名為 Reward Burst。將 Finished 上未使用的底部白色圓圈連接到 Reward Burst。

發射、獲得高速飛行獎勵,並讓這趟飛行結束。確認發射、世界切換和結束音效各不相同。ORBIT FLOW 應在約 1.4 秒後消失,而且即使飛船持續高速飛行,也不應連續發出提示音。

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. 新增 Timer,命名為 Loading Watchdog。將 Disarm Start 上未使用的底部白色圓圈連接到 Loading Watchdog。
  3. 新增 Get Attribute,命名為 Loading State。將 Loading Watchdog 上未使用的底部白色圓圈連接到 Loading State。
  4. 新增 If,命名為 Loading Check。將 Loading State 上未使用的底部白色圓圈連接到 Loading Check。
  5. 新增 Set Behavior State,命名為 Cancel Preparation。將 Loading Check 底部(true)的圓圈連接到 Cancel Preparation。
  6. 新增 Set Attribute,命名為 Failed State。將 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. 新增 Change Label,命名為 Loading Title。將 Failed State 上未使用的底部白色圓圈連接到 Loading Title。
  3. 新增 Change Label,命名為 Loading Score。將 Failed State 上未使用的底部白色圓圈連接到 Loading Score。
  4. 新增 Change Label,命名為 Loading Tip。將 Failed State 上未使用的底部白色圓圈連接到 Loading Tip。

先建立測試副本。在該副本中,斷開 Disarm Start → Generate,讓 Loading 和 Loading Watchdog 保持連接。開始遊戲並點按 LAUNCH。約 15 秒後應出現重試面板,且不會啟動地形或計時。FLY AGAIN 應會回到標題畫面。保留或分享該測試副本前,請重新連接 Generate。

在測試副本中斷開 Generate 後顯示的重試面板

關卡正常載入時,Ready 會將 runState 改為 running。此時 15 秒檢查不會採取任何動作。如果準備失敗,你會將 runState 設為 finished,如此一來,現有的重玩按鈕就能處理重試。

測試基礎功能

在已連接 Generate 的正常專案中,逐項確認:

  • 標題畫面在點按 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 開關都設為 Off
  • 音樂標籤與實際音效不一致:檢查 music 屬性,以及完整的 state → label → save → fade 連接鏈
  • 存檔看起來屬於較早的範例:在你自己的遊戲中,為兩個存檔金鑰使用獨特的前綴

下一篇:找出飛行節奏

現在你可以完成一趟完整飛行,再回來開始下一趟。第 5 部分會著重於飛行手感,包括飛船翱翔時逐漸拉遠的鏡頭。接著,你會在山谷中放置電池。

所有檢查點 · 原始素材