Roblox phân bổ cho mỗi người dùng một ID người dùng theo miền duy nhất cho mỗi trò chơi hoặc ứng dụng mà họ tương tác. Trang này giải thích cách nhận diện người dùng theo miền hoạt động và cách sử dụng loại User trong mã trò chơi của bạn.
Các khái niệm sau là trung tâm trong việc xác định người dùng:
| Khái niệm | Mô tả |
|---|---|
| Người dùng | Một tài khoản kéo dài trên Roblox. |
| Người chơi | Đại diện của một người dùng trong mô hình dữ liệu của trò chơi đang chạy (xem Người chơi). |
| Loại dữ liệu User | Một loại dữ liệu đại diện cho danh tính của người dùng trong một miền cụ thể. Đây là định danh chuẩn để tham chiếu đến người dùng trong mã trò chơi. |
| ID người dùng theo miền | Một định danh số xác định duy nhất một người dùng trong một miền cụ thể. Định danh này là khác nhau trong mỗi trò chơi và ứng dụng. |
ID người dùng theo miền
Một ID người dùng theo miền là một định danh duy nhất được cấp cho một người dùng trong một trò chơi hoặc ứng dụng cụ thể. Khác với ID người dùng toàn cầu, ID người dùng theo miền chỉ có ý nghĩa trong miền đã phát hành nó, vì vậy cùng một người dùng có một ID người dùng theo miền khác nhau trong mỗi trò chơi hoặc ứng dụng mà họ tương tác. Những người chơi đã tham gia trò chơi của bạn trước khi triển khai ID theo miền sẽ giữ ID người dùng toàn cầu ban đầu của họ trong trò chơi đó (xem Người chơi quay lại).
Các loại miền được đại diện bởi Enum.DomainType:
| Loại miền | Gắn liền với | Ví dụ |
|---|---|---|
| Enum.DomainType.EXPERIENCE | Một trò chơi cụ thể (vũ trụ) | ID của một người chơi trong trò chơi của bạn |
| Enum.DomainType.OAUTH | Một ứng dụng OAuth cụ thể | ID của một người dùng trong công cụ bên ngoài của bạn |
Cách hoạt động của các ID theo miền
Khi một người chơi tham gia trò chơi của bạn, họ sẽ nhận được một ID người dùng theo miền duy nhất cho trò chơi đó. Cùng một người chơi tham gia vào một trò chơi khác sẽ nhận được một ID người dùng theo miền khác. Điều này có nghĩa là:
- ID người dùng theo miền là các số nguyên, tương tự như ID người dùng toàn cầu hiện có.
- Một ID người dùng theo miền không xung đột với bất kỳ ID người dùng toàn cầu nào hiện có.
- Cùng một giá trị số có thể xuất hiện trong các miền khác nhau cho các người dùng khác nhau. Khóa duy nhất là sự kết hợp của loại miền, ID miền và ID người dùng theo miền.
Kịch bản ví dụ
Ví dụ sau đây minh họa cách các trò chơi khác nhau tham chiếu đến cùng một người dùng:
| Kịch bản | Bối cảnh người dùng | ID người dùng thấy bởi trò chơi |
|---|---|---|
| Người dùng kết nối với Trò chơi A | Người chơi quay lại (đã tham gia trước khi có ID theo miền) | 123 (ID toàn cầu, không thay đổi) |
| Người dùng kết nối với Trò chơi B | Tham gia lần đầu tiên sau khi triển khai ID theo miền | 500789 (ID người dùng theo miền cho Trò chơi B) |
| Người dùng kết nối với Trò chơi C | Tham gia lần đầu tiên sau khi triển khai ID theo miền | 302441 (ID người dùng theo miền cho Trò chơi C) |
Người chơi quay lại
Nếu một người chơi đã tham gia trò chơi của bạn trước khi triển khai ID người dùng theo miền, họ sẽ giữ ID người dùng toàn cầu ban đầu của họ trong trò chơi đó. Điều này đảm bảo rằng các khóa dữ liệu hiện có, bảng xếp hạng và kho vật phẩm tiếp tục hoạt động mà không có bất kỳ thay đổi nào.
Làm việc với loại Người dùng
User là cách chuẩn để xác định người dùng trong mã trò chơi. Một giá trị User mang theo ID người dùng theo miền cùng với loại miền và ID miền, vì vậy ngữ cảnh danh tính luôn đi kèm với định danh. Để biết chi tiết đầy đủ về API, hãy xem tham chiếu User.
Lấy một Người dùng từ một Người chơi
Cách chính để có được một User là từ một Player kết nối qua Player.User:
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
local user = player.User
print("ID người dùng miền:", user.Id)
print("Loại miền:", user.DomainType)
print("ID miền:", user.DomainId)
end)
Xây dựng một Người dùng từ một ID
Để tạo một User từ một ID người dùng đã biết trong trò chơi hiện tại, hãy sử dụng User.fromId():
local user = User.fromId(knownUserId)
Sử dụng Người dùng với API của engine
API của engine chấp nhận tham số ID người dùng cũng chấp nhận các giá trị User trực tiếp. Việc sử dụng User được khuyến nghị:
-- Cả hai hình thức đều hoạt động:BadgeService:AwardBadge(player.User, badgeId) -- Khuyến nghịBadgeService:AwardBadge(player.UserId, badgeId)
-- Cả hai hình thức đều hoạt động:local target = Players:GetPlayerByUserId(player.User) -- Khuyến nghịlocal target = Players:GetPlayerByUserId(someUserId)
Khi một ID người dùng số được truyền vào API của engine chấp nhận ID người dùng, nó sẽ tự động được bọc trong một User ở mức nội bộ.
API của engine trả về ID người dùng
API của engine trả về ID người dùng số tiếp tục sử dụng các tên trường và loại giống nhau. Mỗi ID được trả về là ID toàn cầu hoặc ID người dùng theo miền phụ thuộc vào việc người dùng tham gia trò chơi trước hay sau khi triển khai ID theo miền:
- Người chơi quay lại (tham gia lần đầu trước khi ra mắt ID theo miền) — API trả về ID người dùng toàn cầu của người dùng.
- Người chơi mới (tham gia lần đầu sau khi ra mắt ID theo miền) — API trả về ID người dùng theo miền của người dùng.
Cả ID người dùng toàn cầu và ID người dùng theo miền đều là các số nguyên chuẩn không xung đột, vì vậy mã hiện tại đọc các trường số này vẫn tiếp tục hoạt động.
Lưu danh tính người dùng
Đối với các khóa dữ liệu trong một trò chơi duy nhất, hãy sử dụng user.Id trực tiếp:
local key = ("player_%d"):format(player.User.Id)PlayerDataStore:SetAsync(key, data)
Đối với các giá trị có thể được đọc bởi các hệ thống khác hoặc cần ngữ cảnh toàn miền đầy đủ, hãy tuần tự hóa User với ToString():
local encoded = player.User:ToString()SomeDataStore:SetAsync("support_ticket_user", encoded)-- Sau đó, khôi phục từ chuỗilocal user = User.fromString(encoded)
Để biết thêm chi tiết về các đảm bảo tuần tự hóa, hãy xem tham chiếu User.
Thực tiễn tốt nhất
- Sử dụng Player.User làm định danh chuẩn trong mã mới.
- Không sử dụng ID người dùng số từ một miền để xác định một người dùng trong miền khác.