Блог школы Роблоппа — Роблокс Студио, обучение, познавательные статьи и новости школы

Как сделать автосохранение в Роблокс Студио

Документация
Автосохранение — важная часть игры, в которой есть прогресс игрока. Если игрок получает монеты, проходит уровни или зарабатывает опыт, эти данные желательно периодически сохранять.
В Роблокс Студио для этого используется DataStoreService. Вместо того чтобы ждать выхода игрока, игра может автоматически сохранять его данные через определённый промежуток времени.

Зачем нужно автосохранение

Если сохранять данные только при выходе игрока, прогресс может потеряться, например, при неожиданном завершении работы сервера.
Автосохранение позволяет регулярно записывать текущие значения:
  • уровень;
  • монеты;
  • опыт;
  • достижения;
  • игровые настройки;
  • другой прогресс.
Например:
Игрок играет
↓
Получает монеты
↓
Проходит уровень
↓
Проходит несколько минут
↓
Автосохранение
↓
Данные записаны в DataStore

Что будем сохранять

Для примера создадим два значения:
Player
└── leaderstats
├── Coins
└── Level
Пусть игрок начинает с:
Coins = 100
Level = 1
Во время игры эти значения могут изменяться.

Шаг 1. Подключаем необходимые сервисы

Создайте обычный Script в:
ServerScriptService
└── DataManager
В начале скрипта подключите сервисы:
local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local playerDataStore = DataStoreService:GetDataStore("PlayerData")
DataStoreService отвечает за сохранение данных между игровыми сессиями.

Шаг 2. Создаём данные игрока

При входе игрока создадим leaderstats:
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local coins = Instance.new("IntValue")
coins.Name = "Coins"
coins.Value = 100
coins.Parent = leaderstats
local level = Instance.new("IntValue")
level.Name = "Level"
level.Value = 1
level.Parent = leaderstats
end)
Теперь у каждого игрока будут свои Coins и Level.

Шаг 3. Создаём функцию сохранения

Чтобы не повторять один и тот же код, удобно создать отдельную функцию:
local function savePlayerData(player)
local leaderstats = player:FindFirstChild("leaderstats")
if not leaderstats then
return
end
local coins = leaderstats:FindFirstChild("Coins")
local level = leaderstats:FindFirstChild("Level")
if not coins or not level then
return
end
local data = {
Coins = coins.Value,
Level = level.Value
}
local key = "Player_" .. player.UserId
local success, err = pcall(function()
playerDataStore:SetAsync(key, data)
end)
if success then
print("Данные сохранены:", player.Name)
else
warn("Ошибка сохранения:", err)
end
end
Здесь мы сохраняем монеты и уровень в одну таблицу.

Шаг 4. Создаём цикл автосохранения

Теперь самое главное — периодически вызываем функцию savePlayerData().
Например, будем делать это каждые 120 секунд:
while true do
task.wait(120)
for _, player in ipairs(Players:GetPlayers()) do
savePlayerData(player)
end
end
Что происходит?
task.wait(120) ждёт 120 секунд.
После этого:
Players:GetPlayers()
получает список игроков на сервере.
Затем цикл:
for _, player in ipairs(Players:GetPlayers()) do
проходит по каждому игроку и сохраняет его данные.

Шаг 5. Добавляем сохранение при выходе

Автосохранение не отменяет сохранение при выходе игрока.
Добавим:
Players.PlayerRemoving:Connect(function(player)
savePlayerData(player)
end)
Теперь данные будут сохраняться:
  • автоматически во время игры;
  • когда игрок покидает сервер.

Полный пример автосохранения

Вот готовый вариант скрипта:
local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local playerDataStore = DataStoreService:GetDataStore("PlayerData")
local function savePlayerData(player)
local leaderstats = player:FindFirstChild("leaderstats")
if not leaderstats then
return
end
local coins = leaderstats:FindFirstChild("Coins")
local level = leaderstats:FindFirstChild("Level")
if not coins or not level then
return
end
local data = {
Coins = coins.Value,
Level = level.Value
}
local key = "Player_" .. player.UserId
local success, err = pcall(function()
playerDataStore:SetAsync(key, data)
end)
if success then
print("Данные сохранены:", player.Name)
else
warn("Ошибка сохранения:", err)
end
end
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local coins = Instance.new("IntValue")
coins.Name = "Coins"
coins.Value = 100
coins.Parent = leaderstats
local level = Instance.new("IntValue")
level.Name = "Level"
level.Value = 1
level.Parent = leaderstats
end)
Players.PlayerRemoving:Connect(function(player)
savePlayerData(player)
end)
while true do
task.wait(120)
for _, player in ipairs(Players:GetPlayers()) do
savePlayerData(player)
end
end
Это простой пример, который показывает принцип работы автосохранения.

Как загрузить данные

Чтобы автосохранение имело смысл, при входе нужно загружать ранее сохранённые данные.
Внутри PlayerAdded после создания Coins и Level можно добавить:
local key = "Player_" .. player.UserId
local success, data = pcall(function()
return playerDataStore:GetAsync(key)
end)
if success and data then
coins.Value = data.Coins or 100
level.Value = data.Level or 1
end
Теперь схема будет полной:
Вход игрока
↓
GetAsync()
↓
Загрузка данных
↓
Игрок играет
↓
Изменение Coins / Level
↓
Автосохранение
↓
SetAsync()
↓
Игрок выходит
↓
Дополнительное сохранение

Почему используется pcall()

Запросы к DataStore могут завершиться ошибкой. Поэтому операции чтения и записи нужно обрабатывать безопасно.
Например:
local success, err = pcall(function()
playerDataStore:SetAsync(key, data)
end)
Если сохранение не удалось, информация об ошибке попадёт в err, а игра сможет продолжить работу.

Как часто делать автосохранение?

Не стоит сохранять данные каждую секунду.
Например:
task.wait(1)
может привести к слишком большому количеству запросов.
Для учебного проекта можно использовать достаточно большой интервал, например:
task.wait(120)
То есть сохранять данные примерно раз в две минуты.
В реальной игре интервал нужно выбирать с учётом количества игроков, объёма данных и ограничений DataStore.

Не сохраняйте данные при каждом изменении

Представим, что игрок получает монеты:
coins.Value += 1
Не обязательно сразу после этого обращаться к DataStore.
Лучше изменить значение:
coins.Value += 1
а затем сохранить его во время следующего автосохранения.
Так система будет делать меньше запросов.

Что делать при ошибке сохранения?

Если SetAsync() завершился ошибкой, полезно вывести сообщение в Output:
if not success then
warn("Не удалось сохранить данные:", err)
end
Во время разработки проверяйте окно View → Output.
Если там появляются ошибки, их нужно исправить до публикации игры.

Важный момент: не создавайте конфликтующие сохранения

Не стоит создавать несколько скриптов, которые независимо сохраняют одну и ту же таблицу:
Script 1 → сохраняет Coins
Script 2 → сохраняет Level
Script 3 → сохраняет XP
Один скрипт может случайно перезаписать данные другого.
Лучше использовать единую структуру:
local data = {
Coins = coins.Value,
Level = level.Value,
XP = xp.Value
}
И сохранять её целиком.

Как улучшить систему автосохранения

Для более серьёзной игры можно добавить:
  • повторную попытку после временной ошибки;
  • UpdateAsync() для определённых сценариев;
  • защиту от некорректных данных;
  • сохранение нескольких типов прогресса;
  • отдельную систему управления данными;
  • аккуратное завершение работы сервера.
Но для первого проекта достаточно понять основной принцип:
загрузили данные → изменяем их во время игры → периодически сохраняем → сохраняем ещё раз при выходе.

Итог

Автосохранение в Роблокс Студио помогает уменьшить вероятность потери игрового прогресса.
Основные элементы такой системы:
  1. DataStoreService — хранит данные.
  2. GetAsync() — загружает данные.
  3. SetAsync() — сохраняет данные.
  4. pcall() — помогает обработать ошибки.
  5. task.wait() — задаёт интервал автосохранения.
  6. Players:GetPlayers() — позволяет сохранить данные всех игроков.
  7. PlayerRemoving — сохраняет данные при выходе игрока.
Автосохранение особенно полезно в играх с уровнями, валютой, опытом, достижениями и другими видами прогресса.

🔗 Полезные ссылки:

🚀 Хочешь научиться делать свои игры?

Переходи на roblo.ru и запишись на обучение Роблокс Студио!
И не забудь заглянуть в наш Telegram 👉 t.me/robloppo
Made on
Tilda