Entrada móvel

*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.

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:

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 paisagemA 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.
ensoradorO 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 restanteEm 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 à direitaEm 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 StarterGuiEnum.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çãoDescrição
ClickToMoveOs 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
DynamicThumbstickUm 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.
ScriptableDesabilita todos os controles padrão e permite que você scriptie seu próprio esquema de controle .
Thumbpad
ThumbstickUm 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.
UserChoicePermite 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âmetroTipoDescrição
actionNamestring / cadeia / textoUma 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.
functionToBindfunçãoA função a ser chamada quando o input especificado for acionado. Essa função recebe três argumentos:
  • Uma string igual ao actionName.
  • Um Enum.UserInputState que define o estado de entrada quando chamou a função.
  • O InputObject usado na chamada de função.
createTouchButtonbooleanoQuando verdadeiro, cria um botão na tela quando o jogo está sendo executado em um dispositivo móvel.
inputTypestuplaOs 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ão
ContextActionService:SetImage("Interact", "rbxassetid://104919049969988")
-- Definir posição do botão
ContextActionService: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ódulo
local UserInputModule = require(ReplicatedStorage:WaitForChild("UserInputModule"))
local currentUserInput, inputEnum = UserInputModule.getInputType()
print(currentUserInput, inputEnum)