Class.DataStoreService umożliwia przechowywanie danych, które muszą istnieć między sesjami, takich jak przedmioty w ekwipunku gracza lub punkty umiejętności. Magazyny danych są spójne według doświadczenia, więc każde miejsce w doświadczeniu może uzyskać dostęp i zmienić te same dane, w tym miejsca na różnych serwerach.
Jeśli chcesz dodać kontrolę granularnej uprawnienia do swoich magazynów danych i uzyskać dostęp do nich poza serwerami Studio lub Roblox, możesz użyć otwartych chmurowych API dla magazynów danych .
Dla tymczasowych danych, które musisz często aktualizować lub odczytywać, użyj przechowywania pamięci.
Włączanie dostępu do Studio
Domyślnie doświadczenia testowane w Studio nie mogą uzyskać dostępu do przechowywania danych, więc najpierw musisz je włączyć. Dostęp do przechowywania danych w Studio może być niebezpieczny dla żywych doświadczeń, ponieważ Studio uzyskuje dostęp do tych samych przechowalni danych co klient. Aby uniknąć nagród produkcyjnych, nie włączaj tego ustawienia dla żywych doświadczeń.
Aby włączyć dostęp Studio w opublikowanej doświadczeniu:
- Idź do Strona główna > Ustawienia gry > Bezpieczeństwo .
- Włącz Włącz Studio Access do API Services toggle.
- Kliknij Zapisz .
Dostęp do magazynów danych
Aby uzyskać dostęp do przechowywania danych w wymiarze wrażenia:
- Dodaj DataStoreService do serwerowej Script .
- Użyj funkcji GetDataStore() i określ nazwę magazynu danych, który chcesz użyć. Jeśli magazyn danych nie istnieje, Studio tworzy go, gdy zapiszesz swoje dane doświadczenia po raz pierwszy.
local DataStoreService = game:GetService("DataStoreService")local experienceStore = DataStoreService:GetDataStore("PlayerExperience")
Tworzenie danych
Magazyn danych jest zasadniczo słownikiem, podobnym do tabeli Lua. Unikalny klucz indeksuje każdą wartość w sklepdanych, jak unikalny Player.UserId lub imienna wiadomość dla promocji doświadczenia.
Klucz danych użytkownika | Wartość |
---|---|
31250608 | 50 |
351675979 | 20 |
505306092 | 78000 |
Klucz danych promocyjnych | Wartość |
AktwneSpecjalneWydarzenie | Letnia impreza 2 |
Aktywny Kod Promocyjny | BONUS123 |
Możliwość dostępu do party place | prawdziwy |
Aby utworzyć nową pozycję, wezwij Class.GlobalDataStore:SetAsync()|SetAsync() z imieniem klucza i wartością.
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
Aktualizowanie danych
Aby zmienić jakiekolwiek przechowywane wartości w sklepdanych, wezwij Class.GlobalDataStore:UpdateAsync()|UpdateAsync() z imieniem klucza wpisu i funkcją zwrotu, która określa, jak chcesz aktualizować wpis. Ta funkcja zwrotu odbiera obecną wartość i weryfikuje logikę, którą określasz. Jeśli funkcja zwrotu zwraca <
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
Ustaw vs aktualizację
Użyj ustawienia, aby szybko aktualizować określony klucz. Funkcja SetAsync() :
- Może powodować niezgodność danych, jeśli dwa serwery próbują ustawić ten sam klucz jednocześnie
- Liczy tylko w obszarze limitu pisania
Użyj funkcji update, aby zarządzać wieloma serwerami. Funkcja UpdateAsync() :
- Czyta aktualną wartość klucza z serwera, który ostatnio ją aktualizował przed wprowadzeniem jakichkolwiek zmian
- Jest wolniejszy, ponieważ czyta przed тем, co pisze
- Liczy zarówno na limity czytania i pisania
Czytanie danych
Aby przeczytać wartość wpisu w magazynie danych, wezwij GetAsync() z imieniem klucza wpisu.
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
Zwiększanie danych
Aby zwiększyć liczbę w jednej sklepdanych, wezwij IncrementAsync() z imieniem klucza wpisu i numerem dla zmiany wartości. IncrementAsync() jest funkcją udogodnienia, która umożliwia uniknięcie wzywania <
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
Usuwanie danych
Aby usunąć wpis i zwrócić wartość związaną z kluczem, wezwij 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
Metadane
Są dwa rodzaje metadanych związanych z kluczami:
- Definowane przez usługę : Domyślne metadane czytania, takie jak najnowszy czas aktualizacji i czas stworzenia. Każdy obiekt ma metadane zdefiniowane przez usługę.
- Użytkownik-definowany : Dostosowany metadane dla oznaczania i kategoryzacji. Definiowany za pomocą obiektu DataStoreSetOptions i funkcji SetMetadata().
Aby zarządzać metadanymi, rozwiej funkcje SetAsync(), UpdateAsync(), GetAsync() i 2>Class.GlobalDataStore: IncrementAsync()|IncrementAsync()2>.
Class.GlobalDataStore:SetAsync()|SetAsync() akceptuje opcjonalne trzecie i czwarte argumenty:
Tabela UserIds . Może to pomóc w sprawie prawa autorskiego i śledzenia własności intelektualnej.
Obiekt DataStoreSetOptions, w którym możesz zdefiniować niestandardowe metadane przy użyciu funkcji 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)endGetAsync() , IncrementAsync() i RemoveAsync() zwracają drugi wartości w obiekcie 0> Class.DataStoreKeyInfo0>. Ten drugi wartości zawiera zarówno własności i funkcje określone przez us
- Funkcja GetMetadata() przyjmuje ustalone metadane użytkownika, które przesłałeś do SetAsync() poprzez SetMetadata().
- Właściwość Version odczytuje wersję klucza.
- Właściwość CreatedTime odczytuje czas, w którym klucz został stworzony, zapisany jako liczba milisekund od czasu epoki.
- Właściwość UpdatedTime otrzymuje ostatni raz, gdy klucz był aktualizowany, w formie liczby milisekund od czasu odnowienia.
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())endFunkcja zwrotu dzwonka UpdateAsync() w DataStoreKeyInfo obiecuje dodatkowy parametr w obiekcie UserIds, który opisuje aktualny stan klucza. Występuje zmodyfikowany wartość, klucze związane z 1> Class.Player.UserId|UserIds1> i metadane klucza.
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
For limits when defining metadata, see Ograniczenia metadanych .
Przechowywanie danych w porządku
Domyślnie magazyny danych nie sortują ich treści. Jeśli musisz uzyskać dane w sposób uproszczony, jak w statystykach trwałej tablicy liderów, wezwij GetOrderedDataStore() zamiast GetDataStore().
local DataStoreService = game:GetService("DataStoreService")local characterAgeStore = DataStoreService:GetOrderedDataStore("CharacterAges")
Przechowywane dane wspierają te same podstawowe funkcje co zwykłe magazyny danych, plus unikalną funkcję GetSortedAsync() . Ta funkcja odszukuje wiele sortowanych kluczy w oparciu o określny porządek sortowania, rozmiar strony i minimalny/maksymalny wartości.
Poniższy przykład sortuje dane postaci w strony z trzema wpisami, każdy w odwrotnej kolejności, a następnie pętli przez strony i wyjścia każdego postaci imię i wiek.
local DataStoreService = game:GetService("DataStoreService")
local characterAgeStore = DataStoreService:GetOrderedDataStore("CharacterAges")
-- Wypełnia przechowywane dane
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
-- Sortuje dane w odwrotnej kolejności na strony trzech wpisów każdy
local success, pages = pcall(function()
return characterAgeStore:GetSortedAsync(false, 3)
end)
if success then
while true do
-- Zdobądź bieżącą (pierwszą) stronę
local entries = pages:GetCurrentPage()
-- Przeprowadza przez wszystkie pary kluczowych na stronie
for _, entry in entries do
print(entry.key .. " : " .. tostring(entry.value))
end
-- Sprawdza, czy ostatnia strona została osiągnięta
if pages.IsFinished then
break
else
print("------")
-- Przejdź do następnej strony
pages:AdvanceToNextPageAsync()
end
end
end