移动输入

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

所有 Roblox 会话的一半以上在移动设备上播放,因此在设计面向广泛受众的体验时,考虑跨平台访问性很重要。你应该力求支持各种输入设备,包括鼠标和键盘输入游戏手柄

当设计移动体验时,考虑您希望用户在体验中使用的设备 orientation,然后使用 ContextActionService 来执行以下与移动相关的输入任务:

设备方向

在手机和平板电脑上,设备的方向主要影响用户体验和互动。例如,景观模式最好使用两个拇指操作,而肖像模式可能会导致单手界面。

默认情况下,Roblox 体验以全景模式运行,体验可以在用户的设备旋转时切换为全景“左”和全景“右”。然而,如果需要,体验可以锁定到特定的方向。

定向模式

有五种不同的方向模式,包括两种基于传感器的模式和三种锁定模式。

传感器模式
景观传感器经验始终显示在景观模式(没有肖像模式)且设备检测到其物理方向以确保经验视图始终朝上的默认 Roblox 设置。
传感器设备检测其物理方向,以确保体验视图始终朝上,根据需要切换为景观和肖像模式。
被锁定的模式
剩余景观在带有物理家庭按钮的设备上,家庭按钮位于显示的左侧。在具有虚拟家园/导航栏的设备上,其触摸区域位于显示的底部。
景观右侧在带有物理家庭按钮的设备上,家庭按钮位于显示的右侧。在具有虚拟家园/导航栏的设备上,其触摸区域位于显示的底部。
肖像在带有物理家庭按钮的设备上,家庭按钮位于显示下方。在具有虚拟家园/导航栏的设备上,其触摸区域位于显示的底部。

定向属性

当设置方向时,您可以设置起始方向经验中的方向当前方向

开始定向

StarterGui.ScreenOrientation 为场景点设置默认方向。可接受的值包括:

因为该属性影响所有加入体验的新用户,因此您可以在 Studio 中设置其值在 StarterGuiEnum.ScreenOrientation 内。

经验中的定向

PlayerGui.ScreenOrientation 明确地为用户更改体验的方向。当此属性设置为 枚数中的一个时,体验将立即调整为匹配设置。这可能有用,当体验需要提供特定体验,例如锁定视图以向小游戏提供肖像时。

以下代码示例在 LocalScript 设置屏竖向向导向为横向:


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
  • 要使用与其他图形用户界面按钮类似的自定义图像,请调用 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)