Mobiler Eingang

*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.

Ü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:

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
LandschaftssensorDie 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.
SSensorDas 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 übrigAuf 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 rechtsAuf 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ätAuf 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 StarterGuiEnum.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:

AuswahlBeschreibung
ClickToMoveBenutzer 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
DynamicThumbstickEin 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.
ScriptableDeaktiviert alle Standardsteuerelemente und ermöglicht es Ihnen, Ihr eigenes Steuerschema zu skripten.
Thumbpad
ThumbstickEin 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.
UserChoiceErmö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:

ParameterTypBeschreibung
actionNamestringEine Identifizierungszeichenfolge für die Aktion, die du bindest. Du kannst die actionName mit anderen Funktionen in ContextActionService bearbeiten, um die Bindung zu bearbeiten.
functionToBindfunktionDie Funktion, die aufgerufen wird, wenn die angegebene Eingabe ausgelöst wird. Diese Funktion erhält drei Argumente:
  • Eine Zeichenkette, die dem actionName entspricht.
  • Ein Enum.UserInputState, das den Eingabezustand definiert, wenn es die Funktion aufgerufen hat.
  • Die InputObject verwendet, die im Funktionsaufruf verwendet wird.
createTouchButtonboolesischWenn es wahr ist, erstellt es eine Schaltfläche auf dem Bildschirm, wenn das Spiel auf einem mobilen Gerät ausgeführt wird.
inputTypestupelDie 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 festlegen
ContextActionService:SetImage("Interact", "rbxassetid://104919049969988")
-- Tasteposition festlegen
ContextActionService: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 erfordern
local UserInputModule = require(ReplicatedStorage:WaitForChild("UserInputModule"))
local currentUserInput, inputEnum = UserInputModule.getInputType()
print(currentUserInput, inputEnum)