Mais da metade de todas as sessões do Roblox são jogadas em dispositivos móveis, então é importante considerar acessibilidade cross-platform ao projetar uma experiência para um público amplo.Você deve ter como objetivo suportar uma variedade de dispositivos de entrada, incluindo entrada do mouse e do teclado e gamepad.
Ao projetar uma experiência móvel, considere a orientação do dispositivo que você pretende que o usuário use em sua experiência, então implemente seus inputs com ContextActionService:
- Criar botões na tela visíveis apenas em dispositivos móveis.
- Configurar contexto dependente de entradas que permite que o mesmo botão ou entrada execute uma ação diferente dependendo da situação.
- Detectar outros dispositivos de entrada , como um mouse ou teclado conectado a um tablet móvel, para fornecer os prompts corretos na tela ao usuário.
Orientação do dispositivo
Em telefones e tablets, a orientação do dispositivo afeta principalmente a experiência e a interação do usuário.Por exemplo, o modo paisagem é melhor operado com dois polegares enquanto o modo retrato pode se adaptar a uma interface de um dedo.
Por padrão, as experiências do Roblox são executadas no modo de paisagem, permitindo que a experiência mude entre a paisagem "esquerda" e a paisagem "direita" à medida que o dispositivo do usuário gira.No entanto, as experiências podem ser bloqueadas para uma orientação específica se desejado.
Modos de orientação
Existem cinco diferentes modos de orientação, incluindo dois modos baseados em sensores e três modos bloqueados.
Modos de sensores | |
---|---|
Sensor de paisagem | A configuração padrão do Roblox na qual a experiência sempre aparece no modo paisagem (sem modo retrato) e o dispositivo detecta sua orientação física para garantir que a visualização da experiência sempre esteja orientada para cima. |
ensorador | O dispositivo detecta sua orientação física para garantir que a visão da experiência esteja sempre orientada para cima, mudando entre o modo paisagem e retrato quando necessário. |
Modos trancados | |
---|---|
Paisagem restante | Em dispositivos com um botão de início físico, o botão de início está à esquerda do display.Em dispositivos com uma barra de início/navegação virtual, sua região de toque está na parte inferior da exibição. |
Paisagem à direita | Em dispositivos com um botão de início físico, o botão de início está à direita da tela.Em dispositivos com uma barra de início/navegação virtual, sua região de toque está na parte inferior da exibição. |
Portrait Documentação Técnica Portuguese:Portrait | Em dispositivos com um botão de início físico, o botão de início está abaixo do display.Em dispositivos com uma barra de início/navegação virtual, sua região de toque está na parte inferior da exibição. |
Propriedades de orientação
Ao definir uma orientação, você pode definir a orientação inicial, a orientação na experiência e a orientação atual.
Começando orientação
StarterGui.ScreenOrientation define a orientação padrão para um local. Os valores aceitáveis incluem:
Como essa propriedade afeta todos os novos usuários que se juntam à experiência, você pode definir seu valor em StarterGui → Enum.ScreenOrientation dentro do Studio.
Orientação na experiência
PlayerGui.ScreenOrientation Muda explicitamente a orientação da experiência para um usuário.Quando esta propriedade é definida para um dos Enum.ScreenOrientation enums em um LocalScript, a experiência imediatamente se orientará para combinar com a configuração.Isso pode ser útil quando uma experiência precisa fornecer uma experiência específica, como bloquear a visão para o modo retrato para um minijogo.
O seguinte exemplo de código em um LocalScript define a orientação da tela para o modo retrato:
local Players = game:GetService("Players")local playerGUI = Players.LocalPlayer:WaitForChild("PlayerGui")task.wait(2)playerGUI.ScreenOrientation = Enum.ScreenOrientation.Portrait
Orientação atual
PlayerGui.CurrentScreenOrientation obter a orientação do dispositivo atual. Os valores possíveis incluem:
O seguinte código imprime a orientação de tela atual do usuário:
local Players = game:GetService("Players")local playerGUI = Players.LocalPlayer:WaitForChild("PlayerGui")print(playerGUI.CurrentScreenOrientation)
Modos de movimento de personagem
O Roblox oferece várias propriedades StarterPlayer que você pode definir para alterar como os usuários em dispositivos móveis podem se mover através de sua experiência.
Você pode definir esquemas de controle de movimento móvel para experiências do Roblox alterando os valores de StarterPlayer.DevTouchMovementMode para um dos seguindo:
Opção | Descrição |
---|---|
ClickToMove | Os usuários só podem se mover pela experiência ao tocar em uma localização alvo.Este modo inclui um botão de pulo na região inferior direita da tela.Pulo automático está sempre ativo neste modo de movimento. |
DPad | |
DynamicThumbstick | Um botão dinâmico aparece onde o usuário pressiona inicialmente.Este modo inclui um botão de pulo na região inferior direita da tela.Esta é a configuração padrão do usuário para usuários móveis se UserChoice for configurar. |
Scriptable | Desabilita todos os controles padrão e permite que você scriptie seu próprio esquema de controle . |
Thumbpad | |
Thumbstick | Um polegar móvel localizado na região inferior esquerda da tela.Ao contrário de DynamicThumbstick, a posição do botão é estática e não muda de posição quando o usuário toca na tela. |
UserChoice | Permite que os usuários escolham o esquema de controle desejado do menu Configurações na experiência. Este é o modo de movimento padrão para experiências. |
Pulo automático
Quando StarterPlayer.AutoJumpEnabled é ativado, o personagem do usuário pula automaticamente sobre os espaços ao se aproximar da borda de uma plataformaStarterPlayer.AutoJumpEnabled está habilitado por padrão para dispositivos móveis.
Desabilite StarterPlayer.AutoJumpEnabled para desativar essa funcionalidade e forçar os usuários a pular apenas usando seus atalhos de teclado.
Botões móveis personalizados
Para adicionar botões móveis personalizados, use o método ContextActionService:BindAction() que toma os seguintes parâmetros:
Parâmetro | Tipo | Descrição |
---|---|---|
actionName | string / cadeia / texto | Uma string de identificador para a ação que você está vinculando. Você pode usar o actionName com outras funções em ContextActionService para editar o vinculo. |
functionToBind | função | A função a ser chamada quando o input especificado for acionado. Essa função recebe três argumentos:
|
createTouchButton | booleano | Quando verdadeiro, cria um botão na tela quando o jogo está sendo executado em um dispositivo móvel. |
inputTypes | tupla | Os inputs que você pretende vincular à função, como valores de enumeração de um Enum.KeyCode . |
Você pode usar o seguinte exemplo de código para criar uma ação Interagir que cria um botão na tela e também aceita uma entrada de teclado e gamepad:
local ContextActionService = game:GetService("ContextActionService")
local function handleAction(actionName, inputState, inputObject)
if inputState == Enum.UserInputState.Begin then
print(actionName, inputObject)
end
end
-- Vincular ação à função
ContextActionService:BindAction("Interact", handleAction, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)
Uma vez que um botão personalizado é adicionado, você pode usar uma das várias funções de ContextActionService para personalizar os botões na tela que são criados por BindAction().
- Para alterar o rótulo de texto para um botão móvel, chame SetTitle() com a string actionName e uma string / cadeia / textode título.
- Para usar uma imagem personalizada como outros botões de GUI, chame o método SetImage(), substituindo o ID de recurso de exemplo abaixo por uma imagem de sua escolha.
- Para definir a posição de um botão, chame SetPosition() com um valor de posição UDim2.
-- Defina a etiqueta do botão para "Falar"ContextActionService:SetTitle("Interact", "Talk")-- Definir imagem de botãoContextActionService:SetImage("Interact", "rbxassetid://104919049969988")-- Definir posição do botãoContextActionService:SetPosition("Interact", UDim2.new(1, -70, 0, 10))
Entradas dependentes de contexto
Ao desenvolver para dispositivos móveis, você pode muitas vezes querer alterar o que um único botão faz com base no contexto.Como o espaço na tela em dispositivos móveis é limitado, use botões contextuais que realizam diferentes ações com base no que o personagem é capaz de fazer.
Por exemplo, você pode exibir um botão "Coletar" ativo quando o usuário estiver perto de um baú de ouro, vinculado à função 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))
Em outro ponto durante o jogabilidade, você pode alterar o botão para "Falar" quando o usuário está perto de um NPC.Em vez de remover o botão existente para colocar outro, você pode simplesmente chamar BindAction() na ação existente "Interact", alterando a função-alvo e o título do botão:
ContextActionService:BindAction("Interact", talkToNPC, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)ContextActionService:SetTitle("Interact", "Talk")
Detectar outros dispositivos
Em experiências cross-platform, é importante referenciar as opções de entrada preferidas do usuário exibindo opções de entrada para o dispositivo ativamente usado.Por exemplo, um dispositivo móvel pode ter um mouse e teclado ou gamepad conectado, ou é possível que um desktop tenha um toque ativado.Se várias fontes de entrada forem habilitadas, você pode usar GetLastInputType() para obter o último dispositivo de entrada usado pelo usuário.
Como fundação, você pode usar o seguinte ModuleScript, colocado dentro de ReplicatedStorage e renomeado para UserInputModule , para obter o digitarde entrada do usuário, após o qual você pode adaptar o layout da interface ou o contexto às necessidades específicas da sua experiência.
local UserInputService = game:GetService("UserInputService")
local UserInput = {}
local inputTypeString
-- Se o dispositivo tiver teclado e mouse ativos, assuma essas entradas
if UserInputService.KeyboardEnabled and UserInputService.MouseEnabled then
inputTypeString = "Keyboard/Mouse"
-- Caso o dispositivo tenha capacidade de toque, mas sem teclado e mouse, assuma a entrada de toque
elseif UserInputService.TouchEnabled then
inputTypeString = "Touch"
-- Caso o dispositivo tenha um controle / controle de jogoativo, assuma a entrada do gamepad
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
Uma vez que o script UserInputModule está em local, use o seguinte exemplo de código em um LocalScript para obter o último digitarde entrada do usuário:
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Exigir módulolocal UserInputModule = require(ReplicatedStorage:WaitForChild("UserInputModule"))local currentUserInput, inputEnum = UserInputModule.getInputType()print(currentUserInput, inputEnum)