移動輸入

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

所有 Roblox 會議的四分之一以上都是在移動設備上播放的,因此設計體驗時需要考慮移動平台的可用性。您應該瞄準支持一系列輸入裝置,包括 滑鼠和鍵盤輸入 和 遊戲手柄。

設計移動體驗時,請考慮裝置方向,您希望用戶在您的體驗中使用,然後使用 ContextActionService 來執行移動相關輸入任務:

裝置方向

對於手機和平板電腦,裝置的方向對使用者體驗和互動大為影響。例如,寫代碼時最好使用兩個手勢,而不是單一的手勢介面。

預設情況下,Roblox 體驗為地圖模式執行,允許體驗在地圖「左」和「右」之間切換。 但是,如果需要,體驗可以鎖定在特定方向。

導向模式

有五種不同的方向模式,包括兩個感應器基礎模式和三個鎖定模式。

感應器模式
地形感應器在預設 Roblox 設定中,體驗總是以地平模式顯示 (沒有肖像模式) ,而設備會偵測到其物理方向,以確保體驗視圖總是朝上方。
感應器設備會檢測到其物理方向,以確保體驗視圖是向上方向,需要時切換為畫廊和肖像模式。
鎖定模式
左側景觀在有物理按鈕的設備上,按鈕是顯示的左邊。在有虛擬家庭/導航條的設備上,其觸摸區域在顯示的底部。
景觀右在有物理按鈕的設備上,按鈕位於顯示器右邊。在有虛擬家園/導航條的設備上,其觸摸區域位於顯示器底部。
肖像在有物理家庭按鈕的設備上,家庭按鈕位於顯示下方。在有虛擬家庭按鈕的設備上,其觸摸區域位於顯示下方。

方向和方向

設置方向時,您可以設置開始方向、體驗方向和目前方向。

開始導航

StarterGui.ScreenOrientation 設置一個空間方的預設方向。接受的值包括:

因為這個屬性會影響所有新加入體驗的使用者,因此您可以在 StarterGuiEnum.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 中的其他功能編輯綁定。
功能定義函數啟動指定輸入時會呼叫的函數。這個函數接受三個參數:
  • 與 actionName 相等的字串。
  • Enum.UserInputState 定義輸入狀態,當它呼叫函數。
  • 用於函數呼叫的 InputObject
創建TouchButtonboolean當真的時,在遊戲在移動設裝置上執行時創建屏幕上的按鈕。
輸入類型元組您想要綁定到功能的輸入,例如來自 Enum.KeyCode 的枚數值。

您可以使用以下代碼示例來創建一個Interact動作,創建在屏幕上的按鈕,並且也接受 KeyboardGamepad 輸入:


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)