Mobile Input

*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.

Oltre la metà di tutte le sessioni Roblox viene giocata su dispositivi mobili, quindi è importante considerare l'accessibilità cross-platform quando progetti un'esperienza per un pubblico ampio. Dovresti mirare a supportare una varietà di dispositivi di input, tra cui mouse e tastiera e gamepad.

Durante la progettazione di un'esperienza mobile, considera la orientazione del dispositivo che intende l'utilizzo dell'utente nella tua esperienza, quindi implementa i tuoi input con ContextActionService per eseguire le seguenti attività di input correlate all'esperienza mobile:

  • Crea pulsanti sullo schermo visibili solo su dispositivi mobili.
  • Personalizza i pulsanti e l'interfaccia utente del mobile per creare un'esperienza mobile unica.
  • Imposta il contesto in cui dipendono gli input che consente lo stesso pulsante o l'input per eseguire un'azione diversa a seconda della situazione.
  • Rileva altri dispositivi di input , come un mouse o una tastiera connessi a un tablet mobile, per fornire le richieste sullo schermo corrette all'utente.

Orientalamento del dispositivo

Su telefoni e tablet, l'orientamento del dispositivo influisce in modo significativo sull'esperienza utente e sull'interazione. Ad esempio, la modalità paesaggio è meglio gestita con due dita mentre la modalità ritratto può essere gestita con una sola dita.

Per impostazione predefinita, le esperienze Roblox vengono eseguite in modalità paesaggio, consentendo alla esperienza di passare da un paesaggio all'altro "a sinistra" e "a destra" mentre il dispositivo dell'utente ruota. Tuttavia, le esperienze possono essere bloccate in un'orientazione specifica se lo desidera.

Modalità di Orientamento

Ci sono cinque diversi modalità di orientamento, tra cui due modalità basate sul sensore e tre modalità bloccate.

Modalità sensore
Sensore di paesaggioL'impostazione predefinita 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.
SensoreIl dispositivo rileva la sua orientamento fisico per assicurare che la vista dell'esperienza sia sempre orientata verso l'alto, passando da un'area all'altra in base alle esigenze.
Modalità Bloccate
Paesaggio a sinistraSu 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 è nella parte inferiore dello schermo.
Paesaggio destroSu 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 è nella parte inferiore dello schermo.
RitrattareSu dispositivi con un pulsante di casa fisico, il pulsante di casa è sotto la schermata. Su dispositivi con una barra virtuale/nav, la sua regione di tocco è nella parte inferiore della schermata.

Proprietà di Orientamento

Quando si imposta un'orientazione, si può impostare il orientamento di partenza, il orientamento in-experience e il orientamento attuale.

Inizializzazione Orientamento

StarterGui.ScreenOrientation imposta l'orientamento predefinito per un Posto. I valori accettabili includono:

Poiché questa proprietà influisce su tutti i nuovi utenti che si uniscono all'esperienza, puoi impostare il suo valore in StarterGuiEnum.ScreenOrientation all'interno di Studio.

Orientamento in-experience

PlayerGui.ScreenOrientation esplicitamente cambia l'orientamento dell'esperienza per un utente. Quando questa proprietà è impostata su uno dei Enum.ScreenOrientation enums in un LocalScript , l'esperienza si allineerà immediatamente per corrispondere alla Configurazione. Ciò può essere utile quando un'esperienza ha bisogno di fornire un

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

Orientalazione attuale

PlayerGui.CurrentScreenOrientation ottiene l'orientamento del dispositivo attuale. I valori possibili includono:

Il seguente codice stampa l'orientamento della schermata dell'utente:


local Players = game:GetService("Players")
local playerGUI = Players.LocalPlayer:WaitForChild("PlayerGui")
print(playerGUI.CurrentScreenOrientation)

Modalità di movimento del personaggio

Roblox offre diversi StarterPlayer proprietà che puoi impostare per cambiare il modo in cui gli utenti su dispositivi mobili possono muoversi attraverso la tua esperienza.

Puoi impostare i schemi di controllo del movimento del cellulare per le esperienze Roblox cambiando i valori di StarterPlayer.DevTouchMovementMode a uno dei Seguendo:

OpzioneDescrizione
ClickToMoveGli utenti possono muoversi attraverso l'esperienza facendo clic su una posizione di destinazione. Questo modo include un pulsante di salto nella regione inferiore destra dello schermo. Salto automatico è sempre attivo in questo modo di movimento.
DPad
DynamicThumbstickUn pollice dinamico appare in cui l'utente inizialmente premere verso il basso. Questo modo include un pulsante di salto nella regione inferiore destra dello schermo. Questa è la impostazione predefinita per gli utenti mobile se UserChoice è Impostare.
ScriptableDisabilita tutti i controlli predefiniti e ti consente di scriptare il tuo protocollo di controllo.
Thumbpad
ThumbstickUn joystick mobile situato nella regione inferiore sinistra dello schermo. A differenza di DynamicThumbstick , la posizione del joystick non è statica e non cambia quando l'utente tocca sullo schermo.
UserChoiceConsente agli utenti di scegliere il loro schema di controllo desiderato dal menu in-experience Impostazioni. Questo è il modo di movimento predefinito per le esperienze.

Salto automatico

Quando StarterPlayer.AutoJumpEnabled è abilitato, il personaggio dell'utente salta automaticamente attraverso gli spazi quando si avvicina all'angolo di una Piattaforma. StarterPlayer.AutoJumpEnabled è abilitato per impostazione predefinita per i dispositivi mobili.

Disabilita StarterPlayer.AutoJumpEnabled per disabilitare questa funzione e costringere gli utenti a saltare utilizzando solo le loro combinazioni di tasti.

Aggiungere pulsanti mobili

Per aggiungere pulsanti mobili, usa il metodo ContextActionService:BindAction() .

Il metodo BindAction() preleva i seguenti parametri:

ParametroTipoDescrizione
azioneNamestringaUna stringa di identificatore per l'azione che stai legando. Puoi usare il nome di azione con altre funzioni in ContextActionService per modificare il binding.
funzioneToBindfunzioneLa funzione da chiamare quando l'input specificato viene attivato. Questa funzione riceve tre argomenti:
  • Una stringa uguale al nome dell'azione.
  • Un Enum.UserInputState che definisce lo stato di input quando chiama la funzione.
  • Il InputObject usato nella chiamata funzione.
creaTouchButtonbooleanoQuando è vero, crea un pulsante sullo schermo quando il gioco è in esecuzione su un Dispositivomobile.
Tipi di inputtuplaGli input che intenzione di associare alla funzione, come i valori dell'elenco da un Enum.KeyCode .

Puoi usare il seguente codice di esempio per creare un'azione Interact che crea un pulsante sullo schermo e accetta anche un 键盘 e 游戏手柄 input:


local ContextActionService = game:GetService("ContextActionService")
local function handleAction(actionName, inputState, inputObject)
if inputState == Enum.UserInputState.Begin then
print(actionName, inputObject)
end
end
-- associare un'azione per funzionare
ContextActionService:BindAction("Interact", handleAction, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)

Rimozione dei pulsanti del mobile

Per rimuovere un pulsante mobile dalla schermata, chiama UnbindAction() utilizzando la stringa actionName che hai passato a BindAction() .

Usa il seguente esempio di codice per disbindare l'azione Interact precedentemente creata:


-- Unbind azione per nome
ContextActionService:UnbindAction("Interact")

Personalizzare l'interfaccia utente del pulsante

Puoi usare una delle varie funzioni da ContextActionService per personalizzare i pulsanti sullo schermo che vengono creati da BindAction() .

Testo del pulsante

Per cambiare l'etichetta del testo per un pulsante mobile, chiama SetTitle() con la stringa actionName e un titolo:


-- Imposta il pulsante della etichetta "Talk"
ContextActionService:SetTitle("Interact", "Talk")

Immagine del pulsante

I pulsanti del cellulare possono utilizzare immagini personalizzate come altri pulsanti GUI utilizzando il metodo SetImage() .

Usa il seguente codice di esempio per impostare un'immagine del pulsante, sostituendo l'ID risorsa con un'immagine a tua scelta:


-- Imposta immagine del pulsante
ContextActionService:SetImage("Interact", "rbxassetid://0123456789")

Posizione del pulsante

Per impostazione predefinita, la posizione di un nuovo pulsante appare vicino alla sezione inferiore destra dello schermo. Dovresti considerare attentamente la posizione della posizione dei pulsanti su dispositivi mobili e tener presente le posizioni delle dita e delle mani.

Usa il seguente codice di esempio per impostare la posizione di un pulsante con il metodo SetPosition() :


-- Imposta la posizione del pulsante
ContextActionService:SetPosition("Interact", UDim2.new(1, -70, 0, 10))

Input dipendenti dal contesto

Durante lo sviluppo per dispositivi mobili, potresti voler cambiare a volte ciò che un singolo pulsante fa in base al contesto. Poiché lo spazio sullo schermo sui dispositivi mobili è limitato, usa i pulsanti contestuali che eseguono azioni diverse in base a ciò che il personaggio è in grado di fare.

Ad esempio, puoi visualizzare un pulsante "Raccogli" attivo quando l'utente si trova vicino a un forziere d'oro:

Usa il seguente esempio di codice per creare un pulsante mobile che è etichettato "Raccogli" e è 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:SetPosition("Interact", UDim2.new(1, -70, 0, 10))
-- Imposta l'immagine sul pulsante blu "Colleziona"
ContextActionService:SetImage("Interact", "rbxassetid://0123456789")

In un altro punto nel Gioco, puoi cambiare il pulsante per "Talk" quando l'utente è vicino a un NPC. Invece di aggiungere e rimuovere il pulsante esistente, puoi semplicemente utilizzare ContextActionService:BindAction() sull'azione Interact esistente, cambiando la funzione e l'immagine del pulsante.

Usa il seguente esempio di codice per impostare l'etichetta del pulsante esistente su "Talk" e legarlo a una funzione chiamata talkToNPC() :


ContextActionService:BindAction("Interact", talkToNPC, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)
-- Imposta l'immagine su giallo "Talk" button
ContextActionService:SetImage("Interact", "rbxassetid://0011223344")

Rilevamento di altri dispositivi

Nelle esperienze cross-platform è necessario conoscere il dispositivo attuale dell'utente per regolare i prompt di tastiera corretti.

Ad esempio, se un utente si avvicina a uno scrigno del tesoro e c'è un'azione legata alla raccolta dell'oro, puoi mostrare agli utenti mobili un pulsante "Colleziona" sullo schermo e agli utenti desktop un'Icona"T" sullo schermo.

Tieni presente che un dispositivo mobile può anche avere un mouse e tastiera o gamepad plugged in. È anche possibile che un desktop abbia un touchscreen abilitato. È importante fare riferimento alle opzioni di input preferite dall'utente visualizzando le opzioni di input per il Dispositivoattualmente in uso.

PC
Mobile

In questi casi, puoi usare UserInputService per rilevare quali dispositivi di input sono abilitati. Se più dispositivi di input sono abilitati, usa UserInputService:GetLastInputType() per ottenere l'ultimo dispositivo di input utilizzato dall'utente per visualizzare sull'interfaccia utente.

Puoi usare il seguente ModuleScript, posizionato all'interno di ReplicatedStorage e rinominato in UserInputModule, per ottenere il inserisci / scrividi input dell'utente, dopo cui puoi adattare il layout o il contesto dell'interfaccia utente alle esigenze specifiche della tua esperienza.

Usa il seguente ModuleScript per controllare l'abilitazione dei dispositivi di input e l'ultimo Dispositivodi input utilizzato:


local UserInputService = game:GetService("UserInputService")
local UserInput = {}
local inputTypeString
-- Se l' dispositivo ha una tastiera e un Topo, or mouse as computer mouseattivo, supponi questi input
if UserInputService.KeyboardEnabled and UserInputService.MouseEnabled then
inputTypeString = "Keyboard/Mouse"
-- Altrimenti, se il dispositivo ha la capacità di toccare ma non ha tastiera e Topo, or mouse as computer mouse, assumi l'input del tocco
elseif UserInputService.TouchEnabled then
inputTypeString = "Touch"
-- Altrimenti, se il dispositivo ha un gamepad attivo, assumi 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 LocalScript per ottenere l'ultimo inserisci / scrividi input dell'utente:


local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Richiesto modulo
local UserInputModule = require(ReplicatedStorage:WaitForChild("UserInputModule"))
local currentUserInput, inputEnum = UserInputModule.getInputType()
print(currentUserInput, inputEnum)