所有 Roblox 會議的四分之一以上都是在移動設備上播放的,因此設計體驗時需要考慮移動平台的可用性。您應該瞄準支持一系列輸入裝置,包括 滑鼠和鍵盤輸入 和 遊戲手柄。
設計移動體驗時,請考慮裝置方向,您希望用戶在您的體驗中使用,然後使用 ContextActionService 來執行移動相關輸入任務:
- 在屏幕上建立按鈕 只能在移動設備上顯示。
- 自訂移動按鈕和用戶界面以創建獨特的移動體驗。
- 設定依據輸入,允許同一個按鈕或輸入執行不同的行動,取決於情況。
裝置方向
對於手機和平板電腦,裝置的方向對使用者體驗和互動大為影響。例如,寫代碼時最好使用兩個手勢,而不是單一的手勢介面。
預設情況下,Roblox 體驗為地圖模式執行,允許體驗在地圖「左」和「右」之間切換。 但是,如果需要,體驗可以鎖定在特定方向。
導向模式
有五種不同的方向模式,包括兩個感應器基礎模式和三個鎖定模式。
感應器模式 | |
---|---|
地形感應器 | 在預設 Roblox 設定中,體驗總是以地平模式顯示 (沒有肖像模式) ,而設備會偵測到其物理方向,以確保體驗視圖總是朝上方。 |
感應器 | 設備會檢測到其物理方向,以確保體驗視圖是向上方向,需要時切換為畫廊和肖像模式。 |
鎖定模式 | |
---|---|
左側景觀 | 在有物理按鈕的設備上,按鈕是顯示的左邊。在有虛擬家庭/導航條的設備上,其觸摸區域在顯示的底部。 |
景觀右 | 在有物理按鈕的設備上,按鈕位於顯示器右邊。在有虛擬家園/導航條的設備上,其觸摸區域位於顯示器底部。 |
肖像 | 在有物理家庭按鈕的設備上,家庭按鈕位於顯示下方。在有虛擬家庭按鈕的設備上,其觸摸區域位於顯示下方。 |
方向和方向
設置方向時,您可以設置開始方向、體驗方向和目前方向。
開始導航
StarterGui.ScreenOrientation 設置一個空間方的預設方向。接受的值包括:
因為這個屬性會影響所有新加入體驗的使用者,因此您可以在 StarterGui → Enum.ScreenOrientation 內的 Studio 中設定其值。
體驗內導航
PlayerGui.ScreenOrientation 明確地改變體驗的方向為一個使用者。當此屬性設為 Enum.ScreenOrientation 枚列中的一個時,體驗將立即對準設定。這可能有助於提供特定體驗,例如為一個小遊戲設定全景模式。
下列代碼示例在 LocalScript 設定直放幕方向為 portrait:
local Players = game:GetService("Players")local playerGUI = Players.LocalPlayer:WaitForChild("PlayerGui")task.wait(2)playerGUI.ScreenOrientation = Enum.ScreenOrientation.Portrait
目前方向
PlayerGui.CurrentScreenOrientation 取得目前裝置的方向。可能的值包括:
下列代碼列印使用者目前的螢幕方向:
local Players = game:GetService("Players")local playerGUI = Players.LocalPlayer:WaitForChild("PlayerGui")print(playerGUI.CurrentScreenOrientation)
角色移動模式
Roblox 提供您可以設置移動設備用戶在體驗中移動方式的多個 StarterPlayer 屬性。
您可以通過修改 StarterPlayer.DevTouchMovementMode 的值來設置 Roblox 體驗的移動控制程式,將其設置為:
選項 | 說明 |
---|---|
ClickToMove | 使用者只能在體驗中擷取目標位置來移動。此模式包含在屏幕右下角的跳躍按鈕。自動跳躍 是此移動模式中常常啟動的狀態。 |
DPad | |
DynamicThumbstick | 會出現動態的拇指棒,其中初始按下。此模式包括屏幕右下角的跳躍按鈕。這是對於移動用戶的預設用戶設定,如果 UserChoice 設置。 |
Scriptable | 關閉所有預設控制,允許您 指令自己的控制程式。 |
Thumbpad | |
Thumbstick | 位於屏幕左下角的移動觸棒。與 DynamicThumbstick 不同,觸棒位置是靜態的,並且在使用者觸摸屏幕時不會改變位置。 |
UserChoice | 允許使用者從體驗設定選單中選擇想要的控制程式。這是體驗的預設移動模式。 |
自動跳躍
當 StarterPlayer.AutoJumpEnabled 啟用時,玩家的角色在接近平台邊緣時會自動跳過隙格。StarterPlayer.AutoJumpEnabled 對於移動設備預設為啟用。
停用 StarterPlayer.AutoJumpEnabled 以禁用此功能,強制使用者只能使用鍵盤聯絡來跳躍。
添加移動按鈕
要添加移動按鈕,請使用 ContextActionService:BindAction() 方法。
Class.ContextActionService:BindAction()|BindAction() 方法接受以下參數:
參數 | 類型 | 說明 |
---|---|---|
行動名稱 | 字串 | 您所綁定的動作的識別字串。您可以使用 actionName 與 ContextActionService 中的其他功能編輯綁定。 |
功能定義 | 函數 | 啟動指定輸入時會呼叫的函數。這個函數接受三個參數:
|
創建TouchButton | boolean | 當真的時,在遊戲在移動設裝置上執行時創建屏幕上的按鈕。 |
輸入類型 | 元組 | 您想要綁定到功能的輸入,例如來自 Enum.KeyCode 的枚數值。 |
您可以使用以下代碼示例來創建一個Interact動作,創建在屏幕上的按鈕,並且也接受 Keyboard 和 Gamepad 輸入:
local ContextActionService = game:GetService("ContextActionService")
local function handleAction(actionName, inputState, inputObject)
if inputState == Enum.UserInputState.Begin then
print(actionName, inputObject)
end
end
-- 綁定操作以功能
ContextActionService:BindAction("Interact", handleAction, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)
移除行動按鈕
要從屏幕上移除移動按鈕,請使用 UnbindAction() 使用您傳送給 BindAction() 的 actionName 字串來剝除它。
使用以下代碼示例來解除以前創建的互動行動作的綁定:
-- 按名稱取消綁定ContextActionService:UnbindAction("Interact")
自訂按鈕使用者介面
您可以使用 ContextActionService 的多個功能來自訂創建在 BindAction() 的畫面按鈕。
按鈕文字
要變更移動按鈕的文字標籤,請使用 SetTitle() 並使用 actionName 字串和一個標題來:
-- 將按鈕標籤設為「對話」ContextActionService:SetTitle("Interact", "Talk")
按鈕圖像
移動按鈕可以使用自訂圖像,就像其他GUI按鈕使用 Class.ContextActionService:SetImage()|SetImage() 方法。
使用以下示例代碼設置按鈕圖像,並將資產 ID 變更為您選擇的圖像:
-- 設定按鈕圖像ContextActionService:SetImage("Interact", "rbxassetid://0123456789")
按鈕位置
按預設,新按鈕的位置會出現在屏幕右下角的區域。您應該仔細考慮放置按鈕在移動設備上,並且記住拇指和手指的位置。
使用以下示例代碼設定按鈕的位置:SetPosition() 方法:
-- 設定按鈕位置ContextActionService:SetPosition("Interact", UDim2.new(1, -70, 0, 10))
依譽輸入
開發為移動設備時,您可能會想改變單個按鈕在基礎上的行為。 隨著移動設備的螢幕空間有限,請使用基礎於角色能力的按鈕來執行不同的行為。
舉例來說,您可以顯示使用者站在黃金寶箱旁邊的「收集」按鈕:
使用以下代碼示例來創建標籤為「收集」的移動按鈕,並且綁定於 collectTreasure 函數:
local ContextActionService = game:GetService("ContextActionService")
local function collectTreasure(actionName, inputState, inputObject)
if inputState == Enum.UserInputState.Begin then
print("Collect treasure")
end
end
ContextActionService:BindAction("Interact", collectTreasure, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)
ContextActionService:SetPosition("Interact", UDim2.new(1, -70, 0, 10))
-- 設定圖像為藍色「收集」按鈕
ContextActionService:SetImage("Interact", "rbxassetid://0123456789")
在遊戲中的另一個時間,您可以將按鈕變更為「對話」,當使用者站在 NPC 附近。而不是添加和移除現有按鈕,您可以使用 ContextActionService:BindAction() 在現有互動行動作中變更按鈕和圖像。
使用以下代碼示例設定現有按鈕標籤為 "Talk" 並將其綁定到 talkToNPC:
ContextActionService:BindAction("Interact", talkToNPC, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)-- 將圖像設為黃色「對話」按鈕ContextActionService:SetImage("Interact", "rbxassetid://0011223344")
偵測其他設備
在交互平台上,您必須知道使用者的當前設備,以便調整 UI 和顯示正確的鍵綁提示。
舉例來說,如果使用者接近寶箱並且有一個可以收集黃金的操作,你可以顯示移動用戶使用屏幕上的「收集」按鈕,並且顯示桌上使用者使用屏幕上的「T」按圖示。
請注意,移動設備也可能有 滑鼠和鍵盤 或 遊戲控制器 插入在內。它也可能有桌上型電腦有 touchscreen 已啟用。 重要是要參考使用者的預設輸入選項,以顯示啟用的滑裝置選項。
在這些情況下,您可以使用 UserInputService 來檢測哪些輸入裝置已啟用。如果多個輸入裝置啟用,請使用 UserInputService:GetLastInputType() 來取得用戶最近使用的輸入裝置以顯示在 UI 上。
您可以使用 ModuleScript ,放置在 ReplicatedStorage 內,並且重新命名為 使用者輸入模塊 ,以取得用戶的輸入類型,然後您可以適應用戶體驗的特定需求。
使用 ModuleScript 來檢查啟用的輸入裝置和上一個使用的輸入裝置:
local UserInputService = game:GetService("UserInputService")
local UserInput = {}
local inputTypeString
-- 如果設備有啟用的鍵盤和滑鼠,請假設這些輸入
if UserInputService.KeyboardEnabled and UserInputService.MouseEnabled then
inputTypeString = "Keyboard/Mouse"
-- 如果設備有觸摸功能,但沒有鍵盤和滑鼠,請假設觸摸輸入
elseif UserInputService.TouchEnabled then
inputTypeString = "Touch"
-- 如果設備有啟用的遊戲控制器,請假設遊戲控制器輸入
elseif UserInputService.GamepadEnabled then
inputTypeString = "Gamepad"
end
function UserInput.getInputType()
local lastInputEnum = UserInputService:GetLastInputType()
if lastInputEnum == Enum.UserInputType.Keyboard or string.find(tostring(lastInputEnum.Name), "MouseButton") or lastInputEnum == Enum.UserInputType.MouseWheel then
inputTypeString = "Keyboard/Mouse"
elseif lastInputEnum == Enum.UserInputType.Touch then
inputTypeString = "Touch"
elseif string.find(tostring(lastInputEnum.Name), "Gamepad") then
inputTypeString = "Gamepad"
end
return inputTypeString, lastInputEnum
end
return UserInput
一旦 使用者輸入模組 指令碼在空間置,使用 LocalScript 中的代碼示例來取得用戶的最後輸入類型:
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- 需要模組local UserInputModule = require(ReplicatedStorage:WaitForChild("UserInputModule"))local currentUserInput, inputEnum = UserInputModule.getInputType()print(currentUserInput, inputEnum)