使用 Smart Shape 建立 OrbitRun|第 6 部分:電池道具拾取
Logo

將電池放在你希望玩家飛往的位置:山谷底部附近。收集電池可為計時器增加 8 秒。俯衝得當,就能爭取更多時間;而不斷加快的節奏,也會讓你更難抵達下一個山谷。

從第 5 部分繼續,或從檢查點套件開啟 OrbitRun-18-rising-pace.tap。你可以使用專案中已有的面板圖形和字型製作電池。

圖示中的 REUSE 表示使用你已新增的行為。如需複習手勢,請參閱第 1 部分的行為連接說明。你可以點按圖片,以完整尺寸檢視。

19. 將電池放在山谷中

每次遊戲的路線都會改變,因此你必須先找到山谷,才能放置電池。使用 Raycast Test 在附近三個點取樣地面。當中間點比兩側都低時,就代表你找到低點了。

先放置一顆電池。玩家收集電池或飛過電池後,你可以將同一個物件移到另一個山谷。

按住往山谷俯衝、收集電池,然後放開:重新建置專案的實際遊戲畫面

留意倒數計時增加 8 秒,以及收集電池時綠色電池圖示消失。

三條射線定位山谷,電池放在地面上方

製作電池圖示

製作一個小巧明亮、在地面上格外顯眼的拾取物:

完成的電池拾取物,位於山谷上方

  1. 將 orbit-panel 加到世界圖層,命名為 Battery,並縮小成一個小徽章。為它設定明亮的色調,再將名為 Battery Label 的 +8 標籤放在上面。
  2. 使用置中的錨點,讓圖形和標籤一起移動時仍能對齊。將 Battery 設為 Static、停用碰撞,並在初始時隱藏這兩個物件。放置行為會決定它們的位置。
  3. 將 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 時,才會發射射線。

只有在沒有啟用中的電池時才向前搜尋。

動畫連接示意:只在非啟用狀態下搜尋

  1. 重複使用 Flight Tick。
  2. 新增名為 Battery Search State 的 Get Attribute。將 Flight Tick 上任一個未使用的底部白色圓圈連到 Battery Search State。
  3. 新增名為 Battery Search Idle 的 If。將 Battery Search State 上任一個未使用的底部白色圓圈連到 Battery Search Idle。
  4. 新增名為 Battery Place Position 的 Get Position。將 Battery Search Idle 底部的(true)圓圈連到 Battery Place Position。
  5. 新增名為 Battery Next X 的 Add Values。將 Battery Place Position 上任一個未使用的底部白色圓圈連到 Battery Next X。
  6. 新增名為 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 計算結果

Battery Ray Left 使用 Main,起點和終點引用相同的 X,Y 為 80 到 −40

每條射線後都新增一個 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。

先測試左側射線,再繼續測試中心射線。

動畫連接示意:先取樣左側,再取樣中心

  1. 重複使用 Battery Left X。
  2. 新增名為 Battery Ray Left 的 Raycast Test。將 Battery Left X 上任一個未使用的底部白色圓圈連到 Battery Ray Left。
  3. 新增名為 Battery Left Hit 的 If。將 Battery Ray Left 上任一個未使用的底部白色圓圈連到 Battery Left Hit。
  4. 新增名為 Battery Ray Center 的 Raycast Test。將 Battery Left Hit 底部的(true)圓圈連到 Battery Ray Center。
  5. 新增名為 Battery Center Hit 的 If。將 Battery Ray Center 上任一個未使用的底部白色圓圈連到 Battery Center Hit。

將射線對準取樣的 X 位置

選取接收行為,將來源輸出拖到 Origin X,選擇 final value,並確認產生的引用

放開後,Origin X 會包含 Battery Next X · final value。再用相同方式將結果拖到 Destination X。

右側射線命中後,比較中心和兩側的高度。

動畫連接示意:取樣右側,再找出山谷

  1. 重複使用 Battery Center Hit。
  2. 新增名為 Battery Right X 的 Add Values。將 Battery Center Hit 底部的(true)圓圈連到 Battery Right X。
  3. 新增名為 Battery Ray Right 的 Raycast Test。將 Battery Right X 上任一個未使用的底部白色圓圈連到 Battery Ray Right。
  4. 新增名為 Battery Right Hit 的 If。將 Battery Ray Right 上任一個未使用的底部白色圓圈連到 Battery Right Hit。
  5. 新增名為 Battery Low Left 的 If。將 Battery Right Hit 底部的(true)圓圈連到 Battery Low Left。
  6. 新增名為 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

停止搜尋,將電池移到低點,並顯示它。

動畫連接示意:鎖定並放置電池

  1. 重複使用 Battery Low Right。
  2. 新增名為 Battery Ground Y 的 Add Values。將 Battery Low Right 底部的(true)圓圈連到 Battery Ground Y。
  3. 新增名為 Battery Lock 的 Set Attribute。將 Battery Ground Y 上任一個未使用的底部白色圓圈連到 Battery Lock。
  4. 新增名為 Battery Place 的 Move To Point。將 Battery Lock 上任一個未使用的底部白色圓圈連到 Battery Place。
  5. 新增名為 Battery Label Place 的 Move To Point。將 Battery Place 上任一個未使用的底部白色圓圈連到 Battery Label Place。
  6. 新增名為 Battery Show 的 Set Visibility。將 Battery Label Place 上任一個未使用的底部白色圓圈連到 Battery Show。
  7. 新增名為 Battery Label Show 的 Set Visibility。將 Battery Show 上任一個未使用的底部白色圓圈連到 Battery Label Show。

使用地表高度

選取接收行為,將來源輸出拖到 Y position,選擇 final value,並確認產生的引用

放開後,Y position 會包含 Battery Ground Y · final value。也將此結果用於 Battery Label Place 的 Y 欄位。

1.2 m 的偏移會讓圖形剛好位於碰撞表面上方。啟用旗標會在飛船接近時鎖定它的位置,因此電池圖示不會隨移動中的掃描位置漂移。

回收錯過的電池

使用下方的回收示意。設定以下屬性:

  1. Get Position,別名 Battery Position,目標為 Battery,Screen Coordinates Off。
  2. Subtract Values,別名 Battery Gap:Battery Position 的 X Position − 現有 HUD Position 的 X Position 輸出。
  3. If,別名 Battery Missed:Battery Gap 的結果 < −6。
  4. Set Attribute,別名 Battery Deactivate:Skimmer,batteryActive = 0。
  5. Set Visibility,別名 Battery Hide Cell,隱藏 Battery,接著使用 Battery Hide Label 隱藏 Battery Label。

電池落在飛船後方超過 6 m 時,將它隱藏並允許再次搜尋。

動畫連接示意:回收錯過的電池

  1. 重複使用 Position。
  2. 新增名為 Battery Position 的 Get Position。將 Position 上任一個未使用的底部白色圓圈連到 Battery Position。
  3. 新增名為 Battery Gap 的 Subtract Values。將 Battery Position 上任一個未使用的底部白色圓圈連到 Battery Gap。
  4. 新增名為 Battery Missed 的 If。將 Battery Gap 上任一個未使用的底部白色圓圈連到 Battery Missed。
  5. 新增名為 Battery Deactivate 的 Set Attribute。將 Battery Missed 底部的(true)圓圈連到 Battery Deactivate。
  6. 新增名為 Battery Hide Cell 的 Set Visibility。將 Battery Deactivate 上任一個未使用的底部白色圓圈連到 Battery Hide Cell。
  7. 新增名為 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,就可以收集。

動畫連接示意:檢查是否啟用,再檢查距離

  1. 重複使用 Flight Tick。
  2. 新增名為 Battery Collect State 的 Get Attribute。將 Flight Tick 上任一個未使用的底部白色圓圈連到 Battery Collect State。
  3. 新增名為 Battery Collect Active 的 If。將 Battery Collect State 上任一個未使用的底部白色圓圈連到 Battery Collect Active。
  4. 新增名為 Battery Distance 的 Calculate Distance。將 Battery Collect Active 底部的(true)圓圈連到 Battery Distance。
  5. 新增名為 Battery Near 的 If。將 Battery Distance 上任一個未使用的底部白色圓圈連到 Battery Near。
  6. 新增名為 Battery Bonus 的 Add Values。將 Battery Near 底部的(true)圓圈連到 Battery Bonus。

將賺取的秒數加入總能量,並停用已收集的電池。

動畫連接示意:增加能量並停用電池

  1. 重複使用 Generate。
  2. 重複使用 Battery Bonus。
  3. 新增名為 Battery Capacity 的 Add Values。將 Generate 上任一個未使用的底部白色圓圈連到 Battery Capacity。將 Battery Bonus 上任一個未使用的底部白色圓圈也連到 Battery Capacity。
  4. 重複使用 Battery Deactivate。將 Battery Bonus 上任一個未使用的底部白色圓圈連到 Battery Deactivate。
  5. 重複使用 Remaining。將 Battery Capacity 上任一個未使用的底部白色圓圈連到 Remaining。

Battery Bonus 儲存所有賺取的秒數。Battery Capacity 儲存初始能量加上賺取的能量。現有的 Seconds 行為會繼續累計經過的時間。

更新倒數計時和結束條件

Timer 參考說明有助於區分會重複更新顯示的計時器,以及你即將取代的一次性遊戲時間限制。

  1. 在 Remaining 中,將常數 A 值 90 替換為 Battery Capacity 的 result 輸出。讓 B 維持連接到 Seconds 的 result 輸出。
  2. 保留能量示意中的兩條連線:Battery Capacity 連到 Remaining,以及 Battery Bonus 連到 Battery Deactivate。拾取物會立即隱藏並標示為非啟用狀態,避免重複獎勵。之後搜尋功能便能在另一個山谷放置電池。
  3. 刪除舊的 Run Limit 計時器及其連線。
  4. 依照下方的結束示意,設定 Energy Empty:比較 Remaining 的結果是否 ≤ 0。重複使用 Finished,並保留 Remaining 目前連到 Clock Text 的連線。
  5. Battery Hide End 用來隱藏 Battery;Battery Label Hide End 用來隱藏 Battery Label。兩者都使用 Set Visibility。依照下方的結束示意連接它們。

在時鐘中使用能量總量

選取接收行為,將來源輸出拖到 First number (A),選擇 final value,並確認產生的引用

放開後,First number (A) 會包含 Battery Capacity · final value。讓第二個數字繼續引用 Seconds。

讓 Remaining 在能量耗盡時觸發 Finished。

動畫連接示意:能量耗盡時結束

  1. 重複使用 Remaining。
  2. 重複使用 Clock Text,並保留它目前與 Remaining 的連線。
  3. 新增名為 Energy Empty 的 If。將 Remaining 上任一個未使用的底部白色圓圈連到 Energy Empty。
  4. 重複使用 Finished。將 Energy Empty 底部的(true)圓圈連到 Finished。
  5. 新增名為 Battery Hide End 的 Set Visibility。將 Finished 上任一個未使用的底部白色圓圈連到 Battery Hide End。
  6. 新增名為 Battery Label Hide End 的 Set Visibility。將 Battery Hide End 上任一個未使用的底部白色圓圈連到 Battery Label Hide End。

現在的能量關係如下:

剩餘秒數 = 90 + 電池獎勵秒數 − 經過秒數

能量和難度使用不同的計數器

重複使用 Finished 群組。它已經會停止計時器和飛船、顯示結果,並檢查最佳分數。

讓收集效果令人滿足且清楚易懂

  1. 收集獎勵示意會新增 Battery Chime (Play Sound)。使用與 Flow Sound 相同的設定和提示音素材。
  2. Battery Message (Change Label) 以 Flow Label 為目標,文字設為 +8s BATTERY。
  3. 依照下方收集獎勵示意的兩條分支操作。
  4. 將 Battery Hide 設為 1.3 秒、執行一次,並關閉 Start Immediately。依照示意重複使用 Show Flow 和 Hide Flow。
  5. 斷開 Velocity → Flow Check。這樣回饋標籤就只會顯示電池訊息,速度訊息便不會覆蓋收集訊息。軌跡和其他效果仍會持續運作。
  6. 將標題畫面說明改為 Hold downhill. Release at the valley. Valley batteries add 8 seconds of flight. 將結果標題的起始文字改為 BATTERY EMPTY。個人最佳紀錄分支可能會將它替換為 NEW PERSONAL BEST。

播放提示音,並顯示玩家獲得的時間。

動畫連接示意:顯示收集獎勵

  1. 重複使用 Battery Bonus。
  2. 新增名為 Battery Chime 的 Play Sound。將 Battery Bonus 上任一個未使用的底部白色圓圈連到 Battery Chime。
  3. 新增名為 Battery Message 的 Change Label。將 Battery Bonus 上任一個未使用的底部白色圓圈連到 Battery Message。
  4. 重複使用 Show Flow。將 Battery Message 上任一個未使用的底部白色圓圈連到 Show Flow。
  5. 新增名為 Battery Hide 的 Timer。將 Battery Message 上任一個未使用的底部白色圓圈連到 Battery Hide。
  6. 重複使用 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 公尺的地表偏移

接下來的實驗

先玩幾局,再新增其他功能。你能及時發現電池並調整方向飛過去嗎?收集一顆電池後,是否有足夠時間抵達下一顆?現在,這些答案比再加一項功能更有用。

準備好擴充專案時,可以試著放置一小排電池,引導玩家飛入山谷。你需要準備一小組物件,並確保每顆電池只獎勵一次。利用電池的位置,引導玩家在合適的時機放開。