Roblox stellt für jeden Benutzer in jedem Spiel, jeder Gruppe oder App eine effektive Benutzer-ID bereit. Abhängig von der Historie des Benutzers mit dieser Domain ist ihre effektive Benutzer-ID entweder ihre globale Benutzer-ID oder eine spezifische Benutzer-ID. Diese Seite erklärt, wie effektive Benutzer-IDs funktionieren und wie Sie den User-Typ in Ihrem Spielcode verwenden.
Die folgenden Konzepte sind zentral für die Benutzeridentifikation:
| Konzept | Beschreibung |
|---|---|
| Benutzer | Ein persistentes Konto auf Roblox. |
| Spieler | Die Darstellung eines Benutzers innerhalb des Datenmodells eines laufenden Spiels (siehe Spieler). |
| User Datentyp | Ein Datentyp, der die effektive Benutzer-ID eines Benutzers und den Kontext der Domain trägt. Dies ist der Standardbezeichner für die Referenzierung von Benutzern im Spielcode. |
| Globale Benutzer-ID | Die plattformweite Benutzer-ID, die Roblox jedem Konto zuweist. Sie ist global einzigartig auf Roblox. |
| Spezifische Benutzer-ID | Eine Benutzer-ID, die innerhalb einer bestimmten Domain zugewiesen wird. Die spezifischen Benutzer-IDs eines Benutzers sind in jedem Spiel, jeder Gruppe oder App unterschiedlich. |
| Effektive Benutzer-ID | Die einzige Benutzer-ID, die Roblox für einen Benutzer innerhalb einer Domain bereitstellt. |
| Vor-Rollout-Benutzer | Ein Benutzer, der zuerst mit einer Domain interagiert hat, bevor die spezifische Benutzer-ID eingeführt wurde. In dieser Domain bleibt ihre effektive Benutzer-ID ihre globale Benutzer-ID. |
| Nach-Rollout-Benutzer | Ein Benutzer, der zuerst mit einer Domain interagiert hat, nachdem die spezifische Benutzer-ID eingeführt wurde. In dieser Domain ist ihre effektive Benutzer-ID eine spezifische Benutzer-ID. |
Effektive Benutzer-IDs und Domains
Jeder Benutzer hat eine effektive Benutzer-ID innerhalb eines bestimmten Spiels, Gruppe oder App. Roblox stellt keine separaten globalen und spezifischen Benutzer-IDs für denselben Benutzer in dieser Domain bereit:
- Ein Vor-Rollout-Benutzer hat seine globale Benutzer-ID als seine effektive Benutzer-ID.
- Ein Nach-Rollout-Benutzer hat eine spezifische Benutzer-ID als seine effektive Benutzer-ID. Diese ID ist nur innerhalb dieser Domain von Bedeutung.
Im Spielcode geben Player.UserId und Player.User.Id beide diese effektive Benutzer-ID zurück und haben immer denselben numerischen Wert (Player.User.Id entspricht Player.UserId), sodass Ihr Code keine Verzweigungslogik benötigt, um zwischen ihnen zu wählen.
Roblox schränkt die Benutzeridentität auf drei Arten von Domains ein:
| Domain | Bezogen auf | Beispiel |
|---|---|---|
| Erfahrung (Enum.DomainType.EXPERIENCE) | Eine spezifische Erfahrung | Die ID eines Spielers in Ihrer Erfahrung |
| Gruppe | Eine spezifische Roblox-Gruppe (Gemeinschaft) | Die ID eines Mitglieds in Ihrer Gruppe |
| OAuth-App (Enum.DomainType.OAUTH) | Eine spezifische OAuth-Anwendung | Die ID eines Benutzers in Ihrem externen Tool |
Wie effektive Benutzer-IDs funktionieren
Wenn ein Spieler Ihrem Spiel beitritt, hat er eine effektive Benutzer-ID für dieses Spiel. Die effektive Benutzer-ID eines Nach-Rollout-Benutzers ist eine spezifische Benutzer-ID, die einzigartig für dieses Spiel ist. Sie erhalten eine andere spezifische Benutzer-ID in jedem anderen Spiel, Gruppe oder App, in der sie ebenfalls ein Nach-Rollout-Benutzer sind. Das bedeutet:
- Effektive Benutzer-IDs sind Ganzzahlen, unabhängig davon, ob sie global oder spezifisch sind.
- Effektive Benutzer-IDs sind über Sitzungen innerhalb derselben Domain stabil.
- Eine spezifische Benutzer-ID kollidiert nicht mit einer bestehenden globalen Benutzer-ID.
- Der gleiche numerische Wert kann in verschiedenen Domains für verschiedene Benutzer erscheinen. Der einzigartige Schlüssel ist die Kombination aus der Domain (Domain-Typ und Domain-ID) und der effektiven Benutzer-ID.
Beispiel-Szenario
Das folgende Beispiel zeigt, wie verschiedene Spiele denselben Benutzer referenzieren:
| Szenario | Benutzerkontext | Effektive Benutzer-ID, die vom Spiel gesehen wird |
|---|---|---|
| Benutzer verbindet sich mit Spiel A | Vor-Rollout-Benutzer | 123 (globale Benutzer-ID, unverändert) |
| Benutzer verbindet sich mit Spiel B | Nach-Rollout-Benutzer | 500789 (spezifische Benutzer-ID für Spiel B) |
| Benutzer verbindet sich mit Spiel C | Nach-Rollout-Benutzer | 302441 (spezifische Benutzer-ID für Spiel C) |
Vor-Rollout-Benutzer
Wenn ein Spieler ein Vor-Rollout-Benutzer in Ihrem Spiel ist, bleibt seine effektive Benutzer-ID seine globale Benutzer-ID in diesem Spiel. Sowohl Player.UserId als auch Player.User.Id geben diese globale Benutzer-ID zurück. Roblox stellt keine zweite Benutzer-ID für den Spieler in diesem Spiel bereit. Dies stellt sicher, dass bestehende Datenspeicher-Schlüssel, Bestenlisten und Inventare weiterhin ohne Änderungen funktionieren.
Gruppen-Domain
Jede Roblox-Gruppe ist ihre eigene Domain. Ein Benutzer hat eine effektive Benutzer-ID innerhalb einer Gruppe, die von seiner effektiven Benutzer-ID in jedem Spiel oder OAuth-Anwendung getrennt ist:
- In-Game-Gruppenprüfungen ändern sich nicht — Engine-Methoden auf Player, wie Player:IsInGroupAsync(), Player:GetRankInGroupAsync() und Player:GetRoleInGroupAsync(), sowie GroupService:PromptJoinAsync(), lösen die Identität intern auf, ohne eine Benutzer-ID offenzulegen.
- Open Cloud Gruppen-APIs verwenden die Domain der Gruppe — Dies gilt für Endpunkte, die Gruppenmitgliedschaften und Beitrittsanfragen auflisten oder verwalten.
Arbeiten mit dem Benutzer-Typ
User ist der Standardweg, um Benutzer im Spielcode zu identifizieren. Ein User-Wert trägt die effektive Benutzer-ID zusammen mit dem Domain-Typ und der Domain-ID, sodass der Identitätskontext immer mit dem Bezeichner übertragen wird. Für vollständige API-Details siehe das User-Referenzdokument.
Einen Benutzer von einem Spieler erhalten
Der primäre Weg, um einen User zu erhalten, ist von einem verbundenen Player über Player.User:
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
local user = player.User
print("Effektive Benutzer-ID:", user.Id) -- Entspricht immer player.UserId
print("Domain-Typ:", user.DomainType)
print("Domain-ID:", user.DomainId)
end)Einen Benutzer aus einer ID erstellen
Um einen User aus einer bekannten effektiven Benutzer-ID innerhalb des aktuellen Spiels zu erstellen, verwenden Sie User.fromId():
local user = User.fromId(knownUserId)Verwendung von Benutzer mit Engine-APIs
Engine-APIs, die einen Benutzer-ID-Parameter akzeptieren, akzeptieren auch direkt User-Werte. Die Verwendung von User wird empfohlen:
-- Beide Formen funktionieren:
BadgeService:AwardBadge(player.User, badgeId) -- Empfohlen
BadgeService:AwardBadge(player.UserId, badgeId)-- Beide Formen funktionieren:
local target = Players:GetPlayerByUserId(player.User) -- Empfohlen
local target = Players:GetPlayerByUserId(someUserId)Wenn eine numerische Benutzer-ID an eine Engine-API übergeben wird, die Benutzer-IDs akzeptiert, wird sie intern automatisch in ein User gewickelt.
Engine-APIs, die Benutzer-IDs zurückgeben
Engine-APIs, die numerische Benutzer-IDs zurückgeben, geben die effektive Benutzer-ID des Benutzers zurück:
- Vor-Rollout-Benutzer — die API gibt die globale Benutzer-ID des Benutzers zurück.
- Nach-Rollout-Benutzer — die API gibt die spezifische Benutzer-ID des Benutzers zurück.
Player.UserId, Player.User.Id und andere Engine-APIs geben alle dieselbe effektive Benutzer-ID für einen Benutzer in Ihrem Spiel zurück, sodass bestehender Code, der numerische Benutzer-ID-Felder liest, weiterhin ohne Verzweigungslogik funktioniert.
Open Cloud-Anfragen und -Antworten verwenden dieselbe effektive Benutzer-ID für die Ziel-Domain. Sie geben keine zweite Benutzer-ID für denselben Benutzer in dieser Domain preis.
Speicherung der Benutzeridentität
Verwenden Sie eine numerische effektive Benutzer-ID nur, um einen Benutzer innerhalb einer einzigen Domain zu identifizieren. Ein Datenspeicher-Schlüssel in einem Spiel kann user.Id direkt verwenden:
local key = ("player_%d"):format(player.User.Id)
PlayerDataStore:SetAsync(key, data)Wenn eine andere Domain die gespeicherte Identität liest, wie eine OAuth-App, die Benutzer moderiert, speichern Sie den String von ToString(). Der String kodiert den Domain-Kontext zusammen mit der effektiven Benutzer-ID. Die Verwendung der Ganzzahl allein kann dazu führen, dass eine Aktion auf den falschen Benutzer angewendet wird, wenn dieselbe Zahl einen anderen Benutzer in einer anderen Domain identifiziert.
local encoded = player.User:ToString()
SomeDataStore:SetAsync("support_ticket_user", encoded)
-- Später aus dem String wiederherstellen
local user = User.fromString(encoded)Für weitere Details zu den Garantien der Serialisierung siehe das User-Referenzdokument.
Best Practices
- Verwenden Sie Player.User als Standardbezeichner in neuem Code.
- Verwenden Sie die numerische effektive Benutzer-ID nur innerhalb einer einzigen Domain, wie Datenspeicher-Schlüssel für ein Spiel.
- Verwenden Sie ToString() und fromString(), wenn eine andere Domain die gespeicherte Identität liest.