在你的遊戲中加入控制器支援 | hyperPad Documentation
Logo

讓玩家使用控制器、保留觸控控制,並讓他們自行選擇按鍵綁定。本教學將逐一帶你了解 hyperPad 中的各個部分。

你可以跟著完整教學操作,也可以從最符合你遊戲需求的部分開始:

範例使用 Player、Move Joystick 和 Jump Button 等物件名稱。請在自己的專案中選取對應的物件。從頭打造的移動範例是一個簡單的俯視場景。現有遊戲範例則會保留遊戲目前的移動規則。

開始之前

使用裝置的 Bluetooth 或 USB 設定連接支援的控制器。hyperPad 會偵測已連接的控制器。你可以透過遊戲自己的 UI 顯示並指派這些裝置。

你可以先建立行為,再連接控制器。檢查移動、按鈕按下狀態和多人遊戲時,請使用實際硬體。選單中的控制器圖示會顯示按鍵配置;裝置選擇器則會顯示目前的裝置。

Controller Event 會根據實體控制器輸入觸發遊戲操作。Map Control Inputs 會為遊戲已使用的輸入新增實體控制器替代方式。兩者都能選擇 Player。Player 1 和 Player 2 是指派用的插槽。對 Controller Event 和 Controller Status 而言,Player 0 會監聽任何控制器。可在選擇選單中使用此設定。Map Control Inputs 使用 Player 1 或更高編號。

教學圖示中的白色連線會依序執行下一個行為。從底部白色連接點拖曳到下一個行為上方的連接點。綠色箭頭表示將輸出拖曳到屬性欄位。開啟接收行為的屬性,將來源行為的綠色輸出圖示拖曳到欄位中;若出現選擇器,請選取指定的輸出。只有一個輸出的行為會直接填入欄位。

圓角行為圖是教學示意圖。屬性面板和覆蓋層畫面則是實際的 hyperPad 深色模式擷取畫面。GIF 說明文字會標明原生錄製畫面或繪製的教學動畫。

從頭打造控制器操作

1. 設定簡單的移動場景

建立空白場景。在 Main 圖層新增一個名為 Player 的 Graphic Object。選取該物件,並將物理模式設為 Physics。在 Scene UI 新增一個名為 ActionLabel 的 Label Object。為標籤設定起始文字,例如 Press the bottom button。

點一下地球圖示開啟 Global Properties。在其物理設定區段中,選取 Birds Eye View。將 World Gravity X 和 Y 設為 0。也將 Air Resistance 設為 0。選取 Birds Eye View 後請再次確認,因為該預設值可能會變更空氣阻力。

深色模式的 Global Properties,顯示 Birds Eye View、世界重力為零,以及空氣阻力為零。

這樣就能看到搖桿如何移動 Player,而不會受到重力影響。Player 可使用你自己的 Graphic。

2. 監聽左搖桿

選取 ActionLabel,點一下 Behaviors,然後從 Interaction → Controls 新增 Controller Event。不要為它設定輸入白色連線。將 Player 設為 1、Control 設為 Left Stick,並將 Event 設為 Value Changed。

Player 1、Left Stick、Value Changed 的 Controller Event。

實際深色模式 Controller Event 屬性中的相同設定。

搖桿變動時會觸發 Value Changed,包括搖桿回到中立位置時。其 x 和 y 輸出表示搖桿方向,範圍從 -1 到 1。

3. 將水平輸入轉換為速度

從 Logic 新增 Multiply Values。將標題改為 Scale X,方便區分兩個計算。它仍然是 Multiply Values 行為。

將 Controller Event 底部的白色連接點連到 Scale X 頂部的連接點。開啟 Scale X 的屬性。將 Controller Event 的綠色輸出圖示拖曳到上方計算欄位,然後選取 x。在下方欄位輸入 5。中間的運算子保留為 times。

Controller Event 到 Scale X 的白色執行連線;x 拖曳至上方計算欄位,並乘以 5。

實際的 Scale X 屬性,顯示 Controller Event - x、times 和 5。

現在,水平搖桿輸入滿格時會產生 5 的速度;輸入一半時則會產生 2.5。

4. 設定兩個移動軸

再新增一個 Multiply Values,並命名為 Scale Y。將 Controller Event 的 y 輸出拖曳到上方欄位。在下方欄位輸入 5。

從 Physics 新增 Set Velocity。將 Object A 選為 Player。將 Keep X Velocity 和 Keep Y Velocity 設為關閉,以顯示 x 和 y 欄位。

依照以下順序連接白色執行鏈:Controller Event → Scale X → Scale Y → Set Velocity。將 Scale X 的 Result 輸出拖曳到 Set Velocity 的 x 欄位。將 Scale Y 的 Result 輸出拖曳到 y 欄位。

完整的移動鏈,包含三條白色執行連線和四條綠色輸出至欄位的箭頭。

實際的 Set Velocity 屬性;兩個 Keep Velocity 開關皆關閉,且 x、y 欄位引用 Scale X 和 Scale Y 的 Result。

Set Velocity 使用結果之前,兩項計算都會先執行。速度欄位的單位是公尺/秒。兩個軸使用相同的乘數,再調整該數值即可改變速度。

5. 確認搖桿回到中立位置時的反應

執行場景並移動左搖桿,再讓它回到中心。同一個 Value Changed 事件會在搖桿回到中立位置時,將 0 傳給 x 和 y,因此計算結果會將兩個速度軸都設為 0。

同一條 Value Changed 移動鏈會在搖桿回到中立位置時將速度設為零。

請讓移動保持在這一個事件中。重新綁定後,移動和停止都會使用同一個搖桿。

6. 在裝置或指派變更後停止移動

新增 Controller Status,設定 Player 1 和 Event Changed。將它連到另一個作用於 Player 的 Set Velocity,關閉兩個 Keep Velocity 開關,並將兩個軸都設為 0。

Player 1 的 Controller Status 在發生變更後,觸發另一個將速度設為零的動作。

當 Player 1 的控制器中斷連線或指派變更時,這會停止自訂移動。控制器中斷連線由 Controller Status 處理;一般的搖桿放開則由 Value Changed 移動分支處理。

7. 新增按鈕動作

再新增一個根層級 Controller Event,設定 Player 1、Bottom Button (A / ×) 和 Pressed。將它連到 Set Label。將 Object A 選為 ActionLabel,並在 Text 中輸入 Action!。

Bottom Button Pressed 會執行 Set Label,Object A 為 ActionLabel,Text 為 Action!。

實際深色模式中,底部按鈕 Pressed 事件的屬性。

執行場景。移動左搖桿,讓它回到中立位置,然後按下正面底部按鈕。搖桿回到中立位置時,移動應會停止;按下按鈕時,標籤應會變更。確認連線正確後,可以將 Set Label 換成自己的動作。

按鈕名稱是依位置命名。 在常見的 Xbox 配置上,Bottom Button 是 A;在 PlayStation 配置上則是 ×。切換支援的控制器品牌時,請維持相同的對應方式。

為現有的觸控遊戲設定對應

如果你的遊戲已使用螢幕控制項進行移動、跳躍或射擊,請使用這個方式。保留你設定的速度、動畫、跳躍規則和射擊設定。

8. 找出遊戲使用的輸入物件

先用觸控操作遊玩。開啟包含 Joystick Controlled、Jump with Button 或 Shoot with Button 的 Behavior Tree,並查看各行為的 Object A 和 Object B。

對於這些行為,Object A 是搖桿或按鈕,Object B 則是移動、跳躍或射擊的角色。在此範例中,輸入物件是 Move Joystick、Jump Button 和 Shoot Button。

教學示意圖中的 Joystick Controlled 屬性,顯示 Move Joystick 為 Object A,Player 為 Object B。

這些行為都有 Input 輸出,用來識別輸入物件。設定對應時請使用該輸出。角色的 Object ID 是另一個不同的輸出。

9. 新增控制器移動

在相同的 Behavior Tree 中,新增一個獨立的根層級 Map Control Inputs。不要為它設定輸入白色連線。將 Player 設為 1。

開啟其屬性。將 Joystick Controlled 的綠色輸出圖示拖曳到第一個 Input 欄位,並選取 Input。將 Device 保留為 Controller,再將 Mapped Control 設為 Left Stick。在 Name (optional) 中輸入 Move。

將 Joystick Controlled 的 Input 拖曳到 Map Control Inputs,並選取 Left Stick 和 Move。兩者之間沒有白色連線。

Map Control Inputs 會將控制器輸入送到 Joystick Controlled 已在讀取的同一個搖桿輸入。你的移動設定仍由 Joystick Controlled 負責。

原生 GIF:將 Joystick Controlled 的輸出拖曳到第一列 Controller Move,並選取 Input。

GIF 顯示已完成的 Input 參照,以及與之相容的 Left Stick 選項。新增每一列時,使用相同的拖曳手勢。

10. 設定跳躍按鈕對應

在 Map Control Inputs 上點一下 + Add Input。在彈出選單中選取 Controller。將 Jump with Button 的綠色輸出拖曳到新的 Input 欄位,並選取 Input。將 Mapped Control 設為 Bottom Button (A / ×),並將 Name 設為 Jump。

將 Jump with Button 的 Input 拖曳到對應底部正面按鈕的 Jump 列。

現在,底部正面按鈕會提供 Jump Button 的輸入。跳躍次數、力度和其他跳躍設定仍由 Jump with Button 負責。

11. 設定射擊按鈕對應

點一下 + Add Input,並選取 Controller。將 Shoot with Button 的 Input 拖曳到 Input 欄位。選取 Right Shoulder,並將該列命名為 Shoot。

將 Shoot with Button 的 Input 拖曳到對應 Right Shoulder 的 Shoot 列。

現在,一個 Map Control Inputs 行為中有三列控制器輸入。請保留移動、跳躍和射擊行為上原有的遊戲操作連線。

12. 新增鍵盤替代輸入

再使用三次 + Add Input,每次都選取 Keyboard。重複使用每個原始行為的 Input 輸出,並為各替代輸入設定相同的動作名稱:

名稱要拖曳的 Input 輸出Mapped Control
MoveJoystick Controlled.InputArrow Keys
JumpJump with Button.InputSpace
ShootShoot with Button.InputKey F

三個鍵盤列使用相同的 Move、Jump 和 Shoot 輸入,對應 Arrow Keys、Space 和 Key F。

彈出選單提供三種選擇:Controller、Keyboard 和 Mouse。每一列的 Mapped Control 選擇器會顯示與該裝置相容的選項。之後也可以變更列中的 Device。

原生的 Add Input 彈出選單,會先讓你選取 Controller、Keyboard 或 Mouse,再新增一列。

先前的控制器列會保留在同一個 Map 中。現在應該共有 六列:三種控制器選項和三種鍵盤選項。

實際深色模式 Map Control Inputs 屬性,顯示兩個 Move 替代輸入及其 Controller 和 Keyboard 裝置選項。

此畫面著重顯示兩個 Move 列。請依照上方設定新增 Jump 和 Shoot 列。

13. 確認原有與新增的控制方式

執行遊戲。測試原有的觸控控制,再測試 Left Stick、Bottom Button 和 Right Shoulder。使用鍵盤時,請測試方向鍵、Space 和 F。

試著同時按住觸控按鈕及其實體替代按鈕。先放開一個,再放開另一個。只要仍有來源處於按住狀態,輸入就會維持按住。

執行中的 Controls 覆蓋層顯示 Controller、Keyboard 和 Mouse 分頁,以及某裝置的動作綁定清單。

你會在下文新增此選單。它的動作清單也很適合用來檢查動作名稱和目前的綁定。

設定自訂觸控與鍵盤輸入的對應

14. 保留自訂觸控動作

建立一個簡單範例:新增一個名為 Interact Button 的螢幕物件,以及一個名為 ActionLabel 的標籤。在一個 Behavior Tree 中,新增 Started Touching,將 Interact Button 選為 Object A,並保持 Absorbs Touch 開啟。將它連到 Set Label,目標設為 ActionLabel,並將文字設為 Interacted!。

如果遊戲已有自訂按鈕,請改用現有的觸控動作,並保留其白色遊戲操作連線。

Started Touching 會執行 Set Label。其 Input 輸出則另外提供控制器和鍵盤對應列所需的輸入。

新增對應之前,先點一下物件並確認動作正常。

實際執行範例在點擊 Interact 後,ActionLabel 顯示 Interacted!。

15. 為自訂按鈕新增替代輸入

新增獨立的根層級 Map Control Inputs,並設定 Player 1。將 Started Touching.Input 拖曳到第一列。保留 Device Controller,並選擇 Right Button (B / ○),再將名稱設為 Interact。點一下 + Add Input,選擇 Keyboard,再用相同的 Input 設定 Key E,並將名稱同樣設為 Interact。

實際深色模式 Map Control Inputs 屬性,Started Touching Input 對應至 Right Button 和 Key E,兩者皆命名為 Interact。

你也可以點一下 Input,直接選取 Interact Button。如果該物件的觸控行為位於另一個 Behavior Tree,這種方式就很實用。請選取接收輸入的按鈕。

執行遊戲,測試觸控、右側正面按鈕和 E。三者都應觸發相同的既有動作。如果你也在該物件上使用 While Touching 和 Stopped Touching,對應的按鈕也會提供按住和放開狀態。

請為所選輸入使用相容的對應方式。按鈕按下狀態可對應至按鈕或按鍵。滑動路徑或多指手勢則需要你自行建立控制器遊戲操作。

選用的滑鼠替代輸入: 點一下 + Add Input,並選擇 Mouse。使用 Interact Button 的 Input,並選擇 Left Mouse Button。這會提供相同的按鈕狀態。需要游標位置和拖曳值時,請在對應行為中保留指標位置及拖曳操作。

16. 設定明確的 Keyboard Event 對應

如果自訂動作原本以 Keyboard Event 開始,請保留該行為及其子行為。在此範例中,將 Keyboard Event 設為 Event On Press 和 Key Spacebar,再將它連到 Set Label,並設定 Action!。

新增一個 Player 1 的 Map Control Inputs。將 Keyboard Event.Input 拖曳到第一列,保留 Device Controller,並選擇 Bottom Button (A / ×)。將該列命名為 Action。

Spacebar 的 Keyboard Event 保留原本的 Set Label 動作,其 Input 輸出則對應到底部控制器按鈕。

現在,Spacebar 和控制器按鈕都會觸發相同動作。此設定請使用單一明確的按鍵。Any 按鍵和按鍵序列事件無法識別單一可對應的按鍵。Keyboard Event 選擇器將按鍵稱為 Spacebar;Map 選擇器則稱為 Space。

顯示已連接的裝置

17. 讀取初始控制器數量

在作用中的選單或覆蓋層 UI 中新增一個名為 Controller Count 的 Label Object。開啟其 Behavior Tree。新增根層級 Get Controllers,並將它連到 Set Label。將 Object A 設為 Controller Count。將 Get Controllers 的 count 輸出拖曳到 Text。

原生 GIF:選擇 Get Controllers 的 count 作為 Set Label 的 Text。

標籤會顯示數字,例如 0。如果要在數字周圍加上文字,可以另外新增靜態標題。此數量只包含控制器。鍵盤和滑鼠屬於不同的輸入裝置。

18. 在狀態變更後更新數量

在相同的 Behavior Tree 中,新增 Controller Status,設定 Player 0 和 Event Changed。將它連到第二個 Get Controllers,再連到第二個 Set Label,目標設為 Controller Count。將第二個 getter 的 count 拖曳到第二個標籤行為的 Text 欄位。

兩條獨立的行為鏈:初始化 Controller Count,並在 Controller Status 變更後更新數量。每個標籤都使用各自 getter 的 count。

實際 Controller Status 屬性,設定為 Player 0 和 Changed。

請在作用中的 UI 中保留兩個分支。UI 啟動時,Get Controllers 會提供第一個數值。之後的連線與指派變更則由 Controller Status 回報。若沒有連接控制器,數量會維持為 0。即使遊戲暫停,Controller Status 仍會接收連線和指派變更。請保持此行為啟用,讓 UI 在裝置變更時立即更新。

如需完整的裝置選擇器,請使用下一節產生的 Controls 覆蓋層。Get Controllers 也會公開裝置清單,方便你自行建立 UI。

加入 Controls 覆蓋層與重新綁定功能

19. 開啟 Controls 選單

新增對應時,hyperPad 會加入可編輯的 Controls 覆蓋層。在編輯器的 Overlays 清單中開啟它。其物件會構成控制器圖示、動作列、裝置選擇器和重新綁定按鈕。

深色模式編輯器中的實際 Controls 覆蓋層,並選取 Controller Body。

編輯器會以淡色外框顯示隱藏的分頁和等待輸入元素。執行遊戲時,這些元素會維持隱藏。

在遊戲或暫停選單中新增一個 Controls Button。為該物件新增 Started Touching,並將它連到 Load Overlay。選取 Controls,選擇 Transition None,並保持 Pause 開啟。底下的場景會等待,但覆蓋層仍可互動。

Controls 按鈕會載入產生的 Controls 覆蓋層。

如果你已完成步驟 1–7 的自訂速度範例,請在 Load Overlay 之前插入 Set Velocity。目標設為 Player,關閉兩個 Keep Velocity 開關,並將 x 和 y 設為 0:

在自訂速度範例中,Started Touching 會先執行將速度設為零的 Set Velocity,再載入 Pause 已開啟的 Controls。

先停止移動,可避免搖桿已回到中立位置,但選單關閉後範例仍保留最後速度。對於這種自訂移動,所有開啟暫停選單的方式都應經過相同的零速度動作,包括產生的 Menu 和 Escape 快捷方式、你的暫停按鈕,以及下文的 Player 2 Selection 開啟按鈕。插入該動作時,請保留範本既有的事件設定和 Load Overlay 選項。

20. 讓覆蓋層符合遊戲風格

選取覆蓋層物件,例如 Controller Body,並開啟其 Graphic 屬性。使用色彩選擇器調整色調。範本的 Graphics 使用白色原始圖稿並套用預設色調,因此你可以在編輯器中變更顏色。也可以換成自己的圖稿。

實際深色模式中的 Controller Body 色調選擇器,顯示範本的炭灰色調。

變更配置時,請保留產生的行為參照以及 Done/Cancel 連線。編輯器中的標籤只是佔位文字。執行覆蓋層時,才會填入動作名稱和目前的綁定。未使用的列會消失,只有在所選裝置有超過四個動作時,才會顯示頁面控制項。

21. 選擇玩家與已連接的裝置

執行遊戲並開啟 Controls。選取 Player 1。步驟 21–23 中的 Move 和 Jump 名稱來自對應遊戲範例。Controller Event 綁定會使用其行為標題,因此若想在此選單顯示其他名稱,請為從頭建立的事件設定清楚標題。選取 Controller 分頁。如果連接了多個控制器,可以使用裝置名稱旁的箭頭,將其中一個指派給所選玩家。如果該玩家尚未配置控制器,則可使用箭頭選擇可用裝置。

執行中的 Controls 覆蓋層,顯示 Player 1、輸入裝置標題、三個裝置分頁,以及所選裝置的動作清單。

選單會顯示目前執行環境實際連接的裝置。請使用平台的 Bluetooth 或 USB 設定連接其他裝置。在此處選擇裝置,就會在遊戲中指派該裝置。

選取 Controller、Keyboard 或 Mouse,即可查看該裝置的綁定。六列範例會在 Controller 和 Keyboard 分頁中各自顯示 Move、Jump 和 Shoot。每個分頁只會列出你為該裝置建立的替代輸入。如果尚未新增滑鼠列,Mouse 分頁會顯示此遊戲尚未設定滑鼠控制。

Keyboard 分頁只會顯示目前的鍵盤綁定,不會混入控制器控制。

Mouse 分頁只會顯示你新增的滑鼠替代輸入。此範例將 Jump 對應至 Left Mouse Button。

Mouse 分頁顯示 Jump 對應至 Left Mouse Button。

具有相同輸入和動作名稱的替代輸入會共用同一個動作。控制器圖示會反白顯示所選控制器的綁定。

22. 讓玩家重新綁定動作

將已連接的控制器指派給 Player 1 後,選取 Controller 分頁。點一下 Jump 列上的 Change。動作清單會換成專注的提示畫面。按下要用來執行 Jump 的控制器按鈕。收到相容的按鍵輸入後,清單會返回並顯示新的綁定。

鍵盤 Jump 綁定的等待輸入提示畫面,顯示 Current: Space 和 Cancel 按鈕。

此畫面顯示 Keyboard 分頁中 Jump 的相同等待輸入畫面。目前綁定為 Space。

若要變更鍵盤移動方式,請選取 Keyboard 分頁,並點一下 Move 上的 Change。依提示順序按下四個不同的按鍵:Up、Right、Down、Left。若要使用 WASD 移動,請依序按下 W、D、S、A。

變更 Jump 的控制器選項不會影響其鍵盤選項。按鈕綁定會等待另一個按鈕輸入;移動綁定則會等待相容的移動輸入。

23. 取消、重設並繼續遊戲

等待輸入時選取 Cancel,即可保留先前的綁定。按 Escape 或控制器的 Menu 按鈕也會取消輸入擷取。使用 Reset selected,可將反白動作還原為目前裝置的預設設定。Reset all 會移除已儲存的覆寫設定,並將所選玩家的綁定還原為預設值。

一般綁定清單顯示 Reset selected、Reset all 和 Done。等待輸入提示畫面中則會顯示 Cancel。

選取 Done,放開剛才擷取的輸入,再於遊戲中重新按下。擷取到的輸入會暫時排除於遊戲操作之外,直到回到中立狀態。綁定選擇會儲存於此專案和玩家中。控制器指派則只在目前工作階段有效。

24. 需要自訂重新綁定元件時自行建置

產生的覆蓋層已提供重新綁定 UI。如果你想自行建立 Change Jump 按鈕,請使用 Rebind Input。

在此選用練習中,將混合的 Map 拆成兩個 Map Control Inputs 行為,並將標題命名為 Controller Inputs 和 Keyboard Inputs。每個 Map 各保留一列 Move、Jump 和 Shoot,並使用相同的來源與實體輸入選項。取代原本混合的 Map,避免其列以另一組副本的形式執行。

建立兩個名為 Change Jump 和 Cancel Change 的按鈕物件,以及一個名為 Jump Binding 的 Label。在與這兩個 Map 相同的 Behavior Tree 中,建立以下獨立分支:

  • Started Touching(Change Jump)→ Rebind Input (Listen) → Rebind Input (Get Binding) → 對 Jump Binding 執行 Set Label。
  • 另一個獨立的根層級 Rebind Input (Get Binding) → 另一個對 Jump Binding 執行的 Set Label,在 UI 啟動時填入標籤。
  • Started Touching(Cancel Change)→ Rebind Input (Cancel)。

對 Listen 和兩個 Get Binding 行為,設定 Player 1,使用 Input Behavior 選取實際的 Controller Inputs 行為,並選擇 Binding Jump。Cancel 操作不需要目標。每個 Set Label 的 Text 都應使用前一個 Get Binding 的 label 輸出。

自訂重新綁定範例顯示 Change、初始化和 Cancel 分支,以及 Get Binding 標籤的拖曳連線。

使用行為選擇器選取 Controller Inputs 執行個體。目標中只保留一列 Jump,能讓你在 Binding 選擇器中清楚辨識。圖中著重顯示該 Jump 列;Controller Map 中仍須保留 Move 和 Shoot 列。

原生 GIF:將 Get Binding 執行個體的 label 輸出拖曳到 Set Label 的 Text。

收到新的輸入或取消操作後,Listen 會完成。接著連接的 getter 會讀取目前已儲存的選擇。若要新增更多 UI 回饋,請參閱 Rebind Input 參考文件中的 success、cancelled、prompt 和 progress 輸出。

為每位玩家配置控制器

25. 為每位玩家分別建立輸入物件

建立 Player 1 Character 和 Player 2 Character。每位玩家都需要各自的搖桿和跳躍按鈕物件。如果複製現有設定,請確認兩邊選取的物件。

在 Player 1 的遊戲行為中,Object A 選取 Player 1 的輸入物件,Object B 選取 Player 1 Character。在 Player 2 的行為中,則選取對應的 Player 2 物件。

為每位玩家的控制項分別新增一個 Map Control Inputs。一個設為 Player 1,另一個設為 Player 2。這些列的 Device Controller 都應保持不變。兩個 Map 都可以將 Move 對應至 Left Stick,並將 Jump 對應至 Bottom Button。

兩個獨立的 Behavior Tree 將各自的搖桿和跳躍輸入對應至 Player 1 和 Player 2,且各自使用不同的輸入物件和角色物件。

玩家插槽決定由哪個已指派的控制器提供輸入。選取的輸入物件則決定哪個角色接收遊戲操作。其他玩家需要不同的輸入物件時,請再新增一個 Map。

如果兩位玩家共用一個鍵盤,請為他們配置不同的按鍵。鍵盤按鍵在所有玩家插槽間共用。

26. 開啟控制器選擇覆蓋層

你可以使用產生的 Controls 覆蓋層中的玩家選擇器,以及 Controller 分頁中的裝置選擇器。如果想建立自訂的「按下按鈕加入」畫面,請建立一個名為 Player 2 Selection 的覆蓋層。新增一個標籤,提示 Player 2 按下控制器底部按鈕。

在選單中新增 Choose Player 2 Controller 按鈕。將它的 Started Touching 連到 Load Overlay。選取 Player 2 Selection,選擇 Transition None,並保持 Pause 開啟。

Choose Player 2 Controller 會在 Pause 開啟時顯示 Player 2 Selection。

在此覆蓋層中的說明標籤上加入下一個步驟的選擇行為。這些行為只應在選擇 UI 開啟時執行。

27. 指派按下按鈕的控制器

在 Player 2 Selection 中新增 Controller Event,設定 Player 0、Bottom Button (A / ×) 和 Pressed。將它連到 Assign Controller,並設定 Player 2。

開啟 Assign Controller 的屬性。將 Controller Event 的 deviceID 輸出拖曳到 Controller ID。使用此即時輸出識別按下按鈕的裝置。

Player 0 的 Controller Event 將 deviceID 提供給 Player 2 的 Assign Controller。

原生 GIF:為 Assign Controller 的 Controller ID 欄位選取 deviceID。

Player 0 會監聽已指派和未指派的控制器。Assign Controller 會將所選裝置的插槽改為 Player 2,並取代先前指派給該插槽的裝置。

28. 指派成功後關閉選擇器

將 Assign Controller 連到 If。將 Assign Controller 的 success 輸出拖曳到 Value A。選擇 Is Equal To,並在 Value B 輸入 1。

將 If 的底部符合條件輸出連到 Close Overlay。選擇 Transition None,開啟 Unload,並保持 Resume All 關閉。此簡單範例中,If 右側不符合條件的輸出不需連接。

完整的選擇鏈:Controller Event、Assign Controller、If(success 等於 1),以及從底部符合條件路徑連出的 Close Overlay。另有分開顯示 deviceID 和 success 輸出拖曳。

指派成功時,選擇覆蓋層會關閉並卸載;指派失敗時則會保持開啟。卸載會移除 Player 0 的選擇監聽器,因此一般遊戲操作中的按鍵不會重新指派控制器。

29. 確認兩位玩家的設定

開啟選擇器。按下預定指派給 Player 2 的控制器底部按鈕,並在選單關閉後放開。分別測試 Player 1 和 Player 2。

Player 1 和 Player 2 的獨立對應行為使用相同位置的實體按鈕,但搭配不同的輸入物件。

請使用兩個實際控制器,確認多人遊戲的獨立控制。只有一個控制器時,也可以檢查重新指派功能。依遊戲需求新增更多玩家插槽和輸入對應。可連接的裝置數量取決於平台和硬體。

新連接的控制器會指派至第一個可用的正數插槽。玩家可以透過選擇器變更此選擇。裝置 ID 只適用於目前工作階段,因此請使用事件的 deviceID,不要儲存手動輸入的 ID 供之後工作階段使用。

加入震動回饋

30. 為按鈕動作加入震動脈衝

回到步驟 7 建立的 Controller Event 和 Set Label。保留兩者之間的白色連線。按鈕仍應將 ActionLabel 設為 Action!。

從 Interaction > Controls 新增 Vibrate。將 Set Label 底部的白色圓形連接點連到 Vibrate 頂部的白色圓形連接點。設定以下屬性:

  • Player: 1。
  • Vibrate: Controller。
  • Intensity (%): 70。
  • Duration (ms): 150。

步驟 7 的 Controller Event 連到 Set Label(ActionLabel、Text 為 Action!),再連到 Vibrate(Player 1、Controller、70%、150 ms)。

原有的按鈕動作仍維持連線;接在後面的白色連線會觸發震動脈衝。

在 Player 1 已指派支援的控制器後執行遊戲。按下正面底部按鈕,標籤會變更,控制器也會短暫震動。支援觸覺回饋的已配對 iPhone 也可使用相同設定。

在現有的觸控遊戲中,請在應提供回饋的遊戲事件或動作之後新增 Vibrate。原始輸入和對應的控制器替代輸入都可以連到同一個 Vibrate 行為。震動不需要新增 Map 列。

多人遊戲時,請將 Player 設為接收回饋的玩家。你也可以將該玩家 Controller Event 的正數 playerIndex 輸出拖曳到 Vibrate 的 Player 欄位。白色執行連線也必須保留。

繪製動畫:將 Controller Event 的 playerIndex 輸出拖曳到 Vibrate 的 Player 欄位。

教學動畫。綠色參照會提供玩家編號;白色連線則會觸發震動脈衝。

Intensity 的範圍是 0 到 100%。Duration 使用毫秒,因此 1000 ms 就是一秒。將任一數值設為 0 即可停止震動。Vibrate 發出要求後會立即執行下一個已連接的行為。

即使控制器不支援震動,輸入功能仍可正常運作。請參閱 Vibrate 參考文件,了解目的地選項、success 和平台支援狀況。玩家可在 Controls 覆蓋層中重新綁定遊戲操作;震動則是附加在動作上的回饋。

檢查完成的遊戲

測試項目檢查內容
尚未觸碰螢幕前重新啟動已設定對應的控制器和鍵盤輸入應能立即使用。
使用原有的觸控 UI移動、跳躍、射擊和自訂動作仍使用你設定的規則。
放開搖桿和按鈕按住的動作會停止。自訂速度範例的兩個軸會回到 0。
中斷連線或重新指派控制器狀態 UI 會更新。自訂移動會透過其 Status 分支停止。
變更一個綁定,再取消另一個變更已儲存的選擇能正常運作;取消會保留先前的選擇。
重設並重新開啟專案要求還原時,預設值會恢復。已儲存的選擇會保留在該專案和玩家中。
開啟並關閉 Controls遊戲暫停時覆蓋層仍可互動。選取 Done 後遊戲會繼續。
使用兩個控制器遊玩每個控制器都會操作指派給該玩家的物件。
觸發各玩家控制器的震動支援的硬體會讓指定玩家收到短暫震動。無法提供回饋時,遊戲仍可繼續。

如需查看所有屬性與輸出,請參閱 Map Control Inputs、Controller Event、Controller Status、Get Controllers、Assign Controller、Rebind Input 和 Controls Overlay。

如需了解裝置觸覺回饋、控制器回饋和已配對 iPhone,請參閱 Vibrate。