Über die Hälfte aller Roblox-Sitzungen wird auf mobilen Geräten abgespielt, daher ist es wichtig, die Cross-Plattform-Zugänglichkeit bei der Entwicklung eines Erlebnisses für ein breites Publikum zu berücksichtigen.Du solltest versuchen, eine Vielzahl von Eingabegeräten zu unterstützen, einschließlich Maus- und Tastatureingaben und Gamepad.
Wenn Sie ein mobiles Erlebnis entwerfen, berücksichtigen Sie die Geräteorientierung, die der Benutzer in Ihrem Erlebnis verwenden soll, und implementieren Sie Ihre Eingaben mit ContextActionService, um die folgenden mobilbezogenen Eingabetätigkeiten auszuführen:
- Erstell auf-Bildschirm-Buttons sichtbar nur auf mobilen Geräten.
- Konfigurieren von abhängigen Eingängen, die es ermöglichen, dass derselbe Button oder Eingang eine andere Aktion ausführt, abhängig von der Situation.
- Erkennen Sie andere Eingabegeräte, wie eine Maus oder eine Tastatur, die mit einem mobilen Tablet verbunden ist, um dem Benutzer die richtigen Eingabeaufforderungen auf dem Bildschirm zu liefern.
Geräteorientierung
Auf Telefonen und Tablets wirkt sich die Geräteorientierung vor allem auf die Benutzererfahrung und die Interaktion aus.Zum Beispiel wird der Landschaftsmodus am besten mit zwei Daumen betrieben, während der Porträtmodus sich auf eine einfingerbediente Oberfläche einlassen kann.
Standardmäßig laufen Roblox-Erlebnisse im Landschaftsmodus, wodurch das Erlebnis zwischen Landschaft "links" und Landschaft "rechts" wechseln kann, wenn sich das Gerät des Benutzers dreht.Erfahrungen können jedoch auf eine bestimmte Orientierung gesperrt werden, wenn gewünscht.
Orientierungsmodi
Es gibt fünf verschiedene Orientierungsmodi, darunter zwei sensorbasierte Modi und drei gesperrte Modi.
Sensorsysteme | |
---|---|
Landschaftssensor | Die Standard-Roblox-Einstellung, in der die Erfahrung immer im Landschaftsmodus angezeigt wird (kein Portraitmodus) und das Gerät seine physische Orientierung erkennt, um sicherzustellen, dass die Erfahrungsansicht immer nach oben ausgerichtet ist. |
SSensor | Das Gerät erkennt seine physische Orientierung, um sicherzustellen, dass die Erlebnissicht immer nach oben ausgerichtet ist, und wechselt bei Bedarf zwischen Landschafts- und Porträtmodus. |
Gesperrte Modi | |
---|---|
Landschaft übrig | Auf Geräten mit einer physischen Heimat-Taste ist die Heimat-Taste links vom Display.Auf Geräten mit einer virtuellen Heimat-/Navigationsleiste ist ihre Touchregion am unteren Rand des Displays. |
Landschaft rechts | Auf Geräten mit einer physischen Heimat-Taste ist die Heimat-Taste rechts vom Display.Auf Geräten mit einer virtuellen Heimat-/Navigationsleiste ist ihre Touchregion am unteren Rand des Displays. |
Porträt | Auf Geräten mit einer physischen Heimat-Taste befindet sich die Heimat-Taste unter dem Display.Auf Geräten mit einer virtuellen Heimat-/Navigationsleiste ist ihre Touchregion am unteren Rand des Displays. |
Orientierungs属enschaften
Wenn du eine Orientierung festlegst, kannst du die Startorientierung, die In-Erlebnis-Orientierung und die aktuelle Orientierung festlegen.
Start-Orientierung
StarterGui.ScreenOrientation legt die Standardorientierung für einen Ort fest. Akzeptable Werte umfassen:
Da diese Eigenschaft alle neuen Benutzer betrifft, die sich der Erlebnisanschließen, kannst du ihren Wert in StarterGui → Enum.ScreenOrientation innerhalb von Studio festlegen.
Orientierung in der Erfahrung
PlayerGui.ScreenOrientation ändert explizit die Orientierung des Erlebnisses für einen Benutzer.Wenn diese Eigenschaft auf eine der Enum.ScreenOrientation Enums in einem LocalScript festgelegt ist, wird sich die Erfahrung sofort auf die Einstellung ausrichten.Dies kann nützlich sein, wenn ein Erlebnis eine bestimmte Erfahrung bieten muss, wie das Festlegen der Ansicht auf Portrait für ein Minispiel.
Das folgende Codebeispiel in einem LocalScript setzt die Bildschirmorientierung auf Hochformat:
local Players = game:GetService("Players")local playerGUI = Players.LocalPlayer:WaitForChild("PlayerGui")task.wait(2)playerGUI.ScreenOrientation = Enum.ScreenOrientation.Portrait
Aktuelle Orientierung
PlayerGui.CurrentScreenOrientation erhält die aktuelle Geräteorientierung. Mögliche Werte umfassen:
Der folgende Code druckt die aktuelle Bildschirmorientierung des Benutzers aus:
local Players = game:GetService("Players")local playerGUI = Players.LocalPlayer:WaitForChild("PlayerGui")print(playerGUI.CurrentScreenOrientation)
Zeichenbewegungsmodi
Roblox bietet mehrere StarterPlayer, die Sie festlegen können, um zu ändern, wie Benutzer auf mobilen Geräten durch Ihre Erlebnisnavigieren können.
Du kannst mobile Bewegungssteuerungsschemata für Roblox-Erlebnisse festlegen, indem du die Werte von StarterPlayer.DevTouchMovementMode auf eine der gefolgte Profileänderst:
Auswahl | Beschreibung |
---|---|
ClickToMove | Benutzer können sich nur durch das Erlebnis bewegen, indem sie auf einen Zielstandort tippen.Dieser Modus enthält einen SprungButton in der unteren rechten Region des Bildschirms.Automatisches Springen ist immer aktiv in diesem Bewegungsmodus. |
DPad | |
DynamicThumbstick | Ein dynamischer Daumenstick erscheint, wo der Benutzer zunächst nach unten drückt.Dieser Modus enthält einen SprungButton in der unteren rechten Region des Bildschirms.Dies ist die Standardbenutzeinstellung für mobile Benutzer, wenn UserChoice festlegenist. |
Scriptable | Deaktiviert alle Standardsteuerelemente und ermöglicht es Ihnen, Ihr eigenes Steuerschema zu skripten. |
Thumbpad | |
Thumbstick | Ein mobiler Daumenstick, der sich in der unteren linken Region des Bildschirms befindet.Im Gegensatz zu DynamicThumbstick ist die Stellung des Thumbsticks statisch und ändert sich nicht, wenn der Benutzer auf den Bildschirm berührt. |
UserChoice | Ermöglicht es Benutzern, ihr gewünschtes Steuerschema aus dem Erlebniseinstellungsmenü auszuwählen. Dies ist der Standard-Bewegungsmodus für Erlebnisse. |
Automatisches Springen
Wenn StarterPlayer.AutoJumpEnabled aktiviert ist, springt der Charakter des Benutzers automatisch über Lücken, wenn er sich der Kante einer Plattform nähert.StarterPlayer.AutoJumpEnabled ist standardmäßig für mobile Geräte aktiviert.
Deaktiviere StarterPlayer.AutoJumpEnabled, um diese Funktion zu deaktivieren und Benutzer nur mit ihren Tastenbelegungen zu springen zu zwingen.
Benutzerdefinierte mobile Schaltflächen
Um benutzerdefinierte mobile Schaltflächen hinzuzufügen, verwende die Methode ContextActionService:BindAction(), die die folgenden Parameter verwendet:
Parameter | Typ | Beschreibung |
---|---|---|
actionName | string | Eine Identifizierungszeichenfolge für die Aktion, die du bindest. Du kannst die actionName mit anderen Funktionen in ContextActionService bearbeiten, um die Bindung zu bearbeiten. |
functionToBind | funktion | Die Funktion, die aufgerufen wird, wenn die angegebene Eingabe ausgelöst wird. Diese Funktion erhält drei Argumente:
|
createTouchButton | boolesisch | Wenn es wahr ist, erstellt es eine Schaltfläche auf dem Bildschirm, wenn das Spiel auf einem mobilen Gerät ausgeführt wird. |
inputTypes | tupel | Die Eingänge, die du mit der Funktion verbinden möchtest, wie zum Beispiel enum-Werte aus einem Enum.KeyCode. |
Du kannst das folgende Codebeispiel verwenden, um eine Interaktionsaktion zu erstellen, die eine Schaltfläche auf dem Bildschirm erstellt und auch eine Eingabe von Tastatur und Gamepad akzeptiert:
local ContextActionService = game:GetService("ContextActionService")
local function handleAction(actionName, inputState, inputObject)
if inputState == Enum.UserInputState.Begin then
print(actionName, inputObject)
end
end
-- Aktion an Funktion binden
ContextActionService:BindAction("Interact", handleAction, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)
Sobald ein benutzerdefinierter Button hinzugefügt wurde, kannst du eine der zahlreichen Funktionen von ContextActionService verwenden, um die auf dem Bildschirm erstellten Schaltflächen anzupassen, die von BindAction() erstellt wurden.
- Um das Textfeld für einen mobilen Button zu ändern, rufen Sie SetTitle() mit dem actionName String und einem Titelstring auf.
- Um ein benutzerdefiniertes Bild wie andere GUI-Schaltflächen zu verwenden, rufen Sie die SetImage()-Methode auf und ersetzen Sie die Beispiel-Asset-ID unten durch ein Bild Ihrer Wahl.
- Um die Position eines Buttons festzulegen, rufe SetPosition() mit einem UDim2 Positionenwert auf.
-- Setze die Knopflegende auf "Sprechen"ContextActionService:SetTitle("Interact", "Talk")-- Tastebild festlegenContextActionService:SetImage("Interact", "rbxassetid://104919049969988")-- Tasteposition festlegenContextActionService:SetPosition("Interact", UDim2.new(1, -70, 0, 10))
Kontextabhängige Eingänge
Wenn du für mobile Geräte entwickelst, möchtest du oft ändern, was ein einzelner Knopf basierend auf dem Kontext tut.Da der Bildschirmplatz auf mobilen Geräten begrenzt ist, verwende kontextuelle Schaltflächen, die verschiedene Aktionen ausführen, basierend darauf, was der Charakter tun kann.
Zum Beispiel können Sie einen aktiven "Sammeln"-Button anzeigen, wenn der Benutzer in der Nähe einer Truhe mit Gold steht, die mit der Funktion 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))
An einem anderen Punkt während des Gameplaykannst du die Taste auf "Sprechen" ändern, wenn der Benutzer in der Nähe eines NPCs steht.Anstatt den bestehenden Button zu entfernen, um einen anderen zu platzieren, kannst du einfach BindAction() auf die bestehende "Interact" Actionaufrufen, die Zielfunktion und Knopfüberschrift ändern:
ContextActionService:BindAction("Interact", talkToNPC, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)ContextActionService:SetTitle("Interact", "Talk")
Erkennen anderer Geräte
In Cross-Plattform-Erlebnissen ist es wichtig, die bevorzugten Eingabemöglichkeiten des Benutzers zu referenzieren, indem Eingabeoptionen für das aktiv verwendete Gerät angezeigt werden.Zum Beispiel kann ein mobiles Gerät eine Maus und Tastatur oder Gamepad verbunden haben oder es ist möglich, dass ein Desktop einen Touchscreen aktiviert hat.Wenn mehrere Eingangsquellen aktiviert sind, kannst du GetLastInputType() verwenden, um das letzte verwendete Eingabegerät des Benutzers zu erhalten.
Als Foundation kannst du die folgenden ModuleScript verwenden, die innerhalb von ReplicatedStorage platziert und in UserInputModule umbenannt wurden, um den eingebendes Benutzers abzurufen, nachdem du die UI-Anordnung oder den Kontext auf die spezifischen Bedürfnisse deiner Erlebnisanpassen kannst.
local UserInputService = game:GetService("UserInputService")
local UserInput = {}
local inputTypeString
-- Wenn das Gerät eine aktive Tastatur und Maus hat, nehme diese Eingaben an
if UserInputService.KeyboardEnabled and UserInputService.MouseEnabled then
inputTypeString = "Keyboard/Mouse"
-- Andernfalls, wenn das Gerät über eine Touch-Fähigkeit verfügt, aber keine Tastatur und Maus, nehme den Touch-Eingang an
elseif UserInputService.TouchEnabled then
inputTypeString = "Touch"
-- Andernfalls, wenn das Gerät ein aktives Gamepad hat, nehme die Gamepad-Eingabe an
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
Sobald das UserInputModule -Skript vorhanden ist, verwende das folgende Codebeispiel in einem LocalScript , um den letzten eingebendes Benutzers zu erhalten:
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Modul erfordernlocal UserInputModule = require(ReplicatedStorage:WaitForChild("UserInputModule"))local currentUserInput, inputEnum = UserInputModule.getInputType()print(currentUserInput, inputEnum)