使用 Smart Shape 建立 OrbitRun|第 6 部分:電池道具拾取
將電池放在你希望玩家飛往的位置:山谷底部附近。收集電池可為計時器增加 8 秒。俯衝得當,就能爭取更多時間;而不斷加快的節奏,也會讓你更難抵達下一個山谷。
從第 5 部分繼續,或從檢查點套件開啟 OrbitRun-18-rising-pace.tap。你可以使用專案中已有的面板圖形和字型製作電池。
圖示中的 REUSE 表示使用你已新增的行為。如需複習手勢,請參閱第 1 部分的行為連接說明。你可以點按圖片,以完整尺寸檢視。
19. 將電池放在山谷中
每次遊戲的路線都會改變,因此你必須先找到山谷,才能放置電池。使用 Raycast Test 在附近三個點取樣地面。當中間點比兩側都低時,就代表你找到低點了。
先放置一顆電池。玩家收集電池或飛過電池後,你可以將同一個物件移到另一個山谷。
留意倒數計時增加 8 秒,以及收集電池時綠色電池圖示消失。
製作電池圖示
製作一個小巧明亮、在地面上格外顯眼的拾取物:
- 將
orbit-panel加到世界圖層,命名為 Battery,並縮小成一個小徽章。為它設定明亮的色調,再將名為 Battery Label 的+8標籤放在上面。 - 使用置中的錨點,讓圖形和標籤一起移動時仍能對齊。將 Battery 設為 Static、停用碰撞,並在初始時隱藏這兩個物件。放置行為會決定它們的位置。
- 將
batteryActive=0加入 Skimmer 的屬性。0 表示搜尋山谷;1 表示將目前的拾取物留在原位。
搜尋前方地形
請參閱 Raycast Test,了解起點、終點、圖層和命中輸出。若下方欄位需要其他行為的結果,請使用第 2 部分示範的資料輸出拖曳操作。
將這些行為都放在 Skimmer 上。依照小圖示的順序操作:搜尋、取樣地面、放置電池,最後回收錯過的電池。
先建立搜尋鏈:
- Battery Search State (Get Attribute):Skimmer,
batteryActive - Battery Search Idle (If):Attribute Value equals 0
- Battery Place Position (Get Position):Skimmer,Screen Coordinates Off
- Battery Next X (Add Values):Skimmer 的 X Position + 35
- Battery Left X (Subtract Values):Battery Next X 結果 − 4
第一個連接示意會將 Flight Tick 連到 Battery Search State。現有的 0.05 秒計時器會頻繁向前檢查,即使速度變快,也能及時發現山谷。只有在 batteryActive 為 0 時,才會發射射線。
只有在沒有啟用中的電池時才向前搜尋。
- 重複使用 Flight Tick。
- 新增名為 Battery Search State 的 Get Attribute。將 Flight Tick 上任一個未使用的底部白色圓圈連到 Battery Search State。
- 新增名為 Battery Search Idle 的 If。將 Battery Search State 上任一個未使用的底部白色圓圈連到 Battery Search Idle。
- 新增名為 Battery Place Position 的 Get Position。將 Battery Search Idle 底部的(true)圓圈連到 Battery Place Position。
- 新增名為 Battery Next X 的 Add Values。將 Battery Place Position 上任一個未使用的底部白色圓圈連到 Battery Next X。
- 新增名為 Battery Left X 的 Subtract Values。將 Battery Next X 上任一個未使用的底部白色圓圈連到 Battery Left X。
接下來兩個示意會新增三個 Raycast Test 行為。它們全都使用 Closest Object、Any Object、world layer 0、All Layers Off,以及 Position 終點類型。每條射線都從 Y 80 射到 Y −40,垂直穿過路線。起點和終點使用相同的 X:
- Battery Ray Left:Battery Left X 結果
- Battery Ray Center:Battery Next X 結果
- Battery Ray Right:Battery Right X 結果;此結果是 Battery Next X + 4 的 Add Values 計算結果
每條射線後都新增一個 If,檢查其 Intersected 輸出是否 equals 1。將檢查命名為 Battery Left Hit、Battery Center Hit 和 Battery Right Hit。使用每個檢查的 true 輸出繼續流程。如果任何射線都沒碰到地面,搜尋就會繼續等待。
在第二個取樣示意中設定兩項山谷檢查:
- Battery Low Left:中心射線的 Y Position < 左側射線的 Y Position。
- Battery Low Right:中心射線的 Y Position < 右側射線的 Y Position。
先測試左側射線,再繼續測試中心射線。
- 重複使用 Battery Left X。
- 新增名為 Battery Ray Left 的 Raycast Test。將 Battery Left X 上任一個未使用的底部白色圓圈連到 Battery Ray Left。
- 新增名為 Battery Left Hit 的 If。將 Battery Ray Left 上任一個未使用的底部白色圓圈連到 Battery Left Hit。
- 新增名為 Battery Ray Center 的 Raycast Test。將 Battery Left Hit 底部的(true)圓圈連到 Battery Ray Center。
- 新增名為 Battery Center Hit 的 If。將 Battery Ray Center 上任一個未使用的底部白色圓圈連到 Battery Center Hit。
將射線對準取樣的 X 位置
放開後,Origin X 會包含 Battery Next X · final value。再用相同方式將結果拖到 Destination X。
右側射線命中後,比較中心和兩側的高度。
- 重複使用 Battery Center Hit。
- 新增名為 Battery Right X 的 Add Values。將 Battery Center Hit 底部的(true)圓圈連到 Battery Right X。
- 新增名為 Battery Ray Right 的 Raycast Test。將 Battery Right X 上任一個未使用的底部白色圓圈連到 Battery Ray Right。
- 新增名為 Battery Right Hit 的 If。將 Battery Ray Right 上任一個未使用的底部白色圓圈連到 Battery Right Hit。
- 新增名為 Battery Low Left 的 If。將 Battery Right Hit 底部的(true)圓圈連到 Battery Low Left。
- 新增名為 Battery Low Right 的 If。將 Battery Low Left 底部的(true)圓圈連到 Battery Low Right。
放置並固定拾取物
放置示意會從 Battery Low Right 的 true 輸出繼續。使用以下設定:
- Battery Ground Y (Add Values):中心射線的 Y Position + 1.2
- Battery Lock (Set Attribute):Skimmer,
batteryActive= 1 - Battery Place (Move to Point):Battery;X = 中心射線的 X Position;Y = Battery Ground Y 結果;時間長度 0,Screen Coordinates Off
- Battery Label Place (Move to Point):Battery Label;使用相同的 X 和 Y,時間長度 0,Screen Coordinates Off
- Battery Show (Set Visibility):Battery,Show Graphic
- Battery Label Show (Set Visibility):Battery Label,Show Graphic
停止搜尋,將電池移到低點,並顯示它。
- 重複使用 Battery Low Right。
- 新增名為 Battery Ground Y 的 Add Values。將 Battery Low Right 底部的(true)圓圈連到 Battery Ground Y。
- 新增名為 Battery Lock 的 Set Attribute。將 Battery Ground Y 上任一個未使用的底部白色圓圈連到 Battery Lock。
- 新增名為 Battery Place 的 Move To Point。將 Battery Lock 上任一個未使用的底部白色圓圈連到 Battery Place。
- 新增名為 Battery Label Place 的 Move To Point。將 Battery Place 上任一個未使用的底部白色圓圈連到 Battery Label Place。
- 新增名為 Battery Show 的 Set Visibility。將 Battery Label Place 上任一個未使用的底部白色圓圈連到 Battery Show。
- 新增名為 Battery Label Show 的 Set Visibility。將 Battery Show 上任一個未使用的底部白色圓圈連到 Battery Label Show。
使用地表高度
放開後,Y position 會包含 Battery Ground Y · final value。也將此結果用於 Battery Label Place 的 Y 欄位。
1.2 m 的偏移會讓圖形剛好位於碰撞表面上方。啟用旗標會在飛船接近時鎖定它的位置,因此電池圖示不會隨移動中的掃描位置漂移。
回收錯過的電池
使用下方的回收示意。設定以下屬性:
- Get Position,別名 Battery Position,目標為 Battery,Screen Coordinates Off。
- Subtract Values,別名 Battery Gap:Battery Position 的 X Position − 現有 HUD Position 的 X Position 輸出。
- If,別名 Battery Missed:Battery Gap 的結果 < −6。
- Set Attribute,別名 Battery Deactivate:Skimmer,
batteryActive= 0。 - Set Visibility,別名 Battery Hide Cell,隱藏 Battery,接著使用 Battery Hide Label 隱藏 Battery Label。
電池落在飛船後方超過 6 m 時,將它隱藏並允許再次搜尋。
- 重複使用 Position。
- 新增名為 Battery Position 的 Get Position。將 Position 上任一個未使用的底部白色圓圈連到 Battery Position。
- 新增名為 Battery Gap 的 Subtract Values。將 Battery Position 上任一個未使用的底部白色圓圈連到 Battery Gap。
- 新增名為 Battery Missed 的 If。將 Battery Gap 上任一個未使用的底部白色圓圈連到 Battery Missed。
- 新增名為 Battery Deactivate 的 Set Attribute。將 Battery Missed 底部的(true)圓圈連到 Battery Deactivate。
- 新增名為 Battery Hide Cell 的 Set Visibility。將 Battery Deactivate 上任一個未使用的底部白色圓圈連到 Battery Hide Cell。
- 新增名為 Battery Hide Label 的 Set Visibility。將 Battery Hide Cell 上任一個未使用的底部白色圓圈連到 Battery Hide Label。
沿著山谷方向追逐電池。它應該固定在路線上的那個位置。飛過它,並觀察它落到飛船後方後消失;之後便能在另一個山谷放置下一顆電池。第 20 步會加入收集功能。
拾取物使用世界座標,因此即使鏡頭縮放,它仍會留在路線上。batteryActive 為 1 時,搜尋會停止,並讓電池留在原位。
你可以調整搜尋向前看的距離(35 m),或取樣點之間的距離(4 m)。變更其中一項設定,看看下一顆電池會出現在哪裡。如果你調整路線的高度或位置,請確保每條射線的起點都高於山丘,終點都低於山谷。
20. 收集能量,耗盡時結束遊戲
先前的原型使用固定的 Run Limit 計時器。必須移除它,否則即使收集了電池,遊戲仍會在 90 秒時結束。
偵測收集事件
只有在電池啟用時才檢查是否收集到電池。如果飛船距離足夠近,就加上獎勵時間,並在下次檢查之前隱藏電池。
使用以下設定:
- Battery Collect State:Skimmer,屬性
batteryActive。 - Battery Collect Active:Attribute Value Equals 1。
- Battery Distance:Calculate Distance;Object A = Skimmer,Object B = Battery,Compensate for Zoom On。
- Battery Near:Battery Distance 的 Value < 2.5。
- Battery Bonus:將自身結果 + 8,初始結果為 0。
- Battery Capacity:第一個數字為 90,第二個數字取自 Battery Bonus 的結果。
電池啟用時,只要飛船距離它不到 2.5 m,就可以收集。
- 重複使用 Flight Tick。
- 新增名為 Battery Collect State 的 Get Attribute。將 Flight Tick 上任一個未使用的底部白色圓圈連到 Battery Collect State。
- 新增名為 Battery Collect Active 的 If。將 Battery Collect State 上任一個未使用的底部白色圓圈連到 Battery Collect Active。
- 新增名為 Battery Distance 的 Calculate Distance。將 Battery Collect Active 底部的(true)圓圈連到 Battery Distance。
- 新增名為 Battery Near 的 If。將 Battery Distance 上任一個未使用的底部白色圓圈連到 Battery Near。
- 新增名為 Battery Bonus 的 Add Values。將 Battery Near 底部的(true)圓圈連到 Battery Bonus。
將賺取的秒數加入總能量,並停用已收集的電池。
- 重複使用 Generate。
- 重複使用 Battery Bonus。
- 新增名為 Battery Capacity 的 Add Values。將 Generate 上任一個未使用的底部白色圓圈連到 Battery Capacity。將 Battery Bonus 上任一個未使用的底部白色圓圈也連到 Battery Capacity。
- 重複使用 Battery Deactivate。將 Battery Bonus 上任一個未使用的底部白色圓圈連到 Battery Deactivate。
- 重複使用 Remaining。將 Battery Capacity 上任一個未使用的底部白色圓圈連到 Remaining。
Battery Bonus 儲存所有賺取的秒數。Battery Capacity 儲存初始能量加上賺取的能量。現有的 Seconds 行為會繼續累計經過的時間。
更新倒數計時和結束條件
Timer 參考說明有助於區分會重複更新顯示的計時器,以及你即將取代的一次性遊戲時間限制。
- 在 Remaining 中,將常數 A 值 90 替換為 Battery Capacity 的 result 輸出。讓 B 維持連接到 Seconds 的 result 輸出。
- 保留能量示意中的兩條連線:Battery Capacity 連到 Remaining,以及 Battery Bonus 連到 Battery Deactivate。拾取物會立即隱藏並標示為非啟用狀態,避免重複獎勵。之後搜尋功能便能在另一個山谷放置電池。
- 刪除舊的 Run Limit 計時器及其連線。
- 依照下方的結束示意,設定 Energy Empty:比較 Remaining 的結果是否 ≤ 0。重複使用 Finished,並保留 Remaining 目前連到 Clock Text 的連線。
- Battery Hide End 用來隱藏 Battery;Battery Label Hide End 用來隱藏 Battery Label。兩者都使用 Set Visibility。依照下方的結束示意連接它們。
在時鐘中使用能量總量
放開後,First number (A) 會包含 Battery Capacity · final value。讓第二個數字繼續引用 Seconds。
讓 Remaining 在能量耗盡時觸發 Finished。
- 重複使用 Remaining。
- 重複使用 Clock Text,並保留它目前與 Remaining 的連線。
- 新增名為 Energy Empty 的 If。將 Remaining 上任一個未使用的底部白色圓圈連到 Energy Empty。
- 重複使用 Finished。將 Energy Empty 底部的(true)圓圈連到 Finished。
- 新增名為 Battery Hide End 的 Set Visibility。將 Finished 上任一個未使用的底部白色圓圈連到 Battery Hide End。
- 新增名為 Battery Label Hide End 的 Set Visibility。將 Battery Hide End 上任一個未使用的底部白色圓圈連到 Battery Label Hide End。
現在的能量關係如下:
剩餘秒數 = 90 + 電池獎勵秒數 − 經過秒數
重複使用 Finished 群組。它已經會停止計時器和飛船、顯示結果,並檢查最佳分數。
讓收集效果令人滿足且清楚易懂
- 收集獎勵示意會新增 Battery Chime (Play Sound)。使用與 Flow Sound 相同的設定和提示音素材。
- Battery Message (Change Label) 以 Flow Label 為目標,文字設為
+8s BATTERY。 - 依照下方收集獎勵示意的兩條分支操作。
- 將 Battery Hide 設為 1.3 秒、執行一次,並關閉 Start Immediately。依照示意重複使用 Show Flow 和 Hide Flow。
- 斷開 Velocity → Flow Check。這樣回饋標籤就只會顯示電池訊息,速度訊息便不會覆蓋收集訊息。軌跡和其他效果仍會持續運作。
- 將標題畫面說明改為
Hold downhill. Release at the valley. Valley batteries add 8 seconds of flight.將結果標題的起始文字改為 BATTERY EMPTY。個人最佳紀錄分支可能會將它替換為 NEW PERSONAL BEST。
播放提示音,並顯示玩家獲得的時間。
- 重複使用 Battery Bonus。
- 新增名為 Battery Chime 的 Play Sound。將 Battery Bonus 上任一個未使用的底部白色圓圈連到 Battery Chime。
- 新增名為 Battery Message 的 Change Label。將 Battery Bonus 上任一個未使用的底部白色圓圈連到 Battery Message。
- 重複使用 Show Flow。將 Battery Message 上任一個未使用的底部白色圓圈連到 Show Flow。
- 新增名為 Battery Hide 的 Timer。將 Battery Message 上任一個未使用的底部白色圓圈連到 Battery Hide。
- 重複使用 Hide Flow。將 Battery Hide 上任一個未使用的底部白色圓圈連到 Hide Flow。
收集電池時留意時鐘。時間應增加 8 秒、顯示收集訊息,並且電池只會被移除一次。之後可以在新的山谷放置另一顆電池。獲得額外能量後,繼續飛過原本的 90 秒時間點。下一局試著錯過電池,讓能量耗盡;一般的結果和重新遊玩流程仍應正常運作。
電池會增加 Battery Capacity 中的時間。Seconds 會持續向上計算,因此第 5 部分的節奏也會繼續加快。這讓你有理由追逐下一顆電池,而抵達時也會面臨更艱難的飛行。
依症狀除錯
- 電池持續增加秒數:Battery Bonus 必須觸發 Battery Deactivate;收集流程必須以 batteryActive = 1 為條件
- 拾取物只有在某個縮放程度下才有效:Calculate Distance 必須開啟 Compensate for Zoom
- 收集電池後仍在剛好 90 秒時結束:移除舊的 Run Limit 計時器;Energy Empty 應觸發 Finished
- 時鐘立即跳成負值:Generate 必須執行 Battery Capacity 以初始化 90 秒;Battery Bonus 和 Seconds 的起始值都是 0
- 標籤移動了,但綠色電池留在原地:Battery Place 必須以 Battery 為目標;Battery Label Place 必須以 Battery Label 為目標
- 飛船無法抵達電池:檢查三項射線命中條件、兩項低點比較,以及 1.2 公尺的地表偏移
接下來的實驗
先玩幾局,再新增其他功能。你能及時發現電池並調整方向飛過去嗎?收集一顆電池後,是否有足夠時間抵達下一顆?現在,這些答案比再加一項功能更有用。
準備好擴充專案時,可以試著放置一小排電池,引導玩家飛入山谷。你需要準備一小組物件,並確保每顆電池只獎勵一次。利用電池的位置,引導玩家在合適的時機放開。

