手機輸入

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

超過一半的所有 Roblox 會話在移動設備上播放,因此在設計廣泛受眾體驗時,考慮跨平台的可輔助功能是很重要的。您應該努力支持各種輸入裝置,包括 滑鼠和鍵盤輸入遊戲手柄

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

裝置方向

在手機和平板電腦上,裝置的方向主要影響用戶體驗和互動。例如,景觀模式最好使用兩個拇指操作,而肖像模式可能會傾向於一個手指界面。

預設情況下,Roblox體驗會以全景模式運行,允許體驗在使用者裝置旋轉時切換為全景「左」和全景「右」。然而,如果需要,體驗可以鎖定在特定的方向上。

導向模式

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

感應器模式
景觀感應器體驗始終在景觀模式(沒有肖像模式)出現的預設 Roblox 設置,裝置偵測到其物理方向以確保體驗視圖始終朝上。
感應器裝置檢測其物理方向,以確保體驗視圖總是朝上,需要時切換到景觀和肖像模式。
鎖定模式
剩餘景觀在具有物理家庭按鈕的裝置上,家庭按鈕位於顯示器左側。在具有虛擬家園/導航欄的裝置上,其觸摸區域位於顯示器底部。
景觀右在具有物理家庭按鈕的裝置上,家庭按鈕位於顯示器右側。在具有虛擬家園/導航欄的裝置上,其觸摸區域位於顯示器底部。
肖像在具有物理家庭按鈕的裝置上,家庭按鈕位於顯示下方。在具有虛擬家園/導航欄的裝置上,其觸摸區域位於顯示器底部。

導向屬性

當設置方向時,您可以設置起始方向經驗內方向當前方向

開始定向

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

因為此屬性會影響所有加入體驗的新用戶,因此您可以在 Studio 中設置其值 StarterGuiEnum.ScreenOrientation 內。

經驗內的定向

PlayerGui.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() 方法,該方法會接受以下參數:

參數類型說明
actionName字串用於綁定的動作標識符字串。你可以使用 actionName 與其他函數在 ContextActionService 中編輯綁定。
functionToBind功能當指定輸入被觸發時呼叫的功能。此功能接收三個參數:
createTouchButtonboolean當真實時,在手裝置上運行遊戲時創建屏幕上的按鈕。
inputTypestuple您打算綁定到功能的輸入,例如來自 Enum.KeyCode 的枚列值。

您可以使用以下代碼示例來創建一個互動行動,創建屏幕上的按鈕,並接受 鍵盤輸入遊戲控制器輸入


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)

一旦新增了自訂按鈕,您可以使用 ContextActionService 的多個功能來自訂創建由 BindAction() 創建的屏幕按鈕。

  • 要變更手機按鈕的文字標籤,請使用 SetTitle() 字串和一個標題字串來呼叫 actionName
  • 若要使用自訂圖像,就像其他 GUI 按鈕一樣,請呼叫 SetImage() 方法,將下方的示例資產 ID 替換為您選擇的圖像。
  • 若要設置按鈕的位置,請使用 SetPosition() 位置值來呼叫 UDim2 位置。

-- 將按鈕標籤設為「對話」
ContextActionService:SetTitle("Interact", "Talk")
-- 設定按鈕圖像
ContextActionService:SetImage("Interact", "rbxassetid://104919049969988")
-- 設定按鈕位置
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:SetTitle("Interact", "Collect")
ContextActionService:SetPosition("Interact", UDim2.new(1, -70, 0, 10))

在遊遊玩期間的另一個點,當使用者站在 NPC 附近時,您可以將按鈕變更為「對話」。取代移除現有按鈕以放置另一個,您可以簡單地呼叫現有 BindAction() 行動上的 "Interact" 動作,更改目標功能和按鈕標題:


ContextActionService:BindAction("Interact", talkToNPC, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)
ContextActionService:SetTitle("Interact", "Talk")

偵測其他裝置

在跨平台體驗中,顯示主動使用的裝置的輸入選項來參考使用者的首選輸入選項很重要。例如,手機可能會有 滑鼠和鍵盤遊戲手柄 連接,或者桌面可能會啟用觸摸屏。如果啟用了多個輸入來源,您可以使用 GetLastInputType() 來獲得使用者最後使用的輸入裝置。

作為基礎,您可以使用以下 ModuleScript ,放置在 ReplicatedStorage 內,並重命名為 用戶輸入模組 ,然後您可以根據用戶的輸入類型調整 UI 布局或上下文需求。


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)