Más de la mitad de todas las sesiones de Roblox se reproducen en dispositivos móviles, por lo que es importante considerar la accesibilidad en todas las plataformas al diseñar una experiencia para un amplio público.Debes apuntar a soportar una variedad de dispositivos de entrada, incluidos la entrada del mouse y el teclado y gamepad.
Al diseñar una experiencia móvil, considere la orientación del dispositivo que tiene la intención de usar el usuario en su experiencia, luego implemente sus entradas con ContextActionService para realizar las siguientes tareas de entrada relacionadas con el móvil:
- Crear botones en la pantalla visibles solo en dispositivos móviles.
- Configurar las entradas dependientes del contexto que permiten que el mismo botón o entrada realice una acción diferente dependiendo de la situación.
- Detectar otros dispositivos de entrada , como un mouse o teclado conectado a una tableta móvil, para proporcionar al usuario los indicadores correctos en la pantalla.
Orientación del dispositivo
En teléfonos y tabletas, la orientación del dispositivo afecta principalmente la experiencia y la interacción del usuario.Por ejemplo, el modo paisaje se opera mejor con dos pulgares mientras que el modo retrato puede prestarse a una interfaz de un solo dedo.
Por defecto, las experiencias de Roblox se ejecutan en modo paisaje, permitiendo que la experiencia cambie entre el paisaje "izquierdo" y el paisaje "derecho" a medida que gira el dispositivo del usuario.Sin embargo, las experiencias pueden ser bloqueadas a una orientación específica si se desea.
Modos de orientación
Hay cinco modos de orientación diferentes, incluidos dos modos basados en sensores y tres modos bloqueados.
Modos de sensores | |
---|---|
Sensor de paisaje | La configuración predeterminada de Roblox en la que la experiencia siempre aparece en modo paisaje (sin modo retrato) y el dispositivo detecta su orientación física para asegurar que la vista de la experiencia siempre esté orientada hacia arriba. |
ensorador | El dispositivo detecta su orientación física para garantizar que la vista de la experiencia siempre esté orientada hacia arriba, cambiando entre el modo paisaje y el modo retrato según sea necesario. |
Modos bloqueados | |
---|---|
Paisaje restante | En dispositivos con un botón de inicio físico, el botón de inicio está a la izquierda de la pantalla.En dispositivos con una barra de inicio virtual/navegación, su región de toque está en la parte inferior de la pantalla. |
Paisaje derecho | En dispositivos con un botón de inicio físico, el botón de inicio está a la derecha de la pantalla.En dispositivos con una barra de inicio virtual/navegación, su región de toque está en la parte inferior de la pantalla. |
Perfil | En dispositivos con un botón de inicio físico, el botón de inicio está debajo de la pantalla.En dispositivos con una barra de inicio virtual/navegación, su región de toque está en la parte inferior de la pantalla. |
Propiedades de orientación
Al establecer una orientación, puedes establecer la orientación inicial, la orientación en experiencia y la orientación actual.
Orientación inicial
StarterGui.ScreenOrientation establece la orientación predeterminada para un lugar. Los valores aceptables incluyen:
Debido a que esta propiedad afecta a todos los nuevos usuarios que se unen a la experiencia, puedes establecer su valor en StarterGui → Enum.ScreenOrientation dentro de Studio.
Orientación en la experiencia
PlayerGui.ScreenOrientation cambia explícitamente la orientación de la experiencia para un usuario.Cuando esta propiedad se establece en uno de los Enum.ScreenOrientation enunciados en un LocalScript, la experiencia se orientará inmediatamente para coincidir con la configuración.Esto puede ser útil cuando una experiencia necesita proporcionar una experiencia particular como bloquear la vista en retrato para un minijuego.
El siguiente ejemplo de código en un LocalScript establece la orientación de la pantalla en retrato:
local Players = game:GetService("Players")local playerGUI = Players.LocalPlayer:WaitForChild("PlayerGui")task.wait(2)playerGUI.ScreenOrientation = Enum.ScreenOrientation.Portrait
Orientación actual
PlayerGui.CurrentScreenOrientation obtiene la orientación del dispositivo actual. Los valores posibles incluyen:
El siguiente código imprime la orientación de la pantalla actual del usuario:
local Players = game:GetService("Players")local playerGUI = Players.LocalPlayer:WaitForChild("PlayerGui")print(playerGUI.CurrentScreenOrientation)
Modos de movimiento de caracteres
Roblox ofrece varias propiedades StarterPlayer que puedes configurar para cambiar cómo los usuarios en dispositivos móviles pueden moverse por tu experiencia.
Puedes establecer esquemas de control de movimiento móvil para experiencias de Roblox cambiando los valores de StarterPlayer.DevTouchMovementMode a uno de los siguiendo:
Opción | Descripción |
---|---|
ClickToMove | Los usuarios solo pueden moverse por la experiencia presionando una ubicación objetivo.Este modo incluye un botón de salto en la región inferior derecha de la pantalla.El salto automático siempre está activo en este modo de movimiento. |
DPad | |
DynamicThumbstick | Un joystick dinámico aparece donde el usuario presiona inicialmente hacia abajo.Este modo incluye un botón de salto en la región inferior derecha de la pantalla.Esta es la configuración predeterminada para el usuario para usuarios móviles si UserChoice está establecer. |
Scriptable | Desactiva todos los controles predeterminados y te permite programar tu propio esquema de control. |
Thumbpad | |
Thumbstick | Un joystick móvil ubicado en la región inferior izquierda de la pantalla.A diferencia de DynamicThumbstick, la posición del joystick es estática y no cambia de posición cuando el usuario toca la pantalla. |
UserChoice | Permite a los usuarios elegir su esquema de control deseado desde el menú de configuración en la experiencia. Este es el modo de movimiento predeterminado para las experiencias. |
Salto automático
Cuando StarterPlayer.AutoJumpEnabled está habilitado, el personaje del usuario automáticamente salta a través de los espacios al acercarse al borde de una plataforma.StarterPlayer.AutoJumpEnabled está habilitado por defecto para dispositivos móviles.
Deshabilita StarterPlayer.AutoJumpEnabled para deshabilitar esta función y forzar a los usuarios a saltar solo usando sus atajos de teclado.
Botones móviles personalizados
Para agregar botones móviles personalizados, use el método ContextActionService:BindAction() que toma los siguientes parámetros:
Parámetro | Tipo | Descripción |
---|---|---|
actionName | cadena | Una cadena de identificación para la acción que estás vinculando. Puedes usar el nombre de acción con otras funciones en ContextActionService para editar la vinculación. |
functionToBind | función | La función para llamar cuando se activa la entrada especificada. Esta función recibe tres argumentos:
|
createTouchButton | booleno | Cuando es verdadero, crea un botón en la pantalla cuando el juego se ejecuta en un dispositivo móvil. |
inputTypes | tupla | Los inputs que tienes la intención de vincular a la función, como los valores enumerados de un Enum.KeyCode . |
Puedes usar el siguiente ejemplo de código para crear una acción de interactuar que crea un botón en la pantalla y también acepta una entrada de teclado y de gamepad :
local ContextActionService = game:GetService("ContextActionService")
local function handleAction(actionName, inputState, inputObject)
if inputState == Enum.UserInputState.Begin then
print(actionName, inputObject)
end
end
-- Vincular acción a función
ContextActionService:BindAction("Interact", handleAction, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)
Una vez que se agrega un botón personalizado, puedes usar una de las varias funciones de ContextActionService para personalizar los botones en la pantalla que se crean por BindAction() .
- Para cambiar la etiqueta de texto para un botón móvil, llama a SetTitle() con la cadena actionName y una cadena de título.
- Para usar una imagen personalizada al igual que otros botones de interfaz gráfica, llama al método SetImage() , reemplazando la ID de activo de ejemplo a continuación con una imagen de tu elección.
- Para establecer la posición de un botón, llame a SetPosition() con un valor de posición UDim2.
-- Establecer la etiqueta de botón a "Hablar"ContextActionService:SetTitle("Interact", "Talk")-- Establecer imagen de botónContextActionService:SetImage("Interact", "rbxassetid://104919049969988")-- Establecer posición de botónContextActionService:SetPosition("Interact", UDim2.new(1, -70, 0, 10))
Entradas dependientes del contexto
Al desarrollar para dispositivos móviles, a menudo querrás cambiar lo que hace un solo botón en función del contexto.Dado que el espacio de la pantalla en los dispositivos móviles es limitado, utilice botones contextuales que realicen diferentes acciones según lo que el personaje pueda hacer.
Por ejemplo, puedes mostrar un botón "Recoger" activo cuando el usuario está parado cerca de un cofre de oro, vinculado a la función 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))
En otro punto durante el juego, puedes cambiar el botón a "Hablar" cuando el usuario está parado cerca de un PNJ.En lugar de eliminar el botón existente para colocar otro, puedes simplemente llamar BindAction() en la acción existente "Interact", cambiando la función de destino y el título del botón:
ContextActionService:BindAction("Interact", talkToNPC, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)ContextActionService:SetTitle("Interact", "Talk")
Detectar otros dispositivos
En las experiencias de plataforma cruzada, es importante referenciar las opciones de entrada preferidas del usuario mostrando las opciones de entrada para el dispositivo activamente utilizado.Por ejemplo, un dispositivo móvil puede tener un ratón y teclado o un gamepad conectado, o es posible que un escritorio tenga un panel táctil habilitado.Si se habilitan varias fuentes de entrada, puedes usar GetLastInputType() para obtener el último dispositivo de entrada utilizado por el usuario.
Como fundación, puedes usar el siguiente ModuleScript , colocado dentro de ReplicatedStorage y renombrado a UserInputModule , para recuperar el introducirde entrada del usuario, después del cual puedes adaptar el diseño de la interfaz de usuario o el contexto a las necesidades específicas de tu experiencia.
local UserInputService = game:GetService("UserInputService")
local UserInput = {}
local inputTypeString
-- Si el dispositivo tiene teclado y ratónactivos, asuma esas entradas
if UserInputService.KeyboardEnabled and UserInputService.MouseEnabled then
inputTypeString = "Keyboard/Mouse"
-- Si el dispositivo tiene capacidad táctil pero no tiene teclado y ratón, asuma la entrada táctil
elseif UserInputService.TouchEnabled then
inputTypeString = "Touch"
-- Si el dispositivo tiene un controlador para juegoactivo, asume la entrada del 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
Una vez que el script UserInputModule esté en su lugar, use el siguiente ejemplo de código en un LocalScript para obtener el último introducirde entrada del usuario:
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Requerir módulolocal UserInputModule = require(ReplicatedStorage:WaitForChild("UserInputModule"))local currentUserInput, inputEnum = UserInputModule.getInputType()print(currentUserInput, inputEnum)