The DataStoreService cho phép bạn lưu trữ dữ liệu cần duy trì giữa các phiên, như vật phẩm trong kho đồ của người chơi hoặc điểm kỹ năng.Các kho dữ liệu tuân thủ theo kinh nghiệm, vì vậy bất kỳ nơi nào trong kinh nghiệm cũng có thể truy cập và thay đổi dữ liệu tương tự, bao gồm cả nơi trên các máy chủ khác nhau.
Nếu bạn muốn thêm kiểm soát quyền cho phép chi tiết vào các kho dữ liệu và truy cập chúng bên ngoài các máy chủ Studio hoặc Roblox, bạn có thể sử dụng Mở API đám mây cho kho dữ liệu.
Để xem và theo dõi tất cả các kho dữ liệu trong một trải nghiệm thông qua Trung tâm Nhà sáng tạo, hãy sử dụng Quản lý kho dữ liệu.
Đối với dữ liệu tạm thời mà bạn cần cập nhật hoặc truy cập thường xuyên, hãy sử dụng kho lưu trữ bộ nhớ.
Bật quyền truy cập Studio
Mặc định, các trải nghiệm được kiểm tra trong Studio không thể truy cập các kho dữ liệu, vì vậy bạn phải bật chúng trước tiên.Truy cập cửa hàng dữ liệu trong Studio có thể nguy hiểm cho trải nghiệm trực tiếp bởi vì Studio truy cập cùng một cửa hàng dữ liệu với ứng dụng khách.Để tránh ghi đè dữ liệu sản xuất, đừng bật cài đặt này cho trải nghiệm trực tiếp.Thay vào đó, bật nó cho phiên bản thử nghiệm riêng biệt của trải nghiệm.
Để bật quyền truy cập Studio trong một kinh nghiệm đã xuất bản :
- Mở Cài đặt trò chơi.
- Điều hướng đến Bảo mật .
- Bật chuyển Bật truy cập Studio vào Dịch vụ API toggle.
- Nhấp vào Lưu .
Kho lưu trữ dữ liệu truy cập
Để truy cập một kho dữ liệu bên trong một trải nghiệm:
- Thêm DataStoreService vào một bên máy chủ Script.
- Sử dụng chức năng GetDataStore() và xác định tên của kho dữ liệu bạn muốn sử dụng.Nếu kho dữ liệu không tồn tại, Studio tạo một khi bạn lưu dữ liệu trải nghiệm lần đầu tiên.
local DataStoreService = game:GetService("DataStoreService")local experienceStore = DataStoreService:GetDataStore("PlayerExperience")
Tạo dữ liệu
Một kho lưu trữ dữ liệu về cơ bản là một từ điển, tương tự như một bảng Luau.Một chỉ mã duy nhất chìa khóa mỗi giá trị trong kho dữ cửa hàng, giống như chìa khóa duy nhất của người dùng Player.UserId một chuỗi có tên cho một chiến dịch quảng cáo trải nghiệm.
Chìa chìa khóadữ liệu người dùng | Giá trị |
---|---|
31250608 | 50 |
351675979 | 20 |
505306092 | 78000 |
Chìa khóa dữ liệu khuyến chìa khóa | Giá trị |
ActiveSpecialEvent | Bữa tiệc mùa hè2 |
ActivePromoCode | THƯỞNG123 |
CanAccessPartyPlace | đúng |
Để tạo một mục mới, gọi SetAsync() với tên chìa khóa và một giá trị.
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
Cập nhật dữ liệu
Để thay đổi bất kỳ giá trị lưu trong một kho dữ cửa hàng, gọi UpdateAsync() với tên chìa khóa của đầu vào và một chức năng trả lại xác định cách bạn muốn cập nhật đầu vào.Sự gọi lại này lấy giá trị hiện tại và trả lại một giá trị mới dựa trên logic bạn định nghĩa.Nếu cuộc gọi trả về nil , hoạt động viết bị hủy và giá trị không được cập nhật.
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
Set vs cập nhật
Sử dụng set để nhanh chóng cập nhật một chìa khóa cụ thể. Chức năng SetAsync():
- Có thể gây ra bất đồng dữ liệu nếu hai máy chủ cố gắng đặt cùng một chìa khóa cùng một lúc
- Chỉ đếm chống giới hạn viết
Sử dụng cập nhật để xử lý các lần thử nghiệm nhiều máy chủ. Chức năng UpdateAsync() :
- Đọc giá trị chìa khóa hiện tại từ máy chủ đã cập nhật nó trước khi thực hiện bất kỳ thay đổi nào
- Chậm hơn vì nó đọc trước khi viết
- Đếm chống lại cả giới hạn đọc và viết
Đọc dữ liệu
Để đọc giá trị của một cửa hàng dữ liệu, gọi GetAsync() với tên chìa khóa của cửa hàng dữ liệu.
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
Tăng dữ liệu
Để tăng một số nguyên trong một kho dữ cửa hàng, gọi IncrementAsync() với tên chìa khóa của đầu vào và một số để thay đổi giá trị.IncrementAsync() là một chức năng tiện ích cho phép bạn tránh gọi UpdateAsync() và tăng từng bước số nguyên.
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
Xóa dữ liệu
Để xóa một cái ghi và trả lại giá trị liên quan đến chìa khóa, gọi 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
Thông tin metadata
Có hai loại metadata liên quan đến các chìa khóa:
- Được định nghĩa bởi dịch vụ : Dữ liệu đọc chỉ mặc định, như thời gian cập nhật gần đây nhất và thời gian tạo. Mọi đối tượng đều có dữ liệu được định nghĩa bởi dịch vụ.
- Người dùng định nghĩa : Dữ liệu bổ sung cho việc phân loại và phân loại. Được xác định bằng cách sử dụng đối tượng DataStoreSetOptions và chức năng SetMetadata().
Để quản lý dữ liệu, mở rộng SetAsync(), UpdateAsync(), GetAsync(), IncrementAsync() và RemoveAsync() chức năng.
SetAsync() chấp nhận các tham số bắt buộc thứ ba và thứ tư:
Một bảng của UserIds . Điều này có thể giúp với bản quyền nội dung và theo dõi và loại bỏ tài sản trí tuệ.
Một đối tượng DataStoreSetOptions, nơi bạn có thể định nghĩa metadata tùy chỉnh bằng cách sử dụng chức năng 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() , và RemoveAsync() trả về giá trị thứ hai trong đối tượng DataStoreKeyInfo .Giá trị thứ hai này chứa cả các thuộc tính và chức năng được định nghĩa bởi dịch vụ để lấy dữ liệu metadata được định nghĩa bởi người dùng.
- Chức năng GetMetadata() nhận lấy metadata được định nghĩa bởi người dùng mà bạn đã chuyển cho SetAsync() thông qua SetMetadata() .
- Thuộc tính Version lấy phiên bản của chìa khóa.
- Thuộc tính CreatedTime lấy thời gian mà chìa khóa được tạo, định dạng như số mili giây kể từ thời điểm.
- Thuộc tính UpdatedTime lấy lần cuối cùng mà chìa khóa được cập nhật, định dạng như số mili giây kể từ thời điểm.
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())endChức năng trả lại của UpdateAsync() nhận thêm một tham số trong đối tượng DataStoreKeyInfo mô tả tình trạng chìa khóa hiện tại.Nó trả lại giá trị đã được chỉnh sửa, các chìa khóa liên quan đến UserIds , và dữ liệu khóa.
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
Đối với giới hạn khi xác định metadata, xem giới hạn metadata . .
Kho lưu trữ dữ liệu được sắp xếp
Mặc định, các kho dữ liệu không sắp xếp nội dung của họ.Nếu bạn cần lấy dữ liệu theo cách có trật tự, như trong thống kê bảng xếp hạng vĩnh viễn, hãy gọi GetOrderedDataStore() thay vì GetDataStore() .
local DataStoreService = game:GetService("DataStoreService")local characterAgeStore = DataStoreService:GetOrderedDataStore("CharacterAges")
Các kho dữ liệu được sắp xếp hỗ trợ cùng các chức năng cơ bản như kho dữ liệu mặc định, cộng với chức năng độc đáo GetSortedAsync() .Điều này trả về nhiều chìa khóa sắp xếp theo thứ tự cụ thể dựa trên thứ tự sắp xếp, kích thước trang và giá trị tối thiểu/tối đa.
Ví dụ sau sẽ sắp xếp dữ liệu nhân vật thành các trang với ba lượt nhập, mỗi lượt theo thứ tự giảm dần, sau đó lặp qua các trang và xuất tên và tuổi của mỗi nhân vật.
local DataStoreService = game:GetService("DataStoreService")
local characterAgeStore = DataStoreService:GetOrderedDataStore("CharacterAges")
-- Lấp đầy kho dữ liệu được sắp cửa hàng
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
-- Sắp xếp dữ liệu theo thứ tự giảm dần vào các trang ba lượt mỗi lượt
local success, pages = pcall(function()
return characterAgeStore:GetSortedAsync(false, 3)
end)
if success then
while true do
-- Nhận trang hiện tại (đầu tiên)
local entries = pages:GetCurrentPage()
-- Lặp qua tất cả các cặp chìa khóa-giá trị trên trang
for _, entry in entries do
print(entry.key .. " : " .. tostring(entry.value))
end
-- Kiểm tra xem trang cuối cùng đã được truy cập hay chưa
if pages.IsFinished then
break
else
print("----------")
-- Tiến lên trang tiếp theo
pages:AdvanceToNextPageAsync()
end
end
end