Roblox จะกำหนดให้แต่ละผู้ใช้มี รหัสผู้ใช้ที่มีขอบเขตโดเมน ที่ไม่ซ้ำกันต่อเกมหรือแอปที่พวกเขามีปฏิสัมพันธ์ด้วย หน้านี้จะอธิบายว่าการระบุที่มีขอบเขตโดเมนทำงานอย่างไรและวิธีการใช้ประเภท User ในโค้ดเกมของคุณ
แนวคิดต่อไปนี้เป็นแนวคิดสำคัญในการระบุผู้ใช้:
| แนวคิด | คำอธิบาย |
|---|---|
| ผู้ใช้ | บัญชีที่มีความต่อเนื่องใน Roblox |
| ผู้เล่น | การแสดงผลของผู้ใช้ภายในโมเดลข้อมูลของเกมที่กำลังทำงาน (ดู Players) |
| User ประเภทข้อมูล | ประเภทข้อมูลที่แสดงถึงตัวตนของผู้ใช้ภายในโดเมนเฉพาะ นี่คือรหัสประจำตัวมาตรฐานสำหรับการอ้างอิงถึงผู้ใช้ในโค้ดเกม |
| รหัสผู้ใช้ที่มีขอบเขตโดเมน | รหัสจำนวนที่ระบุตัวผู้ใช้ได้อย่างไม่ซ้ำกันภายใน โดเมน เฉพาะ รหัสนี้จะแตกต่างกันในแต่ละเกมและแอป |
รหัสผู้ใช้ที่มีขอบเขตโดเมน
รหัสผู้ใช้ที่มีขอบเขตโดเมน คือรหัสที่ไม่ซ้ำกันซึ่งถูกกำหนดให้กับผู้ใช้ใน เกม หรือ แอป เฉพาะ ไม่เหมือนกับรหัสผู้ใช้ทั่วโลก รหัสผู้ใช้ที่มีขอบเขตโดเมนจะมีความหมายเฉพาะภายในโดเมนที่ออกให้เท่านั้น ดังนั้นผู้ใช้เดียวกันจึงมีรหัสผู้ใช้ที่มีขอบเขตโดเมนที่แตกต่างกันในแต่ละเกมหรือแอปที่พวกเขามีปฏิสัมพันธ์กับ ผู้เล่นที่เข้าร่วมเกมของคุณก่อนที่จะมีการเปิดตัวรหัสแบบมีขอบเขตจะเก็บรหัสผู้ใช้ทั่วโลกเดิมของพวกเขาไว้ในเกมนั้น (ดู Returning players)
ประเภทโดเมนจะแสดงด้วย Enum.DomainType:
| ประเภทโดเมน | ขอบเขตถึง | ตัวอย่าง |
|---|---|---|
| Enum.DomainType.EXPERIENCE | เกมเฉพาะ (จักรวาล) | รหัสผู้เล่นในเกมของคุณ |
| Enum.DomainType.OAUTH | แอปพลิเคชัน OAuth เฉพาะ | รหัสผู้ใช้ในเครื่องมือภายนอกของคุณ |
วิธีการทำงานของรหัสที่มีขอบเขตโดเมน
เมื่อผู้เล่นเข้าร่วมเกมของคุณ พวกเขาจะได้รับรหัสผู้ใช้ที่มีขอบเขตโดเมนที่ไม่ซ้ำกันสำหรับเกมนั้น ผู้เล่นคนเดียวกันที่เข้าร่วมเกมที่แตกต่างกันจะได้รับรหัสผู้ใช้ที่มีขอบเขตโดเมนที่แตกต่างกัน นี่หมายความว่า:
- รหัสผู้ใช้ที่มีขอบเขตโดเมนเป็นจำนวนเต็ม ซึ่งคล้ายกับรหัสผู้ใช้ทั่วโลกที่มีอยู่
- รหัสผู้ใช้ที่มีขอบเขตโดเมนจะไม่มีการชนกันกับรหัสผู้ใช้ทั่วโลกที่มีอยู่
- ค่าเลขเดียวกันอาจปรากฏในโดเมนที่แตกต่างกันสำหรับผู้ใช้ที่แตกต่างกัน โดยกุญแจที่ไม่ซ้ำกันคือการรวมกันของประเภทโดเมน, รหัสโดเมน, และรหัสผู้ใช้ที่มีขอบเขตโดเมน
ตัวอย่างสถานการณ์
ตัวอย่างต่อไปนี้แสดงให้เห็นว่าเกมต่าง ๆ อ้างอิงถึงผู้ใช้เดียวกันได้อย่างไร:
| สถานการณ์ | บริบทผู้ใช้ | รหัสผู้ใช้ที่เกมเห็น |
|---|---|---|
| ผู้ใช้เชื่อมต่อกับ เกม A | ผู้เล่นที่กลับมา (เคยเข้าชมมาก่อนที่มีรหัสแบบมีขอบเขต) | 123 (รหัสทั่วโลก, ไม่เปลี่ยนแปลง) |
| ผู้ใช้เชื่อมต่อกับ เกม B | เข้าชมครั้งแรกหลังจากการเปิดตัวรหัสแบบมีขอบเขต | 500789 (รหัสผู้ใช้ที่มีขอบเขตโดเมนสำหรับเกม B) |
| ผู้ใช้เชื่อมต่อกับ เกม C | เข้าชมครั้งแรกหลังจากการเปิดตัวรหัสแบบมีขอบเขต | 302441 (รหัสผู้ใช้ที่มีขอบเขตโดเมนสำหรับเกม C) |
ผู้เล่นที่กลับมา
หากผู้เล่นได้เข้าร่วมเกมของคุณก่อนการเปิดตัวรหัสผู้ใช้ที่มีขอบเขต พวกเขาจะเก็บรหัสผู้ใช้ทั่วโลกเดิมไว้ในเกมนั้น นี่ทำให้แน่ใจว่ากุญแจร้านข้อมูลที่มีอยู่, อันดับ, และสินค้าคงคลังมีความสามารถในการทำงานโดยไม่ต้องมีการเปลี่ยนแปลงใด ๆ
การทำงานกับประเภทผู้ใช้
User เป็นวิธีมาตรฐานในการระบุผู้ใช้ในโค้ดเกม ค่า User จะมีรหัสผู้ใช้ที่มีขอบเขตโดเมนควบคู่ไปกับประเภทโดเมนและรหัสโดเมน ดังนั้นบริบทของตัวตนจะเดินทางไปพร้อมกับรหัสประจำตัวเสมอ สำหรับรายละเอียด API เต็มรูปแบบ โปรดดูที่การอ้างอิง User
ดึงผู้ใช้จากผู้เล่น
วิธีหลักในการดึง User คือจาก Player ที่เชื่อมต่อผ่าน Player.User:
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
local user = player.User
print("รหัสผู้ใช้โดเมน:", user.Id)
print("ประเภทโดเมน:", user.DomainType)
print("รหัสโดเมน:", user.DomainId)
end)
สร้างผู้ใช้จากรหัส
เพื่อสร้าง User จากรหัสผู้ใช้ที่รู้ในเกมปัจจุบัน ใช้ User.fromId():
local user = User.fromId(knownUserId)
การใช้ผู้ใช้กับ API ของเครื่องยนต์
API ของเครื่องยนต์ที่รองรับพารามิเตอร์รหัสผู้ใช้ยังรองรับค่าของ User โดยตรง การใช้ User เป็นที่แนะนำ:
-- ทั้งสองรูปแบบทำงานได้:BadgeService:AwardBadge(player.User, badgeId) -- แนะนำBadgeService:AwardBadge(player.UserId, badgeId)
-- ทั้งสองรูปแบบทำงานได้:local target = Players:GetPlayerByUserId(player.User) -- แนะนำlocal target = Players:GetPlayerByUserId(someUserId)
เมื่อรหัสผู้ใช้จำนวนเต็มถูกส่งไปยัง API ของเครื่องยนต์ที่รองรับรหัสผู้ใช้ มันจะถูกห่อใน User โดยอัตโนมัติ
API ของเครื่องยนต์ที่ส่งคืนรหัสผู้ใช้
API ของเครื่องยนต์ที่ส่งคืนรหัสผู้ใช้จำนวนเต็มจะยังคงใช้ชื่อและประเภทฟิลด์เดียวกัน รหัสที่ส่งคืนแต่ละรหัสจะเป็นรหัสทั่วโลกหรือรหัสผู้ใช้ที่มีขอบเขตโดเมนขึ้นอยู่กับว่าผู้ใช้เข้าร่วมเกมก่อนหรือหลังการเปิดตัวรหัสที่มีขอบเขต:
- ผู้เล่นที่กลับมา (เข้าร่วมครั้งแรกก่อนการเปิดตัวรหัสที่มีขอบเขต) — API จะส่งคืนรหัสผู้ใช้ทั่วโลกของผู้ใช้
- ผู้เล่นใหม่ (เข้าร่วมครั้งแรกหลังการเปิดตัวรหัสที่มีขอบเขต) — API จะส่งคืนรหัสผู้ใช้ที่มีขอบเขตโดเมนของผู้ใช้
ทั้งรหัสผู้ใช้ทั่วโลกและรหัสผู้ใช้ที่มีขอบเขตโดเมนเป็นจำนวนเต็มมาตรฐานที่ไม่ชนกัน ดังนั้นโค้ดที่มีอยู่ซึ่งอ่านฟิลด์จำนวนเหล่านี้ยังคงทำงานได้
การจัดเก็บตัวตนของผู้ใช้
สำหรับกุญแจร้านข้อมูลภายในเกมเดียว ใช้ user.Id โดยตรง:
local key = ("player_%d"):format(player.User.Id)PlayerDataStore:SetAsync(key, data)
สำหรับค่าที่อาจอ่านโดยระบบอื่น ๆ หรือจำเป็นต้องมีบริบทโดเมนเต็มรูปแบบ ให้ทำการจัดเก็บ User ด้วย ToString():
local encoded = player.User:ToString()SomeDataStore:SetAsync("support_ticket_user", encoded)-- หลังจากนั้นให้คืนค่าเป็นสตริงlocal user = User.fromString(encoded)
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการรับประกันการจัดเก็บ โปรดดูที่การอ้างอิง User
แนวทางปฏิบัติที่ดีที่สุด
- ใช้ Player.User เป็นรหัสประจำตัวมาตรฐานในโค้ดใหม่
- อย่าใช้รหัสผู้ใช้จำนวนเต็มจากโดเมนหนึ่งเพื่อระบุผู้ใช้ในโดเมนอื่น