Сохранение данных — одна из самых важных механик для полноценной игры. Благодаря DataStore игрок не теряет свой прогресс после выхода из игры.
Например, можно сохранять:
- 🪙 количество монет;
- ⭐ уровень;
- ⚡ XP;
- 🏆 достижения;
- 📋 прогресс миссий;
- 🔓 открытые зоны;
- 🎒 купленные предметы.
Разберём простой и понятный пример сохранения монет, уровня и XP.
🧱 1. Создаём значения игрока
Сначала создадим данные, которые будем сохранять.
В ServerScriptService создай обычный Script:
game.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 = 0
coins.Parent = leaderstats
local level = Instance.new("IntValue")
level.Name = "Level"
level.Value = 1
level.Parent = leaderstats
local xp = Instance.new("IntValue")
xp.Name = "XP"
xp.Value = 0
xp.Parent = player
end)Теперь у игрока будут:
Player
├── leaderstats
│ ├── Coins
│ └── Level
└── XP
💾 2. Подключаем DataStoreService
В начале скрипта добавь:
local DataStoreService = game:GetService("DataStoreService")
local playerDataStore = DataStoreService:GetDataStore("PlayerData")PlayerData — название хранилища.
Его можно назвать, например:
GetDataStore("PlayerData")или:
GetDataStore("GameData")📥 3. Загружаем данные игрока
Когда игрок входит в игру, нужно проверить, есть ли для него сохранённые данные.
game.Players.PlayerAdded:Connect(function(player)
local success, data = pcall(function()
return playerDataStore:GetAsync(player.UserId)
end)
if success and data then
print("Данные игрока загружены")
else
print("Сохранённых данных нет")
end
end)Здесь используется GetAsync().
Он получает данные из DataStore.
🪙 4. Загружаем монеты
Теперь перенесём сохранённые значения в leaderstats.
if success and data then
coins.Value = data.Coins or 0
level.Value = data.Level or 1
xp.Value = data.XP or 0
endКонструкция:
data.Coins or 0означает: если сохранённого значения нет, использовать 0.
💾 5. Сохраняем данные при выходе
Теперь самое главное — сохранить информацию, когда игрок покидает игру.
Используем:
game.Players.PlayerRemoving:Connect(function(player)
end)Внутри получаем значения:
local data = {
Coins = player.leaderstats.Coins.Value,
Level = player.leaderstats.Level.Value,
XP = player.XP.Value
}Получается таблица:
Coins → 2500
Level → 15
XP → 750
🔐 6. Записываем данные в DataStore
Для сохранения используем SetAsync():
local success, err = pcall(function()
playerDataStore:SetAsync(player.UserId, data)
end)
if success then
print("Данные сохранены")
else
warn("Ошибка сохранения:", err)
endSetAsync() записывает данные игрока в хранилище.
🛡️ 7. Почему нужен pcall?
Работа с DataStore может завершиться ошибкой. Например, из-за временной проблемы соединения.
Поэтому запросы обычно помещают в:
pcall(function()
-- код DataStore
end)Пример:
local success, err = pcall(function()
playerDataStore:SetAsync(player.UserId, data)
end)
if not success then
warn(err)
endТак можно обработать ошибку, не ломая остальную игровую логику.
🔄 8. Готовый простой пример
Для начинающего разработчика можно собрать всё в один скрипт:
local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
local playerDataStore = DataStoreService:GetDataStore("PlayerData")
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 = 0
coins.Parent = leaderstats
local level = Instance.new("IntValue")
level.Name = "Level"
level.Value = 1
level.Parent = leaderstats
local xp = Instance.new("IntValue")
xp.Name = "XP"
xp.Value = 0
xp.Parent = player
local success, data = pcall(function()
return playerDataStore:GetAsync(player.UserId)
end)
if success and data then
coins.Value = data.Coins or 0
level.Value = data.Level or 1
xp.Value = data.XP or 0
end
end)
Players.PlayerRemoving:Connect(function(player)
local data = {
Coins = player.leaderstats.Coins.Value,
Level = player.leaderstats.Level.Value,
XP = player.XP.Value
}
local success, err = pcall(function()
playerDataStore:SetAsync(player.UserId, data)
end)
if success then
print("Данные сохранены для " .. player.Name)
else
warn("Ошибка сохранения:", err)
end
end)Теперь система умеет:
Вход игрока → загрузка → игра → изменение данных → выход → сохранение.
🧪 9. Как проверить сохранение
После написания скрипта запусти игру и измени значения.
Например:
Coins = 500
Level = 5
XP = 250Затем выйди из игры и запусти её снова.
Если всё настроено правильно, значения должны загрузиться.
⚠️ 10. Важный момент при тестировании
При разработке в Roblox Studio доступ к API-сервисам для тестирования сохранений нужно разрешить в настройках опубликованного опыта.
Также DataStore предназначен для серверных скриптов, поэтому не стоит пытаться сохранять данные непосредственно из LocalScript.
🔄 11. Почему одного PlayerRemoving недостаточно
Для более надёжной игры не стоит рассчитывать только на:
PlayerRemoving
Например, сервер может неожиданно завершить работу.
Поэтому в полноценной системе используют периодическое автосохранение:
Игра
↓
Изменение данных
↓
Автосохранение
↓
Изменение данных
↓
Автосохранение
↓
Игрок выходит
↓
Финальное сохранение
Это значительно надёжнее для большого проекта.
🧠 12. Что ещё можно сохранять?
После освоения базовой системы можно расширить таблицу:
local data = {
Coins = 2500,
Level = 15,
XP = 750,
Wins = 12,
CompletedMissions = 8,
Pets = {
"Dog",
"Cat"
}
}Таким способом можно хранить гораздо больше информации о прогрессе игрока.
🏁 Итог
Чтобы сохранить данные игрока в Роблокс Студио, используются четыре основных элемента:
DataStoreService → GetAsync() → SetAsync() → pcall()
Принцип работы простой:
Игрок входит → данные загружаются → игрок играет → прогресс изменяется → данные сохраняются.
Начните с сохранения Coins, Level и XP, а затем постепенно добавляйте достижения, миссии, предметы и другие элементы прогресса.
🔗 Полезные ссылки:
🚀 Хочешь научиться делать свои игры?
Переходи на roblo.ru и запишись на обучение Роблокс Студио!
И не забудь заглянуть в наш Telegram 👉 t.me/robloppo
