Über die Hälfte aller Roblox-Sitzungen werden auf mobilen Geräten gespielt, so ist es wichtig, die Cross-Platform-Fähigkeit zu berücksichtigen, wenn Sie ein Erlebnis für ein breit angelegtes Publikum planen. Sie sollten auf eine Vielzahl von Eingabegeräten abgestimmt sein, einschließlich Maus- und Tastatur-Eingaben und Gamepad.
Wenn Sie ein mobiles Erlebnis entwerfen, berücksichtigen Sie die Geräteorientierung, die Sie benutzer in Ihrem Erlebnis verwenden sollen, und implementieren Sie Ihre Eingaben mit ContextActionService, um die folgenden mobilen Eingabetätigkeiten auszuführen:
- Erstellen Sie auf dem Bildschirm Schaltflächen sichtbar nur auf mobilen Geräten.
- Anpassen Sie die mobilen Schaltflächen und UI, um ein einzigartiges mobiles Erlebnis zu erstellen.
- Einstellungskontext-abhängige Eingaben, die es ermöglichen, dass dieselbe Schaltfläche oder Eingabe eine andere Aktion ausführen, abhängig von der Situation.
- Erkennen Sie andere Eingangstechnologien, wie eine Maus oder Tastatur, die mit einem mobilen Tablet verbunden ist, um dem Benutzer die richtigen On-Screen-Anzeige-Aufforderungen zu liefern.
Geräteorientierung
Auf Telefonen und Tablets beeinflusst die Geräte-Oriенierung die Benutzererfahrung und die Interaktion. Zum Beispiel ist der Landscape-Modus mit zwei Daumen am besten zu betreiben, während der Portrait-Modus sich für eine Ein-Finger-Oberfläche eignen kann.
Standardmäßig laufen Roblox-Erlebnisse im Landscape-Modus, sodass die Erfahrung zwischen dem linken und dem rechten Landschaftsbereich als das Gerät des Benutzers dreht. Wenn jedoch gewünscht, können Erlebnisse in bestimmten Ausrichtungen gesperrt werden, wenn sie dies erlauben möchten.
Ausrichtungsmodi
Es gibt fünf verschiedene Orientierungsmodi, einschließlich zweier sensorgenbasierter Modi und drei gesperrten Modi.
Sensor-Modi | |
---|---|
Landschaftssensor | Die Standard-Roblox-Einstellung, in der die Erfahrung immer in Landschaftsmodus (kein Porträtmodus) erscheint und das Gerät seine physische Ausrichtung erkennt, um sicherzustellen, dass die Erfahrungsansicht immer nach oben ausgerichtet ist. |
Sensor | Das Gerät erkennt seine physische Ausrichtung, um sicherzustellen, dass die Erlebniskamera immer in Richtung Osten ausgerichtet ist, um zwischen Landschafts- und Porträtmodus zu wechseln, wenn nötig. |
Gesperrte Modi | |
---|---|
Landschaft links | Auf Geräten mit einem physischen Home-Button befindet sich die Home-Taste links vom Bildschirm. Auf Geräten mit einer virtuellen Home/Nav-Bar befindet sich seine Touch-Regions oben im Display. |
Landschaft (rechts) | Auf Geräten mit einem physischen Home-Button befindet sich die Home-Taste auf der rechten Seite des Displays. Auf Geräten mit einer virtuellen Home/Nav-Bar befindet sich ihre Touch-Region am unteren Rand des Displays. |
Porträt | Auf Geräten mit einem physischen Home-Button befindet sich die Home-Schaltfläche unter dem Display. Auf Geräten mit einer virtuellen Home/Nav-Bar befindet sich ihre Touch-Region unter dem Display. |
Orientierungseigenschaften
Wenn Sie eine Ausrichtung einstellen, können Sie die Start-Ausrichtung, die In-Experience-Ausrichtung und die aktuelle Ausrichtung einstellen.
Steuerungsorientierung
StarterGui.ScreenOrientation setzt die Standardorientierung für einen Ort. Akzeptable Werte umfassen:
Da diese Eigenschaft alle neuen Benutzer beeinflusst, die dem Erlebnis beitreten, kannst du seinen Wert in StarterGui → Enum.ScreenOrientation innerhalb von Studio einstellen.
In-Experience-Orientierung
PlayerGui.ScreenOrientation ändert die Orientierung des Erlebnisses für einen Benutzer explizit. Wenn diese Eigenschaft auf einen der Enum.ScreenOrientation-Enums in einem LocalScript eingestellt ist, wird das Erlebnis sofort auf die Einstellung abgestimmt. Dies kann nützlich sein, wenn ein Erlebnis ein bestimmtes Erlebnis wie das
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 Ausrichtung
PlayerGui.CurrentScreenOrientation gibt die aktuelle Geräteorientierung. Mögliche Werte umfassen:
Der folgende Code druckt die aktuelle Bildschirmorientierung des Benutzers:
local Players = game:GetService("Players")local playerGUI = Players.LocalPlayer:WaitForChild("PlayerGui")print(playerGUI.CurrentScreenOrientation)
Charakter-Bewegungsmodi
Roblox bietet mehrere StarterPlayer Eigenschaften, die Sie einstellen können, um zu ändern, wie Benutzer auf mobilen Geräten durch Ihr Erlebnis bewegen können.
Du kannst mobile Bewegungssteuerelemente für Roblox-Erlebnisse konfigurieren, indem du die Werte von StarterPlayer.DevTouchMovementMode auf eines der gefolgte ProfileWerte ändern:
Option | Beschreibung |
---|---|
ClickToMove | Benutzer können nur durch das Erlebnis bewegen, indem sie auf eine Ziel位置 tippen. Dieser Modus enthält einen Sprung-Button in der unteren rechten Region des Bildschirms. Automatisches Springen ist immer in diesem Bewegungsmodus aktiv. |
DPad | |
DynamicThumbstick | Ein dynamischer Thumbstick erscheint, auf dem der Benutzer anfangen zu drücken. Dieser Modus beinhaltet einen Sprung-Button in der unteren rechten Region des Bildschirms. Dies ist die Standard-Benutzer-Einstellung für mobile Benutzer, wenn UserChoice festlegenist. |
Scriptable | Deaktiviert alle Standardsteuerelemente und ermöglicht es Ihnen, Ihr eigenes Steuerschem zu skripten. |
Thumbpad | |
Thumbstick | Ein mobiles Thumbstick befindet sich in der unteren linken Region des Bildschirms. Im Gegensatz zu DynamicThumbstick ist die Thumbstick-Position statisch und ändert sich nicht, wenn der Benutzer auf dem Bildschirm berührt. |
UserChoice | Erlaubt Benutzern, ihr gewünschtes Steuersystem aus dem Einstellungsmenü der Erfahrung auszuwählen. Dies ist der Standard-Bewegungsmodus für Erfahrungen. |
Automatisches Springen
Wenn StarterPlayer.AutoJumpEnabled aktiviert ist, springt der Benutzer automatisch über Lücken, wenn er dem Rande einer Plattform nähert, wenn er auf der mobilen Geräten aktiviert ist. StarterPlayer.AutoJumpEnabled ist standardmäßig für mobile Geräte aktiviert.
Deaktivieren Sie StarterPlayer.AutoJumpEnabled, um diese Funktion zu deaktivieren und Benutzer nur mit ihren Tastenbelegungen zu springen.
Mobile Schaltflächen hinzufügen
Um mobile Schaltflächen hinzuzufügen, verwenden Sie die Methode ContextActionService:BindAction().
Die Methode BindAction() nimmt die folgenden Argumente:
Parameter | Typ | Beschreibung |
---|---|---|
aktionName | string | Eine Identifikatorfolge für die Aktion, die du bindest. Du kannst die AktionName mit anderen Funktionen in ContextActionService verwenden, um die Bindung zu bearbeiten. |
funktionZuBinden | funktion | Die Funktion, die aufgerufen wird, wenn die angegebene Eingabe ausgelöst wird. Diese Funktion erhält drei Argumente:
|
createTouchButton | boolean | Wenn wahr, erstellt eine Schaltfläche auf dem Bildschirm, wenn das Spiel auf einem mobilen Gerät ausgeführt wird. |
EingabeTypen | tupel | Die Eingaben, die Sie an die Funktion binden möchten, wie z. B. Enumerator-werte aus einer Enum.KeyCode . |
Du kannst das folgende Codebeispiel verwenden, um eine Interact-Aktion zu erstellen, die einen On-Screen-Button erstellt und auch einen Tastatur und einen Gamepad-Eingang anerkennt:
local ContextActionService = game:GetService("ContextActionService")
local function handleAction(actionName, inputState, inputObject)
if inputState == Enum.UserInputState.Begin then
print(actionName, inputObject)
end
end
-- Binden Sie die Aktion, um sie zu funktionieren
ContextActionService:BindAction("Interact", handleAction, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)
Entfernen von Mobilgerät-Schaltflächen
Um eine mobile Schaltfläche vom Bildschirm zu entfernen, rufen Sie UnbindAction() mit der AktionName-Strung, die Sie an BindAction() übergeben haben, auf.
Verwenden Sie das folgende Codebeispiel, um die zuvor erstellte Actionzu entsperren:
-- Action mit Namen abbindenContextActionService:UnbindAction("Interact")
Benutzeroberfläche anpassen
Sie können eine der mehreren Funktionen von ContextActionService verwenden, um die auf dem Bildschirm angezeigten Schaltflächen anzupassen, die von BindAction() erstellt werden.
Button-Text
Um das Text-Etikett für einen mobilen Button zu ändern, rufen Sie SetTitle() mit der AktionName-Strung und einem Titel auf:
-- Knopf-Etikett "Sprechen" anlegenContextActionService:SetTitle("Interact", "Talk")
Button-Bild
Mobiles Schaltflächen können benutzerdefinierte Bilder verwenden, wie andere GUI-Schaltflächen mit der Methode SetImage().
Verwenden Sie den folgenden Beispielcode, um ein Button-Bild zu erstellen, das die Asset-ID durch ein Bild Ihrer Wahl ersetzt:
-- Knopf-Bild einstellenContextActionService:SetImage("Interact", "rbxassetid://0123456789")
Button-Position
Standardmäßig erscheint die Position eines neuen Buttons in der Nähe der unteren rechten Sektion des Bildschirms. Sie sollten die Platzierung von Buttons auf mobilen Geräten sorgfältig betrachten und den Positionen der Daumen und Hände berücksichtigen.
Verwenden Sie den folgenden Beispielcode, um die Position eines Buttons mit der SetPosition() Methode zu setzen:
-- KnopfPosition setzenContextActionService:SetPosition("Interact", UDim2.new(1, -70, 0, 10))
Kontextabhängige Eingaben
Wenn Sie für mobile Geräte entwickeln, möchten Sie möglicherweise oft die Änderungen, die ein einzelner Button basierend auf dem Kontext ausführt. Da der Bildschirmplatz auf mobilen Geräten begrenzt ist, verwenden Sie Kontext-Schaltflächen, die verschiedliche Aktionen ausführen, basierend auf dem, was der Charakter zu tun in der Lage ist.
Zum Beispiel können Sie ein aktives "Sammeln"-Fenster anzeigen, wenn der Benutzer in der Nähe einer Goldtasse steht:
Verwenden Sie das folgende Codebeispiel, um einen mobilen Button zu erstellen, der mit der Funktion collectTreasure() verbunden ist:
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))
-- Bild auf blauen "Sammeln"-Button einstellen
ContextActionService:SetImage("Interact", "rbxassetid://0123456789")
An einem anderen Punkt im Spiel können Sie die Schaltfläche "Talk" ändern, wenn der Benutzer in der Nähe eines NPCs steht. Statt die bestehende Schaltfläche hinzuzufügen und zu entfernen, können Sie einfach ContextActionService:BindAction() auf der bestehenden Interact-Aktion verwenden, die Funktion und das Bild der Schaltfläche ändern.
Verwenden Sie das folgende Codebeispiel, um die bestehende Schaltflächen-Etikett auf "Talk" zu setzen und sie an eine Funktion namens talkToNPC zu binden:
ContextActionService:BindAction("Interact", talkToNPC, true, Enum.KeyCode.T, Enum.KeyCode.ButtonR1)-- Bild auf gelb "Talk"-Button setzenContextActionService:SetImage("Interact", "rbxassetid://0011223344")
Andere Geräte erkennen
In cross-platform-Erlebnissen ist es notwendig, das aktuelle Gerät des Benutzers zu kennen, um die Benutzeroberfläche und das Anzeigen richtiger Schlüsselbindungen anzuzeigen.
Zum Beispiel, wenn ein Benutzer eine Schatztruhe ansteuert und dafür eine Aktion definiert ist, die das Sammeln des Goldes erfordert, kannst du den mobilen Benutzern ein "Sammeln"-Button auf dem Bildschirm anzeigen und den Desktop-Benutzern ein "T"-Schlüssel-Symbol auf dem Bildschirm anzeigen.
Beachten Sie, dass ein mobiles Gerät auch eine Maus und Tastatur oder Gamepad Plug-in haben kann. Es ist auch möglich, dass ein Desktop eine touchscreen aktiviert hat. Es ist wichtig, die bevorzugten Eingabeoptionen des Benutzers anzuzeigen, indem Sie die Eingabeoptionen für das aktiviert verwendete Gerät anzeigen.
In diesen Fällen können Sie UserInputService verwenden, um zu erkennen, welche Eingangsgeräte aktiviert sind. Wenn mehrere Eingangsgeräte aktiviert sind, verwenden Sie UserInputService:GetLastInputType() , um das letzte verwendete Eingerät des Benutzers auf der UI anzuzeigen.
Sie können die folgenden ModuleScript , die in ReplicatedStorage platziert und in Benutzer-Eingabemodul umbenannt wurde, verwenden, um die eingebendes Benutzers zu erhalten, nachdem Sie die Benutzeroberfläche oder den Kontext an Ihre Erlebnisanpassen können.
Verwenden Sie das folgende ModuleScript, um nach aktivierten Eingangsteilen und dem letzten verwendeten Gerätzu suchen:
local UserInputService = game:GetService("UserInputService")
local UserInput = {}
local inputTypeString
-- Wenn das Gerät eine aktive Tastatur und eine Maus hat, nehmen Sie diese Eingaben an
if UserInputService.KeyboardEnabled and UserInputService.MouseEnabled then
inputTypeString = "Keyboard/Mouse"
-- Andernfalls, wenn das Gerät eine Touch-Fähigkeit hat, aber keine Tastatur und Maus hat, nehmen Sie die Touch-Eingabe
elseif UserInputService.TouchEnabled then
inputTypeString = "Touch"
-- Andernfalls, wenn das Gerät eine aktive Gamepad hat, nehmen Sie 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 Benutzerinput-Modul Skript in Ortist, verwenden Sie das folgende Codebeispiel in einem LocalScript , um den letzten eingebendes Benutzers zu erhalten:
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Module benötigtlocal UserInputModule = require(ReplicatedStorage:WaitForChild("UserInputModule"))local currentUserInput, inputEnum = UserInputModule.getInputType()print(currentUserInput, inputEnum)