Gry często muszą przechowywać trwałe dane pomiędzy sesjami, takie jak poziom gracza, punkty doświadczenia, pieniądze, przedmioty ekwipunku, lokalizacja i więcej.
Ten samouczek pokazuje, jak utworzyć podstawowy magazyn danych , zapisać dane gracza i odczytać je z powrotem do sesji gry.
Włącz dostęp do Studio
Domyślnie gry testowane w Studio nie mają dostępu do magazynów danych, więc musisz najpierw je włączyć:
Opublikujdoświadczenie.
Wybierz plik i ustawienia gry .
W sekcji Bezpieczeństwo , włącz Włącz dostęp Studio do usług API i kliknij Zapisz .
Utwórz magazyn danych
Magazyny danych wymagają unikalnej nazwy **** .Ten przykład tworzy sklep danych o nazwie PlayerGold , który zapisuje złoto każdego gracza w trwałym magazynie:
Stwórz Script wewnątrz ServerScriptService o nazwie GoldManager .
Magazyny danych są zarządzane przez DataStoreService, więc uzyskaj usługę:
local DataStoreService = game:GetService("DataStoreService")Wezwij DataStoreService:GetDataStore() z ciągiem "PlayerGold".Ta metoda uzyskuje dostęp do magazynu danych GraczZłoty , jeśli już istnieje.Jeśli nie istnieje, metoda tworzy nową bazę danych i nazywa ją PlayerGold .
local DataStoreService = game:GetService("DataStoreService")local goldStore = DataStoreService:GetDataStore("PlayerGold")
Zapisz dane
Magazyn danych jest zasadniczo słownikiem, takim jak tablica Luau.Każda wartość w magazynie danych jest indeksowana przez unikalny klucz , który może być unikalny dla gracza UserId lub po prostu nazwany ciągiem dla promocji gry.
Key | Value |
---|---|
31250608 | 50 |
351675979 | 20 |
505306092 | 78000 |
Aby zapisać dane o graczu w magazynie danych:
Utwórz zmienną o nazwie playerUserID dla klucza magazynu danych. Następnie użyj playerGold do przechowywania początkowej ilości złota gracza.
local DataStoreService = game:GetService("DataStoreService")local goldStore = DataStoreService:GetDataStore("PlayerGold")-- Klucz i wartość magazynu danychlocal playerUserID = 505306092local playerGold = 250Aby zapisać dane do magazynu danych PlayerGold, wezwij SetAsync w ramach chronionego wezwania, przekazując wcześniej utworzone zmienne klucza i wartości.
local DataStoreService = game:GetService("DataStoreService")local goldStore = DataStoreService:GetDataStore("PlayerGold")-- Klucz i wartość magazynu danychlocal playerUserID = 505306092local playerGold = 250-- Ustaw klucz magazynu danychlocal success, error = pcall(function()goldStore:SetAsync(playerUserID, playerGold)end)if not success thenwarn(error)end
Funkcje takie jak SetAsync() są wezwaniami sieciowymi, które mogą czasami nie powodzić się.Jak pokazano powyżej, pcall() używa się do wykrywania i radzenia sobie z wystąpieniem takich awarii.
W najbardziej podstawowej formie pcall() akceptuje funkcję i zwraca dwie wartości:
- Status, który wynosi true, jeśli funkcja została wykonana bez błędów, lub false w przeciwnym razie.
- Wartość zwrotna funkcji lub wiadomość o błędzie.
Próbka powyżej sprawdza stan na linii 13. Jeśli SetAsync() nie powiedzie się z jakiegoś powodu, próbka wyświetla błąd w oknie Wyjście.
Przeczytaj dane
Aby odczytać dane z magazynu danych, wezwij GetAsync() z żądaną nazwą klucza.
local DataStoreService = game:GetService("DataStoreService")
local goldStore = DataStoreService:GetDataStore("PlayerGold")
-- Klucz i wartość magazynu danych
local playerUserID = 505306092
local playerGold = 250
-- Ustaw klucz magazynu danych
local setSuccess, errorMessage = pcall(function()
goldStore:SetAsync(playerUserID, playerGold)
end)
if not setSuccess then
warn(errorMessage)
end
-- Przeczytaj klucz magazynu danych
local getSuccess, currentGold = pcall(function()
return goldStore:GetAsync(playerUserID)
end)
if getSuccess then
print(currentGold)
end
Aby przetestować skrypt, kliknij Uruchom i zauważ wartość currentGold wydrukowaną w oknie Wyjście .Zauważ, że może to potrwać kilka sekund, ponieważ funkcje muszą połączyć się z serwerami magazynu danych.
Przeczytaj i zapisz automatycznie
Poprzedni skrypt działa, ale ma fundamentalny problem: zawiera zakodowane w twardy sposób wartości dla playerUserID i playerGold, więc nie wspiera wielu graczy z różną ilością złotaBardziej realistyczne rozwiązanie odczytuje wartość złota, gdy gracz łączy się z doświadczeniem, a następnie zapisuje je, gdy gracz odchodzi.Ta metoda oznacza połączenie wezwań przechowywania danych z wydarzeniami z serwisu .
local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
local goldStore = DataStoreService:GetDataStore("PlayerGold")
-- Dodaj wartości złota dla każdego gracza do lokalnego stołu, aby uniknąć uderzenia w dane
-- przechowywać wielokrotnie.
local playerGold = {}
local function incrementGold(player, amount)
playerGold[player.UserId] += amount
end
local function onPlayerAdded(player)
-- Przeczytaj klucz magazynu danych
local success, storedGold = pcall(function()
return goldStore:GetAsync(player.UserId)
end)
if success then
local currentGold
if storedGold then
currentGold = storedGold
else
currentGold = 0
end
playerGold[player.UserId] = currentGold
print(currentGold)
end
-- Testowanie wzrostu złota
incrementGold(player, 5)
end
local function onPlayerRemoving(player)
-- Ustaw klucz magazynu danych
local success, err = pcall(function()
goldStore:SetAsync(player.UserId, playerGold[player.UserId])
end)
if not success then
warn(err)
end
-- Wyczyść wejście, aby tabela nie rosła przez czas trwania serwera
playerGold[player.UserId] = nil
end
Players.PlayerAdded:Connect(onPlayerAdded)
Players.PlayerRemoving:Connect(onPlayerRemoving)
Przeczytaj i zapisz pozycję postaci
Aby zapisać pozycję gracza, pracujesz z Character zamiast z Player, ale zasada jest podobnaTym razem utwórz Script wewnątrz ServerScriptService o nazwie Menadżer pozycji :
local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local Workspace = game:GetService("Workspace")
local playerPositionStore = DataStoreService:GetDataStore("PlayerPositionStore")
local function positionHandler(player)
-- Załaduj pozycję na dodanie postaci
player.CharacterAdded:Connect(function(character)
local success, coords = pcall(function()
return playerPositionStore:GetAsync(player.UserId)
end)
local position = Vector3.new(coords[1], coords[2], coords[3])
if success and position then
character:PivotTo(CFrame.new(position))
print("Loaded player position!")
else
warn("Failed to load position for player " .. player.Name .. ". Placing in default position.")
end
-- Postępowanie z odrodzeniem gracza po śmierci
local humanoid = character:FindFirstChildOfClass("Humanoid")
humanoid.Died:Connect(function()
local spawnLocation = Workspace:FindFirstChild("SpawnLocation")
character:PivotTo(spawnLocation.CFrame)
end)
end)
-- Zapisz pozycję po usunięciu postaci
player.CharacterRemoving:Connect(function(character)
local position = character:GetPivot().Position
local success, err = pcall(function()
playerPositionStore:SetAsync(player.UserId, {position.X, position.Y, position.Z})
print("Saved player position!")
end)
if not success then
warn("Failed to save position for player " .. player.Name .. ": " .. err)
end
end)
end
Players.PlayerAdded:Connect(positionHandler)
Ten skrypt dodaje nowy magazyn danych, playerPositionStore.Ponieważ magazyny danych przechowują tylko podstawowe typy, a nie obiekty, musisz przechowywać koordynaty X, Y i Z jako poszczególne liczby, a nie jedną wartość Vector3 lub CFrame.Podczas testowania doświadczenia, przemieszczaj swoją postać.Zobacz, jak twoja postać powraca do tej samej pozycji za następnym razem, gdy przetestujesz swoje doświadczenie.
Przykładowy projekt
Teraz, gdy rozumiesz podstawowe wykorzystanie przechowywania danych, przetestuj to w grze próbnej Gold Rush.Możesz również edytować grę w Studio i zbadać ulepszony skrypt GoldManager , który wyświetla złoto jako część interfejsu użytkownika i zawiera automatyczne zapisywanie