使用 Smart Shape 建立 OrbitRun|第 4 部分:音效與最後潤飾
短促的音效能讓一趟愉快的飛行更加精彩。加入音樂和尾跡,再為發射與世界切換加上專屬音效。你也會新增一個重試畫面,以防關卡載入失敗。
從第 3 部分接續,或從檢查點素材包開啟 OrbitRun-12-personal-best.tap。原始素材包包含本篇使用的音訊和粒子檔案。僅含素材的起始專案和之後的所有檢查點都已匯入這些素材。
在圖解中,REUSE 代表使用先前已加入的行為。如需回顧手勢操作,請參閱第 1 部分中的行為連接方式。點按圖片即可開啟完整尺寸。
13. 加入會記住玩家選擇的音樂
從你放在標題畫面上的 Music Button 開始。
先建立按鈕
底部(true)輸出會關閉音樂。右側(false)輸出則會開啟音樂。
- 新增 Started Touching,命名為 Music Touch。
- 新增 Get Attribute,命名為 Music State。將 Music Touch 上未使用的底部白色圓圈連接到 Music State。
- 新增 If,命名為 Music Check。將 Music State 上未使用的底部白色圓圈連接到 Music Check。
- 新增 Set Attribute,命名為 Music Off。將 Music Check 底部(true)的圓圈連接到 Music Off。
- 新增 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。
在關閉音樂的路徑中,先更新標籤並儲存選擇,再將音樂靜音。
- 重用 Music Off。
- 新增 Change Label,命名為 Music Off Label。將 Music Off 上未使用的底部白色圓圈連接到 Music Off Label。
- 新增 Modify Save File,命名為 Save Mute。將 Music Off Label 上未使用的底部白色圓圈連接到 Save Mute。
- 新增 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,並使用短暫淡出。
開啟音樂的路徑採用相同順序,並將音量恢復到聆聽音量。
- 重用 Music On。
- 新增 Change Label,命名為 Music On Label。將 Music On 上未使用的底部白色圓圈連接到 Music On Label。
- 新增 Modify Save File,命名為 Save Unmute。將 Music On Label 上未使用的底部白色圓圈連接到 Save Unmute。
- 新增 Set Music Settings,命名為 Unmute。將 Save Unmute 上未使用的底部白色圓圈連接到 Unmute。
**開啟設定:**Music On Label 的目標設為 Music Label,文字為 MUSIC ON。Save Unmute 使用相同的 Dynamic 金鑰,值設為 35。Unmute 將音量調為 35,並使用短暫淡入。
載入已儲存的選擇
場景開啟時,載入已儲存的音量並確認音樂是否為靜音狀態。
- 新增 Load from Save File,命名為 Load Music。
- 新增 Play Music,命名為 Music。將 Load Music 上未使用的底部白色圓圈連接到 Music。
- 新增 If,命名為 Restore Muted。將 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 秒,執行一次,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
高速飛行會顯示獎勵訊息並開始冷卻。
- 重用 Velocity。
- 新增 If,命名為 Flow Check。將 Velocity 上未使用的底部白色圓圈連接到 Flow Check。
- 新增 Set Behavior State,命名為 Flow Cooldown。將 Flow Check 底部(true)的圓圈連接到 Flow Cooldown。
- 新增 Set Visibility,命名為 Show Flow。將 Flow Cooldown 上未使用的底部白色圓圈連接到 Show Flow。
- 新增 Play Sound,命名為 Flow Sound。將 Flow Cooldown 上未使用的底部白色圓圈連接到 Flow Sound。
稍作停頓後隱藏訊息。等待久一點再允許播放下一次提示音。
- 重用 Flow Cooldown。
- 新增 Timer,命名為 Flow Hide Timer。將 Flow Cooldown 上未使用的底部白色圓圈連接到 Flow Hide Timer。
- 新增 Timer,命名為 Flow Reset Timer。將 Flow Cooldown 上未使用的底部白色圓圈連接到 Flow Reset Timer。
- 新增 Set Visibility,命名為 Hide Flow。將 Flow Hide Timer 上未使用的底部白色圓圈連接到 Hide Flow。
- 新增 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 時,啟動尾跡和發射效果。
- 重用 Generate。
- 新增 Start Trail,命名為 Trail。將 Generate 上未使用的底部白色圓圈連接到 Trail。
- 新增 Play Sound,命名為 Launch Sound。將 Generate 上未使用的底部白色圓圈連接到 Launch Sound。
- 新增 Start Particles,命名為 Launch Burst。將 Generate 上未使用的底部白色圓圈連接到 Launch Burst。
兩種成功的世界切換都可以使用相同的音效和粒子行為。
- 重用 Aurora Fill Valid。
- 重用 Ember Fill Valid。
- 新增 Play Sound,命名為 Biome Sound。將 Aurora Fill Valid 底部(true)的圓圈連接到 Biome Sound。將 Ember Fill Valid 底部(true)的圓圈也連接到 Biome Sound。
- 新增 Start Particles,命名為 Biome Burst。將 Aurora Fill Valid 底部(true)的圓圈連接到 Biome Burst。將 Ember Fill Valid 底部(true)的圓圈也連接到 Biome Burst。
為一趟飛行的結束加上專屬音效和粒子爆發。
- 重用 Finished。
- 新增 Play Sound,命名為 Reward Sound。將 Finished 上未使用的底部白色圓圈連接到 Reward Sound。
- 新增 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 秒後,檢查遊戲是否仍處於選單狀態。
- 重用 Disarm Start。
- 新增 Timer,命名為 Loading Watchdog。將 Disarm Start 上未使用的底部白色圓圈連接到 Loading Watchdog。
- 新增 Get Attribute,命名為 Loading State。將 Loading Watchdog 上未使用的底部白色圓圈連接到 Loading State。
- 新增 If,命名為 Loading Check。將 Loading State 上未使用的底部白色圓圈連接到 Loading Check。
- 新增 Set Behavior State,命名為 Cancel Preparation。將 Loading Check 底部(true)的圓圈連接到 Cancel Preparation。
- 新增 Set Attribute,命名為 Failed State。將 Cancel Preparation 上未使用的底部白色圓圈連接到 Failed State。
重用選單和結果畫面的行為來顯示重試畫面。
- 重用 Failed State。
- 重用 Hide Menu。將 Failed State 上未使用的底部白色圓圈連接到 Hide Menu。
- 重用 Show Results。將 Failed State 上未使用的底部白色圓圈連接到 Show Results。
修改結果畫面的文字,讓玩家知道可以重試。
- 重用 Failed State。
- 新增 Change Label,命名為 Loading Title。將 Failed State 上未使用的底部白色圓圈連接到 Loading Title。
- 新增 Change Label,命名為 Loading Score。將 Failed State 上未使用的底部白色圓圈連接到 Loading Score。
- 新增 Change Label,命名為 Loading Tip。將 Failed State 上未使用的底部白色圓圈連接到 Loading Tip。
先建立測試副本。在該副本中,斷開 Disarm Start → Generate,讓 Loading 和 Loading Watchdog 保持連接。開始遊戲並點按 LAUNCH。約 15 秒後應出現重試面板,且不會啟動地形或計時。FLY AGAIN 應會回到標題畫面。保留或分享該測試副本前,請重新連接 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 部分會著重於飛行手感,包括飛船翱翔時逐漸拉遠的鏡頭。接著,你會在山谷中放置電池。

