Mit dem DataStoreService kannst du Daten speichern, die zwischen Sitzungen bestehen müssen, wie Gegenstände in einem Spieler:in's Inventar oder Fertigkeitspunkte. Daten-Stores sind konsistent per Erfahrung, so dass jeder Ort in einem Erlebnis auf Zugriff und Änderung desselben Daten konsistent ist, einschließlich Orte auf verschiedenen Servern.
Wenn Sie granulare Berechtigungskontrolle zu Ihren Daten-Speicher hinzufügen und ihnen über Studio oder Roblox-Server zugreifen möchten, können Sie Open Cloud-APIs für Daten-Speicher verwenden.
Für temporäre Daten, die Sie häufig aktualisieren oder aufrufen müssen, verwenden Sie Speicher-Storage.
Studio-Zugriff aktivieren
Standardmäßig können Erlebnisse, die in Studio getestet wurden, keine Daten-Stores aufrufen, so musst du sie zuerst aktivieren. Wenn Sie auf Daten-Stores in Studio zugreifen, kann dies für Live-Erlebnisse gefährlich sein, da Studio auf die gleichen Daten-Stores wie die Client-Anwendung zugreift. Um die Produktionsdaten nicht zu überschreiben, aktivieren Sie diese Einstellung nicht für Live-Erlebnisse. Stattdessen aktivieren Sie sie für eine separate Testversion der Erfahrung.
Um Studio-Zugriff in einer veröffentlichten Erlebniszu aktivieren:
- Gehe zu Home > Game Settings > Security .
- Aktivieren Sie die aktivieren Studio-Zugriff auf API-Dienste umschalten.
- Klicken Sie auf Speichern .
Zugriff auf Daten-Stores
Um auf einen Datenstoß innerhalb eines Erlebnisses zuzugreifen:
- Fügen Sie DataStoreService an einen Server-seitigen Script hinzu.
- Verwenden Sie die Funktion Class.DataStoreService:GetDataStore() und geben Sie den Namen des Datenstores ein, den Sie verwenden möchten. Wenn der Datenstor nicht existiert, erstellt Studio einen, wenn Sie zum ersten Mal Ihre Erlebnistdaten speichern.
local DataStoreService = game:GetService("DataStoreService")local experienceStore = DataStoreService:GetDataStore("PlayerExperience")
Daten erstellen
Ein Daten-Store ist im Grunde ein Wörterbuch, ähnlich wie eine Lua-Tabelle. Ein einzigartiges Schlüssel-Index jedes Wert im Daten-Store, wie ein Benutzer-Unique Player.UserId oder ein benannter Strung für eine Erlebnis-Werbung.
Benutzerdaten-Schlüssel | Wert |
---|---|
31250608 | 50 |
351675979 | 20 |
505306092 | 78.000 |
Promo-Daten-Schlüssel | Wert |
Aktives Spezialereignis | SommerParty2 |
Aktiver Promo-Code | BONUS123 |
Kann Zugriff auf Partyort platzieren | wahr |
Um einen neuen Eintrag zu erstellen, rufen Sie SetAsync() mit dem Schlüsselnamen und einem Wert auf.
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
Daten aktualisieren
Um einen gespeicherten Wert in einem Daten-Store zu ändern, rufen Sie UpdateAsync() mit dem Schlüsselnamen des Eintrags und einer Rückruf-Funktion, die definiert, wie Sie den Eintrag aktualisieren möchten, auf. Dieser Rückruf nimmt den aktuellen Wert und gibt einen neuen Wert basierend auf der Logik zurück, die Sie definieren. Wenn der Rückruf 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
Setzen vs Update
Verwenden Sie set, um einen bestimmten Schlüssel schnell zu aktualisieren. Die Class.GlobalDataStore:SetAsync()|SetAsync() -Funktion:
- Kann zu Datenübereinstimmungsproblemen führen, wenn zwei Server versuchen, den gleichen Schlüssel gleichzeitig zu setzen
- Zählt nur gegen das Schreiblimit
Verwenden Sie das Update, um mehrere Server-Anfragen zu behandeln. Die Class.GlobalDataStore:UpdateAsync()|UpdateAsync() -Funktion:
- Lädt den aktuellen Schlüsselwert vom Server, der vor der Änderung auf dem gleichen Server aktualisiert wurde
- Ist langsamer, da es vor dem Schreiben liest
- Zählt gegen sowohl die Limit für die Lektüre als auch die Lektüre
Lesen von Daten
Um den Wert eines Data-Store-Eintrags zu lesen, rufe GetAsync() mit dem Schlüsselnamen des Eintrags auf.
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
Daten erhöhen
Um einen ganzen Inhalt in einem Daten-Store zu aktualisieren, rufen Sie IncrementAsync() mit dem Schlüsselnamen des Eintrags und einer Zahl für die Änderung des Wertes auf. IncrementAsync() ist eine Ver便함funktion, die Sie vermeiden können, den ganzzahligmanuell zu
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
Daten entfernen
Um einen Eintrag zu entfernen und den mit dem Schlüssel verbundenen Wert zurückzugeben, rufe RemoveAsync() auf.
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
Metadaten
Es gibt zwei Arten von Metadaten, die mit Schlüsseln verbunden sind:
- Service-defined : Standard-Leseverifizierte Metadaten, wie die neueste Update-Zeit und die Erstellungszeit. Jedes Objekt hat eine Service-defined-Metadaten.
- Benutzerdefiniert : Benutzerdefinierte Metadaten für das Taggen und Kategorisieren. Definiert mit dem DataStoreSetOptions Objekt und der Class.DataStoreSetOptions:SetMetric()|SetMetric() Funktion.
Um Metadaten zu verwalten, erweitern Sie die Class.GlobalDataStore:SetAsync()|SetAsync() , Class.GlobalDataStore:UpdateAsync()|UpdateAsync() , Class.GlobalDataStore:GetAsync()|GetAsync() , 1>Class.GlobalDataStore:IncrementAsync()|IncrementAsync() und 4>Class.GlobalDataStore:RemoveAsync()|RemoveAsync() -F
SetAsync() akzeptiert die optionalen dritten und vierten Argumente:
Eine Tabelle von UserIds . Dies kann bei der Verfolgung und Entfernung von Inhalts-Copyright und geistigen Eigentums-Tracking helfen.
Ein DataStoreSetOptions-Objekt, in dem du benutzerdefinierte Metadaten definieren kannst, indem du die SetMetadata()-Funktion verwendest.
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() und RemoveAsync() geben einen zweiten Wert im 0> Class.DataStoreKeyInfo0> -Objekt zurück. Dieser zweite Wert enthält sowohl Service- definierte Eigenschaften und Funktionen, um Ben
- Die GetUserIds() Funktion ruft die Tabelle von UserIds ab, die Sie an Class.GlobalDataStore:SetAsync()|SetAsync() übergeben haben.
- Die Class.DataStoreKeyInfo:GetMetric()|GetMetric() -Funktion übernimmt benutzerdefinierte Metadaten, die Sie an Class.GlobalDataStore:SetAsync()|SetAsync() übergeben haben, durch Class.DataStoreSetOptions:SetMetric()|SetMetric() .
- Die Version Eigenschaft ruft die Version des Schlüssels ab.
- Die CreatedTime -Eigenschaft ruft die Zeit ab, in der der Schlüssel erstellt wurde, in der Form der Anzahl der Millisekunden seit der Epoche gefорmelt.
- Die UpdatedTime-Eigenschaft ruft das letzte Mal ab, in dem der Schlüssel aktualisiert wurde, in der Form der Anzahl der Millisekunden seit der Epoche aufgezeichnet.
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())endDie Rückruffunktion von UpdateAsync() nimmt einen zusätzlichen Parallel in dem DataStoreKeyInfo -Objekt, das den aktuellen Zustand des Schlüssels beschreibt. Es gibt den modifizierten Wert, die mit UserIds verbundenen Schlüssel und die Schlüssel-Metadaten zurück.
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
Für Einschränkungen beim Festlegen von Metadaten, siehe Metadaten-Einschränkungen.
Ordenierte Daten-Stores
Standardmäßig speichern Daten-Stores keine Inhalte. Wenn Sie jedoch Inhalte in einer bestimmten Reihenfolge sortieren müssen, wie in persistente Bestenlistenstatistiken, rufen Sie GetOrderedDataStore() anstelle von Class.DataStoreService:GetDataStore() .
local DataStoreService = game:GetService("DataStoreService")local characterAgeStore = DataStoreService:GetOrderedDataStore("CharacterAges")
Bestellte Daten-Stores unterstützen die gleichen grundlegenden Funktionen wie Standard-Datenspeicher, plus die einzigartige GetSortedAsync() Funktion. Dies ruft mehrere sortierte Schlüssel basierend auf einer bestimmten Sortierungsordnung, der Seitengröße und den Minimum/Maximum-Werten wiederherbei.
Das folgende Beispiel sortiert Charakterdaten in Seiten mit drei Einträgen, jedes in absteigender Reihenfolge, und läuft dann durch die Seiten und gibt jedem Charakter seinen Namen und sein Alter aus.
local DataStoreService = game:GetService("DataStoreService")
local characterAgeStore = DataStoreService:GetOrderedDataStore("CharacterAges")
-- Bevorratet gespeicherte Store
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
-- Sortiert Daten in absteigender Reihenfolge in drei Einreichungen pro Seite
local success, pages = pcall(function()
return characterAgeStore:GetSortedAsync(false, 3)
end)
if success then
while true do
-- Bekommt die aktuelle (erste) Seite
local entries = pages:GetCurrentPage()
-- Iteriert durch alle Schlüsselwertpaare auf der Seite
for _, entry in entries do
print(entry.key .. " : " .. tostring(entry.value))
end
-- Überprüft, ob die letzte Seite erreicht wurde
if pages.IsFinished then
break
else
print("----------")
-- Weiter zu nächster Seite
pages:AdvanceToNextPageAsync()
end
end
end