The DataStoreService ช่วยให้คุณสามารถเก็บข้อมูลที่ต้องคงอยู่ระหว่างเซสชันได้ เช่น รายการในคลังสินค้าหรือจุดทักษะของผู้เล่นคลังข้อมูลมีความสอดคล้องต่อประสบการณ์ ดังนั้นสถานที่ใดก็ได้ในประสบการณ์สามารถเข้าถึงและเปลี่ยนข้อมูลเดียวกันได้ รวมถึงสถานที่บนเซิร์ฟเวอร์ที่แตกต่างกัน
หากต้องการเพิ่มการควบคุมการอนุญาตระดับละเอียดให้กับคลังข้อมูลและเข้าถึงพวกเขานอกเหนือจาก Studio หรือเซิร์ฟเวอร์ Roblox คุณสามารถใช้ เปิด API เว็บระยะไกลสําหรับคลังข้อมูล
เพื่อดูและติดตามทุกคลังข้อมูลในประสบการณ์ผ่าน ศูนย์กลางครีเอเตอร์ให้ใช้ ผู้จัดการคลังข้อมูล
สำหรับข้อมูลชั่วคราวที่คุณต้องอัปเดตหรือเข้าถึงบ่อยๆ ให้ใช้ คลังหน่วยความจำ
เปิดใช้งานการเข้าถึงสตูดิโอ
โดยค่าเริ่มต้นประสบการณ์ที่ทดสอบในสตูดิโอไม่สามารถเข้าถึงที่เก็บข้อมูลได้ ดังนั้นคุณต้องเปิดใช้งานพวกเขาก่อนการเข้าถึงคลังข้อมูลใน Studio อาจเป็นอันตรายสำหรับประสบการณ์สดเพราะ Studio เข้าถึงคลังข้อมูลเดียวกันกับแอปพลิเคชันไคลเอนต์เพื่อหลีกเลี่ยงการเขียนทับข้อมูลการผลิต อย่าเปิดใช้งานการตั้งค่านี้สำหรับประสบการณ์สดแทนที่จะเปิดใช้งานสำหรับเวอร์ชันทดสอบแยกต่างหากของประสบการณ์
เพื่อเปิดใช้งานการเข้าถึง Studio ในประสบการณ์ที่เผยแพร่ แล้ว:
- เปิด ตั้งค่าเกม .
- นำทางไปที่ ความปลอดภัย .
- เปิดใช้งานสวิตช์ เปิดใช้งานการเข้าถึงสตูดิโอไปยังบริการ API 4. คลิก บันทึก .
เก็บข้อมูลการเข้าถึง
เพื่อเข้าถึงคลังข้อมูลภายในประสบการณ์:
- เพิ่ม DataStoreService ให้กับด้านเซิร์ฟเวอร์ Script
- ใช้ฟังก์ชัน GetDataStore() และระบุชื่อของคลังข้อมูลที่คุณต้องการใช้หากไม่มีคลังข้อมูล สตูดิโอจะสร้างขึ้นเมื่อคุณบันทึกข้อมูลประสบการณ์เป็นครั้งแรก
local DataStoreService = game:GetService("DataStoreService")local experienceStore = DataStoreService:GetDataStore("PlayerExperience")
สร้างข้อมูล
คลังข้อมูลเป็นเกือบสารานุกรมที่คล้ายกับโต๊ะ Luauดัชนีกุญแจที่ไม่ซ้ำกัน แต่ละค่า ร้านค้าPlayer.UserId หรือสตริงที่มีชื่อสำหรับโปรโมชันประสบการณ์
คีย์ | มูลค่า |
---|---|
31250608 | 50 |
351675979 | 20 |
505306092 | 78000 |
คีย์ | มูลค่า |
ActiveSpecialEvent | ปาร์ตี้ฤดูร้อน 2 |
ActivePromoCode | โบนัส123 |
CanAccessPartyPlace | จริง |
เพื่อสร้างบันทึกใหม่ โทร SetAsync() ด้วยชื่อกุญแจและค่า
local DataStoreService = game:GetService("DataStoreService")
local experienceStore = DataStoreService:GetDataStore("PlayerExperience")
local success, errorMessage = pcall(function()
experienceStore:SetAsync("User_1234", 50)
end)
if not success then
print(errorMessage)
end
อัปเดตข้อมูล
เพื่อเปลี่ยนค่าที่เก็บไว้ในคลังข้อมูล โทร UpdateAsync() ด้วยชื่อกุญแจของเอนทรีและฟังก์ชันการโทรกลับที่กำหนดวิธีที่คุณต้องการอัปเดตเอนทรีคอลเลกชันนี้จะรับค่าปัจจุบันและส่งค่าใหม่ตามโลจิสติกที่คุณกำหนดหากการโทรกลับส่งคืน nil การดำเนินการเขียนจะถูกยกเลิกและค่าไม่ได้อัปเดต
local DataStoreService = game:GetService("DataStoreService")
local nicknameStore = DataStoreService:GetDataStore("Nicknames")
local function makeNameUpper(currentName)
local nameUpper = string.upper(currentName)
return nameUpper
end
local success, updatedName = pcall(function()
return nicknameStore:UpdateAsync("User_1234", makeNameUpper)
end)
if success then
print("Uppercase Name:", updatedName)
end
ตั้งค่า vs อัปเดต
ใช้ชุดเพื่ออัปเดตคีย์เฉพาะอย่างรวดเร็ว ฟังก์ชัน SetAsync():
- อาจทำให้เกิดความไม่สอดคล้องของข้อมูลหากสองเซิร์ฟเวอร์พยายามตั้งคีย์เดียวกันในเวลาเดียวกัน
- นับเฉพาะกับขีดจํากัดการเขียนเท่านั้น
ใช้การอัปเดตเพื่อจัดการกับความพยายามหลายเซิร์ฟเวอร์ ฟังก์ชัน UpdateAsync() :
- อ่านค่ากุญแจปัจจุบันจากเซิร์ฟเวอร์ที่อัปเดตล่าสุดก่อนที่จะทำการเปลี่ยนแปลงใดๆ
- ช้าลงเพราะอ่านก่อนที่จะเขียน
- นับกับทั้งขีดจํากัดการอ่านและการเขียน
อ่านข้อมูล
เพื่ออ่านค่าของรายการคลังข้อมูลให้โทร GetAsync() ด้วยชื่อกุญแจของรายการ
local DataStoreService = game:GetService("DataStoreService")
local experienceStore = DataStoreService:GetDataStore("PlayerExperience")
local success, currentExperience = pcall(function()
return experienceStore:GetAsync("User_1234")
end)
if success then
print(currentExperience)
end
เพิ่มข้อมูล
เพื่อเพิ่มจํานวนเต็มในคลังข้อมูล โทร IncrementAsync() ด้วยชื่อกุญแจของเอนทิตีและจํานวนสําหรับจํานวนที่จะเปลี่ยนค่าIncrementAsync() เป็นฟังก์ชันสะดวกที่ช่วยให้คุณหลีกเลี่ยงการเรียก UpdateAsync() และเพิ่มตัวเลขอย่าง手動
local DataStoreService = game:GetService("DataStoreService")
local experienceStore = DataStoreService:GetDataStore("PlayerExperience")
local success, newExperience = pcall(function()
return experienceStore:IncrementAsync("Player_1234", 1)
end)
if success then
print(newExperience)
end
ลบข้อมูล
เพื่อลบรายการและคืนค่าที่เกี่ยวข้องกับกุญแจ โทร RemoveAsync()
local DataStoreService = game:GetService("DataStoreService")
local nicknameStore = DataStoreService:GetDataStore("Nicknames")
local success, removedValue = pcall(function()
return nicknameStore:RemoveAsync("User_1234")
end)
if success then
print(removedValue)
end
เมทาดาต้า
มีสองประเภทของเมตาดาต้าที่เกี่ยวข้องกับกุญแจ:
- กำหนดโดยบริการ : เมทาดาต้าอ่านได้เริ่มต้น เช่น เวลาอัปเดตล่าสุดและเวลาสร้าง ทุกวัตถุมีเมทาดาต้าอ่านได้โดยบริการ
- กำหนดเองโดยผู้ใช้ : เมทาดาต้าที่กําหนดเองสําหรับการแท็กและจัดหมวดหมู่ กําหนดโดยใช้วัตถุ DataStoreSetOptions และฟังก์ชัน SetMetadata()
เพื่อจัดการเมตาดาต้า ขยายฟังก์ชัน SetAsync() , UpdateAsync() , GetAsync() , IncrementAsync() และ RemoveAsync()
SetAsync() ยอมรับอาร์กิวเมนต์ที่สามและที่สี่ที่เลือกได้:
ตารางของ UserIds . สิ่งนี้สามารถช่วยในการติดตามและลบลิขสิทธิ์เนื้อหาและทรัพย์สินทางปัญญา
วัตถุ DataStoreSetOptions ที่คุณสามารถกำหนดเมตาดาตาที่กำหนดเองได้โดยใช้ฟังก์ชัน SetMetadata()
local DataStoreService = game:GetService("DataStoreService")local experienceStore = DataStoreService:GetDataStore("PlayerExperience")local setOptions = Instance.new("DataStoreSetOptions")setOptions:SetMetadata({["ExperienceElement"] = "Fire"})local success, errorMessage = pcall(function()experienceStore:SetAsync("User_1234", 50, {1234}, setOptions)end)if not success thenprint(errorMessage)end
GetAsync() , IncrementAsync() และ RemoveAsync() คืนค่าที่สองในวัตถุ DataStoreKeyInfoค่าที่สองนี้มีทั้งคุณสมบัติและฟังก์ชันที่กำหนดโดยบริการเพื่อดึงข้อมูลอ้างอิงที่กำหนดโดยผู้ใช้
- คุณสมบัติ Version รับเวอร์ชันของกุญแจ
- คุณสมบัติ CreatedTime รับเวลาที่กุญแจถูกสร้างโดยจัดรูปเป็นจํานวนมิลลิวินาตั้งแต่ยุค
- คุณสมบัติ UpdatedTime รับค่าเวลาล่าสุดที่กุญแจถูกอัปเดตโดยจัดรูปเป็นจํานวนมิลลิวินาตั้งแต่ยุค
local DataStoreService = game:GetService("DataStoreService")local experienceStore = DataStoreService:GetDataStore("PlayerExperience")local success, currentExperience, keyInfo = pcall(function()return experienceStore:GetAsync("User_1234")end)if success thenprint(currentExperience)print(keyInfo.Version)print(keyInfo.CreatedTime)print(keyInfo.UpdatedTime)print(keyInfo:GetUserIds())print(keyInfo:GetMetadata())endฟังก์ชันการโทรกลับของ UpdateAsync() ใช้พารามิเตอร์เพิ่มเติมในวัตถุ DataStoreKeyInfo ที่อธิบายสถานะกุญแจปัจจุบันมันส่งค่าที่แก้ไขกลับ, กุญแจที่เกี่ยวข้องกับ UserIds คีย์
local DataStoreService = game:GetService("DataStoreService")local nicknameStore = DataStoreService:GetDataStore("Nicknames")local function makeNameUpper(currentName, keyInfo)local nameUpper = string.upper(currentName)local userIDs = keyInfo:GetUserIds()local metadata = keyInfo:GetMetadata()return nameUpper, userIDs, metadataendlocal success, updatedName, keyInfo = pcall(function()return nicknameStore:UpdateAsync("User_1234", makeNameUpper)end)if success thenprint(updatedName)print(keyInfo.Version)print(keyInfo.CreatedTime)print(keyInfo.UpdatedTime)print(keyInfo:GetUserIds())print(keyInfo:GetMetadata())end
สำหรับข้อจํากัดเมื่อกําหนดเมตาดาต้าดูข้อจํากัดเมตาดาต้า
จัดเก็บข้อมูลตามลําดับ
โดยค่าเริ่มต้น คลังข้อมูลไม่จัดเรียงเนื้อหาหากต้องการรับข้อมูลในลำดับที่กำหนดไว้ เช่น ในสถิติลีดเดอร์บอร์ดถาวร โทร GetOrderedDataStore() แทนที่จะเป็น GetDataStore()
local DataStoreService = game:GetService("DataStoreService")local characterAgeStore = DataStoreService:GetOrderedDataStore("CharacterAges")
ร้านข้อมูลที่สั่งซื้อสนับสนุนฟังก์ชันพื้นฐานเดียวกับร้านข้อมูลเริ่มต้น บวกกับฟังก์ชันพิเศษ GetSortedAsync() ฟังก์ชันนี้คือการดึงข้อมูล หลายคีย์เรียงลําดับ ตามลําดับการจัดเรียงที่เฉพาะเจาะจง ขนาดหน้า และมูลค่าขั้นต่ํา/สูงสุด
ตัวอย่างต่อไปนี้จัดเรียงข้อมูลตัวละครเป็นหน้าด้วยสามรายการในลำดับลดลง จากนั้นจะเล่นผ่านหน้าและแสดงชื่อและอายุของแต่ละตัวละคร
local DataStoreService = game:GetService("DataStoreService")
local characterAgeStore = DataStoreService:GetOrderedDataStore("CharacterAges")
-- ร้านค้า
local characters = {
Mars = 19,
Janus = 20,
Diana = 18,
Venus = 25,
Neptune = 62
}
for char, age in characters do
local success, errorMessage = pcall(function()
characterAgeStore:SetAsync(char, age)
end)
if not success then
print(errorMessage)
end
end
-- จัดเรียงข้อมูลตามลำดับลงไปในหน้าของสามรายการแต่ละรายการ
local success, pages = pcall(function()
return characterAgeStore:GetSortedAsync(false, 3)
end)
if success then
while true do
-- รับหน้าปัจจุบัน (หน้าแรก)
local entries = pages:GetCurrentPage()
-- ทำซ้ำผ่านคู่คีย์-ค่าทั้งหมดบนหน้า
for _, entry in entries do
print(entry.key .. " : " .. tostring(entry.value))
end
-- ตรวจสอบว่าหน้าสุดท้ายถูกเข้าถึงแล้วหรือไม่
if pages.IsFinished then
break
else
print("----------")
-- ก้าวไปสู่หน้าต่อไป
pages:AdvanceToNextPageAsync()
end
end
end