Oltre la metà di tutte le sessioni Roblox viene giocata su dispositivi mobili, quindi è importante considerare l'accessibilità cross-piattaforma quando si progetta un'esperienza per un pubblico ampio.Dovresti mirare a supportare una varietà di dispositivi di input, tra cui input del mouse e della tastiera e gamepad.
Durante la progettazione di un'esperienza mobile, considera l'orientamento del dispositivo che intendi utilizzare nell'esperienza dell'utente, quindi implementa i tuoi input con ContextActionService per eseguire le seguenti attività di input correlate al mobile:
- Crea pulsanti sullo schermo visibili solo su dispositivi mobili.
- Configura gli input dipendenti dal contesto che consentono allo stesso pulsante o input di eseguire un'azione diversa a seconda della situazione.
- Rileva altri dispositivi di input, come un mouse o una tastiera collegata a un tablet mobile, per fornire ai l'utente i prompt corretti sullo schermo.
Orientamento del dispositivo
Su telefoni e tablet, l'orientamento del dispositivo influisce principalmente sull'esperienza utente e sull'interazione.Ad esempio, la modalità paesaggio è meglio gestita con due dita mentre la modalità ritratto può prestarsi ad un'interfaccia a una sola mano.
Per impostazione predefinita, le esperienze Roblox si eseguono in modalità paesaggio, consentendo all'esperienza di passare tra la "sinistra" del paesaggio e la "destra" del paesaggio mentre l' dispositivo dell'utente ruota.Tuttavia, le esperienze possono essere bloccate a un orientamento particolare se desiderato.
Modalità di orientamento
Esistono cinque diversi modi di orientamento, tra cui due modi basati su sensori e tre modi bloccati.
Modalità sensore | |
---|---|
Sensore di paesaggio | L'impostazione predefinita di Roblox in cui l'esperienza appare sempre in modalità paesaggio (nessuna modalità ritratto) e il dispositivo rileva la sua orientazione fisica per garantire che la vista dell'esperienza sia sempre orientata verso l'alto. |
Sensore | Il dispositivo rileva la sua orientazione fisica per garantire che la vista dell'esperienza sia sempre orientata verso l'alto, passando tra il modo paesaggio e ritratto quando necessario. |
Modalità bloccate | |
---|---|
Paesaggio a sinistra | Su dispositivi con un pulsante home fisico, il pulsante home è a sinistra dello schermo.Su dispositivi con una barra home/nav virtuale, la sua regione di tocco è in fondo allo schermo. |
Paesaggio a destra | Su dispositivi con un pulsante home fisico, il pulsante home è a destra dello schermo.Su dispositivi con una barra home/nav virtuale, la sua regione di tocco è in fondo allo schermo. |
Ritratto | Su dispositivi con un pulsante home fisico, il pulsante home è sotto il display.Su dispositivi con una barra home/nav virtuale, la sua regione di tocco è in fondo allo schermo. |
Proprietà di orientamento
Quando impostare un orientamento, puoi impostare l'orientamento di partenza , l'orientamento in-experience e l'orientamento attuale .
Orientamento iniziale
StarterGui.ScreenOrientation imposta l'orientamento predefinito per un Posto. I valori accettabili includono:
Poiché questa proprietà influisce su tutti gli nuovi utenti che si uniscono all'esperienza, puoi impostare il suo valore in StarterGui → Enum.ScreenOrientation all'interno di Studio.
Orientamento in-experience
PlayerGui.ScreenOrientation cambia esplicitamente l'orientamento dell'esperienza per un utente.Quando questa proprietà è impostata su uno degli Enum.ScreenOrientation enumi in un LocalScript , l'esperienza si orienterà immediatamente per corrispondere alla Configurazione.Questo può essere utile quando un'esperienza deve fornire un'esperienza particolare come bloccare la vista in orizzontale per un minigioco.
Il seguente esempio di codice in un LocalScript imposta l'orientamento dello schermo in portrait:
local Players = game:GetService("Players")local playerGUI = Players.LocalPlayer:WaitForChild("PlayerGui")task.wait(2)playerGUI.ScreenOrientation = Enum.ScreenOrientation.Portrait
Orientamento attuale
PlayerGui.CurrentScreenOrientation ottiene l'orientamento del dispositivo attuale. I valori possibili includono:
Il seguente codice stampa l'orientamento dello schermo attuale dell'utente:
local Players = game:GetService("Players")local playerGUI = Players.LocalPlayer:WaitForChild("PlayerGui")print(playerGUI.CurrentScreenOrientation)
Modalità di movimento del personaggio
Roblox offre diverse proprietà StarterPlayer che puoi impostare per modificare il modo in cui gli utenti su dispositivi mobili possono muoversi attraverso la tua esperienza.
Puoi impostare schemi di controllo del movimento mobile per le esperienze Roblox cambiando i valori di StarterPlayer.DevTouchMovementMode a uno dei Seguendo:
Opzione | Descrizione |
---|---|
ClickToMove | Gli utenti possono muoversi solo attraverso l'esperienza toccando una posizione target.Questa modalità include un pulsante di salto nella regione inferiore destra dello schermo.Il salto automatico è sempre attivo in questa modalità di movimento. |
DPad | |
DynamicThumbstick | Un thumbstick dinamico appare dove l'utente premere inizialmente.Questa modalità include un pulsante di salto nella regione inferiore destra dello schermo.Questa è la configurazione utente predefinita per gli utenti mobili se UserChoice è Impostare. |
Scriptable | Disabilita tutti i controlli predefiniti e ti consente di scriptare il tuo schema di controllo. |
Thumbpad | |
Thumbstick | Un thumbstick mobile situato nella regione inferiore a sinistra dello schermo.A differenza di DynamicThumbstick, la posizione del thumbstick è statica e non cambia posizione quando l'utente tocca lo schermo. |
UserChoice | Consente agli utenti di scegliere il loro schema di controllo desiderato dal menu delle impostazioni in-experience. Questo è il modo di movimento predefinito per le esperienze. |
Salto automatico
Quando StarterPlayer.AutoJumpEnabled è abilitato, il personaggio dell'utente salta automaticamente attraverso le lacune quando si avvicina al bordo di una Piattaforma.StarterPlayer.AutoJumpEnabled è abilitato per impostazione predefinita per i dispositivi mobili.
Disabilita StarterPlayer.AutoJumpEnabled per disabilitare questa funzione e forzare gli utenti a saltare solo usando le loro bind delle chiavi.
Bot mobili personalizzati
Per aggiungere pulsanti mobili personalizzati, usa il metodo ContextActionService:BindAction() che prende i seguenti parametri:
Parametro | Tipo | Descrizione |
---|---|---|
actionName | stringa | Una stringa di identificazione per l'azione che stai legando. Puoi usare l'actionName con altre funzioni in ContextActionService per modificare il legame. |
functionToBind | funzione | La funzione da chiamare quando l'input specificato viene attivato. Questa funzione riceve tre argomenti:
|
createTouchButton | booleano | Quando è vero, crea un pulsante sullo schermo quando il gioco viene eseguito su un Dispositivomobile. |
inputTypes | tupla | Gli input che intendi legare alla funzione, come i valori enum da un Enum.KeyCode . |
Puoi usare il seguente esempio di codice per creare un'azione Interagisci che crea un pulsante sullo schermo e accetta anche un input tastiera e gamepad :
local ContextActionService = game:GetService("ContextActionService")
local function handleAction(actionName, inputState, inputObject)
if inputState == Enum.UserInputState.Begin then
print(actionName, inputObject)
end
end
-- Lega l'azione alla funzione
ContextActionService:BindAction("Interact", handleAction, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)
Una volta aggiunto un pulsante personalizzato, puoi utilizzare una delle diverse funzioni da ContextActionService per personalizzare i pulsanti sullo schermo creati da BindAction() .
- Per cambiare l'etichetta del testo per un pulsante mobile, chiama SetTitle() con la stringa actionName e una Stringadi titolo.
- Per utilizzare un'immagine personalizzata come altri pulsanti GUI, chiama il metodo SetImage(), sostituendo l'ID risorsa di esempio qui sotto con un'immagine a tua scelta.
- Per impostare la posizione di un pulsante, chiama SetPosition() con un valore di posizione UDim2.
-- Imposta il pulsante di etichetta a "Parlare"ContextActionService:SetTitle("Interact", "Talk")-- Imposta l'immagine del pulsanteContextActionService:SetImage("Interact", "rbxassetid://104919049969988")-- Imposta la posizione del pulsanteContextActionService:SetPosition("Interact", UDim2.new(1, -70, 0, 10))
Input dipendenti dal contesto
Quando si sviluppa per dispositivi mobili, è spesso necessario cambiare ciò che un singolo pulsante fa in base al contesto.Poiché lo spazio sullo schermo su dispositivi mobili è limitato, usa i pulsanti contestuali che eseguono diverse azioni in base a ciò che il personaggio è in grado di fare.
Ad esempio, puoi visualizzare un pulsante "Raccogli" attivo quando l'utente è vicino a uno scrigno d'oro, legato alla funzione 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))
Ad un altro punto durante il Partita, puoi cambiare il pulsante su "Parla" quando l'utente è vicino a un NPC.Invece di rimuovere il pulsante esistente per posizionarne un altro, puoi semplicemente chiamare BindAction() sull'azione esistente "Interact", cambiando la funzione target e il titolo del pulsante:
ContextActionService:BindAction("Interact", talkToNPC, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)ContextActionService:SetTitle("Interact", "Talk")
Rileva altri dispositivi
Nelle esperienze cross-piattaforma, è importante fare riferimento alle opzioni di input preferite dell'utente mostrando le opzioni di input per il Dispositivoattivamente utilizzato.Ad esempio, un dispositivo mobile può avere un mouse e una tastiera o un gamepad connessi, oppure è possibile che un desktop abbia un touchscreen abilitato.Se vengono abilitati più fonti di input, puoi usare GetLastInputType() per ottenere l'ultimo Dispositivodi input utilizzato dall'utente.
Come fondazione, puoi utilizzare il seguente ModuleScript, posizionato all'interno di ReplicatedStorage e rinominato in UserInputModule , per recuperare il inserisci / scrividi input dell'utente, dopo il quale puoi adattare l'interfaccia utente o il contesto alle esigenze specifiche della tua esperienza.
local UserInputService = game:GetService("UserInputService")
local UserInput = {}
local inputTypeString
-- Se il dispositivo ha una tastiera e un Topo, or mouse as computer mouseattivi, supponi quegli input
if UserInputService.KeyboardEnabled and UserInputService.MouseEnabled then
inputTypeString = "Keyboard/Mouse"
-- Altrimenti, se il dispositivo ha la capacità di tocco ma non ha tastiera e Topo, or mouse as computer mouse, supponi l'input touch
elseif UserInputService.TouchEnabled then
inputTypeString = "Touch"
-- Altrimenti, se il dispositivo ha un gamepad attivo, supponi l'input 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 volta che lo script UserInputModule è in Posto, usa il seguente esempio di codice in un per ottenere l'ultimo inserisci / scrividi input dell'utente:
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Richiedi modulolocal UserInputModule = require(ReplicatedStorage:WaitForChild("UserInputModule"))local currentUserInput, inputEnum = UserInputModule.getInputType()print(currentUserInput, inputEnum)