← Все вопросы

Как сохранять данные игрока в Roblox, чтобы очки не сбрасывались (DataStore)?

Задан 20 месяцев назад1.3к просмотров2 ответа
8

Сделал очки через leaderstats, но при выходе и заходе обратно они обнуляются. Как сделать, чтобы прогресс сохранялся между сессиями? Слышал про DataStore, но это сложно?

2 ответа

11
✓ Принятый ответ — помог автору

Да, для постоянного сохранения нужен DataStore — это "облачная база" Roblox, привязанная к твоей игре. Базовая схема: при выходе сохраняем, при входе загружаем.

local DataStoreService = game:GetService("DataStoreService")
local store = DataStoreService:GetDataStore("PlayerData")

game.Players.PlayerAdded:Connect(function(player)
    local stats = Instance.new("Folder")
    stats.Name = "leaderstats"
    stats.Parent = player
    local points = Instance.new("IntValue")
    points.Name = "Очки"
    points.Parent = stats

    -- загрузка
    local saved = store:GetAsync(player.UserId)
    points.Value = saved or 0
end)

game.Players.PlayerRemoving:Connect(function(player)
    store:SetAsync(player.UserId, player.leaderstats["Очки"].Value)
end)

Важные моменты для новичка:

  • Ключ — player.UserId (число, уникально и не меняется, в отличие от ника).
  • Нужно включить доступ: Game Settings → Security → Enable Studio Access to API Services, иначе DataStore не работает в Studio.
  • GetAsync/SetAsync ходят в сеть — оборачивай их в pcall, чтобы при сбое сети игра не падала.
4

Не сложно по структуре, но легко потерять данные, если делать наивно. Минимум — pcall:

local ok, err = pcall(function()
    store:SetAsync(player.UserId, value)
end)
if not ok then warn("не сохранилось:", err) end

И помни: DataStore работает только в опубликованной/настоящей игре, в локальной "поиграть в файле" без публикации он не подключится.

Ваш ответ

Войдите, чтобы ответить на вопрос.