Roblox udostępnia jeden skuteczny identyfikator użytkownika dla każdego użytkownika w każdej grze, grupie lub aplikacji. W zależności od historii użytkownika w danej domenie, jego skuteczny identyfikator użytkownika to albo jego globalny identyfikator użytkownika, albo identyfikator użytkownika w zakresie. Ta strona wyjaśnia, jak działają skuteczne identyfikatory użytkowników i jak używać typu User w kodzie gry.
Następujące pojęcia są kluczowe dla identyfikacji użytkowników:
| Pojęcie | Opis |
|---|---|
| Użytkownik | Trwałe konto na Robloxie. |
| Gracz | Reprezentacja użytkownika w modelu danych działającej gry (zobacz Gracze). |
| Typ danych User | Typ danych, który zawiera skuteczny identyfikator użytkownika oraz kontekst domeny. Jest to standardowy identyfikator do odniesienia się do użytkowników w kodzie gry. |
| Globalny identyfikator użytkownika | Identyfikator użytkownika na poziomie platformy, który Roblox przypisuje do każdego konta. Jest unikalny w całym Robloxie. |
| Identyfikator użytkownika w zakresie | Identyfikator użytkownika przypisany w ramach konkretnej domeny. Identyfikatory użytkowników w zakresie są różne w każdej grze, grupie lub aplikacji. |
| Skuteczny identyfikator użytkownika | Pojedynczy identyfikator użytkownika, który Roblox udostępnia dla użytkownika w ramach domeny. |
| Użytkownik przed wdrożeniem | Użytkownik, który po raz pierwszy zaangażował się w domenę przed wdrożeniem identyfikatora użytkownika w zakresie. W tej domenie jego skuteczny identyfikator użytkownika pozostaje jego globalnym identyfikatorem użytkownika. |
| Użytkownik po wdrożeniu | Użytkownik, który po raz pierwszy zaangażował się w domenę po wdrożeniu identyfikatora użytkownika w zakresie. W tej domenie jego skuteczny identyfikator użytkownika to identyfikator użytkownika w zakresie. |
Skuteczne identyfikatory użytkowników i domeny
Każdy użytkownik ma jeden skuteczny identyfikator użytkownika w konkretnej grze, grupie lub aplikacji. Roblox nie udostępnia oddzielnych globalnych i zakresowych identyfikatorów użytkowników dla tego samego użytkownika w danej domenie:
- Użytkownik przed wdrożeniem ma swój globalny identyfikator użytkownika jako skuteczny identyfikator użytkownika.
- Użytkownik po wdrożeniu ma identyfikator użytkownika w zakresie jako skuteczny identyfikator użytkownika. Ten identyfikator ma znaczenie tylko w tej domenie.
W kodzie gry, Player.UserId oraz Player.User.Id zwracają ten skuteczny identyfikator użytkownika i zawsze mają tę samą wartość numeryczną (Player.User.Id równa się Player.UserId), więc twój kod nie potrzebuje logiki rozgałęziającej, aby wybierać między nimi.
Roblox ogranicza tożsamość użytkownika do trzech typów domen:
| Domena | Ograniczone do | Przykład |
|---|---|---|
| Doświadczenie (Enum.DomainType.EXPERIENCE) | Konkretnym doświadczeniem | ID gracza w twoim doświadczeniu |
| Grupa | Konkretną grupą Roblox (społecznością) | ID członka w twojej grupie |
| Aplikacja OAuth (Enum.DomainType.OAUTH) | Konkretną aplikacją OAuth | ID użytkownika w twoim narzędziu zewnętrznym |
Jak działają skuteczne identyfikatory użytkowników
Gdy gracz dołącza do twojej gry, ma jeden skuteczny identyfikator użytkownika dla tej gry. Skuteczny identyfikator użytkownika użytkownika po wdrożeniu to identyfikator użytkownika w zakresie unikalny dla tej gry. Otrzymuje inny identyfikator użytkownika w zakresie w każdej innej grze, grupie lub aplikacji, w której również jest użytkownikiem po wdrożeniu. Oznacza to:
- Skuteczne identyfikatory użytkowników są liczbami całkowitymi, niezależnie od tego, czy są globalne, czy w zakresie.
- Skuteczne identyfikatory użytkowników są stabilne w sesjach w tej samej domenie.
- Identyfikator użytkownika w zakresie nie koliduje z żadnym istniejącym globalnym identyfikatorem użytkownika.
- Ta sama wartość numeryczna może występować w różnych domenach dla różnych użytkowników. Unikalnym kluczem jest kombinacja domeny (typ domeny i identyfikator domeny) oraz skutecznego identyfikatora użytkownika.
Przykładowy scenariusz
Następujący przykład ilustruje, jak różne gry odnoszą się do tego samego użytkownika:
| Scenariusz | Kontekst użytkownika | Skuteczny identyfikator użytkownika widziany przez grę |
|---|---|---|
| Użytkownik łączy się z Grą A | Użytkownik przed wdrożeniem | 123 (globalny identyfikator użytkownika, niezmieniony) |
| Użytkownik łączy się z Grą B | Użytkownik po wdrożeniu | 500789 (identyfikator użytkownika w zakresie dla Gry B) |
| Użytkownik łączy się z Grą C | Użytkownik po wdrożeniu | 302441 (identyfikator użytkownika w zakresie dla Gry C) |
Użytkownicy przed wdrożeniem
Jeśli gracz jest użytkownikiem przed wdrożeniem w twojej grze, jego skuteczny identyfikator użytkownika pozostaje jego globalnym identyfikatorem użytkownika w tej grze. Zarówno Player.UserId, jak i Player.User.Id zwracają ten globalny identyfikator użytkownika. Roblox nie udostępnia drugiego identyfikatora użytkownika dla gracza w tej grze. Zapewnia to, że istniejące klucze w magazynie danych, tablice liderów i inwentarze działają nadal bez żadnych zmian.
Domena grupy
Każda grupa Roblox jest swoją własną domeną. Użytkownik ma jeden skuteczny identyfikator użytkownika w grupie, oddzielony od swojego skutecznego identyfikatora użytkownika w jakiejkolwiek grze lub aplikacji OAuth:
- Sprawdzanie grupy w grze nie zmienia się — Metody silnika na Player, takie jak Player:IsInGroupAsync(), Player:GetRankInGroupAsync() i Player:GetRoleInGroupAsync(), a także GroupService:PromptJoinAsync(), rozwiązują tożsamość wewnętrznie, nie ujawniając identyfikatora użytkownika.
- Otwarte API grupy w chmurze używają domeny grupy — Dotyczy to punktów końcowych, które listują lub zarządzają członkostwem w grupie i prośbami o dołączenie.
Praca z typem użytkownika
User jest standardowym sposobem identyfikacji użytkowników w kodzie gry. Wartość User zawiera skuteczny identyfikator użytkownika wraz z typem domeny i identyfikatorem domeny, więc kontekst tożsamości zawsze podróżuje z identyfikatorem. Aby uzyskać pełne szczegóły API, zobacz dokumentację User.
Uzyskiwanie użytkownika z gracza
Podstawowym sposobem uzyskania User jest połączenie z Player za pomocą Player.User:
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
local user = player.User
print("Skuteczny identyfikator użytkownika:", user.Id) -- Zawsze odpowiada player.UserId
print("Typ domeny:", user.DomainType)
print("Identyfikator domeny:", user.DomainId)
end)Tworzenie użytkownika z identyfikatora
Aby utworzyć User z znanego skutecznego identyfikatora użytkownika w bieżącej grze, użyj User.fromId():
local user = User.fromId(knownUserId)Używanie użytkownika z API silnika
API silnika, które akceptują parametr identyfikatora użytkownika, akceptują również wartości User bezpośrednio. Zaleca się używanie User:
-- Obie formy działają:
BadgeService:AwardBadge(player.User, badgeId) -- Zalecane
BadgeService:AwardBadge(player.UserId, badgeId)-- Obie formy działają:
local target = Players:GetPlayerByUserId(player.User) -- Zalecane
local target = Players:GetPlayerByUserId(someUserId)Gdy numeryczny identyfikator użytkownika jest przekazywany do API silnika, które akceptuje identyfikatory użytkowników, jest automatycznie opakowywany w User wewnętrznie.
API silnika, które zwracają identyfikatory użytkowników
API silnika, które zwracają numeryczne identyfikatory użytkowników, zwracają skuteczny identyfikator użytkownika:
- Użytkownicy przed wdrożeniem — API zwraca globalny identyfikator użytkownika.
- Użytkownicy po wdrożeniu — API zwraca identyfikator użytkownika w zakresie.
Player.UserId, Player.User.Id i inne API silnika zwracają ten sam skuteczny identyfikator użytkownika dla użytkownika w twojej grze, więc istniejący kod, który odczytuje pola numerycznych identyfikatorów użytkowników, nadal działa bez logiki rozgałęziającej.
Otwarte żądania i odpowiedzi w chmurze używają tego samego skutecznego identyfikatora użytkownika dla docelowej domeny. Nie ujawniają drugiego identyfikatora użytkownika dla tego samego użytkownika w tej domenie.
Przechowywanie tożsamości użytkownika
Używaj numerycznego skutecznego identyfikatora użytkownika tylko do identyfikacji użytkownika w ramach jednej domeny. Klucz magazynu danych w jednej grze może używać user.Id bezpośrednio:
local key = ("player_%d"):format(player.User.Id)
PlayerDataStore:SetAsync(key, data)Gdy inna domena odczytuje przechowywaną tożsamość, na przykład aplikacja OAuth, która moderuje użytkowników, przechowuj ciąg z ToString(). Ciąg koduje kontekst domeny razem ze skutecznym identyfikatorem użytkownika. Użycie samej liczby całkowitej może zastosować działanie do niewłaściwego użytkownika, gdy ta sama liczba identyfikuje innego użytkownika w innej domenie.
local encoded = player.User:ToString()
SomeDataStore:SetAsync("support_ticket_user", encoded)
-- Później, przywróć z ciągu
local user = User.fromString(encoded)Aby uzyskać więcej informacji na temat gwarancji serializacji, zobacz dokumentację User.
Najlepsze praktyki
- Używaj Player.User jako standardowego identyfikatora w nowym kodzie.
- Używaj numerycznego skutecznego identyfikatora użytkownika tylko w ramach jednej domeny, takiej jak klucze magazynu danych dla jednej gry.
- Używaj ToString() oraz fromString(), gdy inna domena odczytuje przechowywaną tożsamość.