Руководство: Безопасное сохранение прогресса в Roblox Studio (DataStore)
Если в вашей игре нет сохранения прогресса, игроки не задержатся в ней дольше одного сеанса. Кому понравится гриндить монеты или прокачивать уровень, зная, что после перезапуска сервера всё обнулится?
В Roblox за сохранение отвечает сервис DataStore. В этом уроке мы создадим надежную систему сохранения монет, которая не сломается при выходе игрока или внезапном закрытии сервера.
Шаг 0. Включаем доступ к API (Самый важный шаг)
По умолчанию Roblox Studio блокирует запросы к базам данных в целях безопасности. Если не включить одну галочку, скрипт будет выдавать ошибку в консоли.
- Опубликуйте вашу игру в Roblox (
File->Publish to Roblox). - На главной вкладке нажмите Game Settings (Настройки игры).
- Перейдите в раздел Security (Безопасность).
- Включите тумблер Enable Studio Access to API Services.
- Нажмите Save.
Шаг 1. Пишем единый скрипт сохранения
Вместо того чтобы плодить разные функции, мы соберем создание статистики (leaderstats), загрузку и сохранение данных в один надежный скрипт. Он защищен от «гонщиков» (когда данные загружаются быстрее, чем создаются переменные) и от падения серверов.
- В окне Explorer найдите папку ServerScriptService.
- Создайте в ней обычный Script и назовите его DataStoreManager.
- Вставьте следующий код:
Разбор полетов: Почему этот скрипт написан именно так?
1. Зачем нужен pcall?
DataStore — это облачный сетевой запрос к серверам Roblox. Интернет может на секунду мигнуть, или сервера Roblox могут «прилечь». Если вызвать сохранение напрямую без pcall (Positive Call), при любой сетевой ошибке весь ваш скрипт намертво сломается, а игрок навсегда потеряет прогресс. Обертка в pcall позволяет игре продолжить работу, даже если база данных выдала ошибку.
2. Магия BindToClose
Когда вы тестируете игру в Roblox Studio и нажимаете кнопку Stop, вы не просто «выходите» — вы мгновенно уничтожаете игровой сервер. Событие PlayerRemoving в этот момент часто не успевает сработать. Функция game:BindToClose заставляет сервер принудительно «замереть» перед полным отключением и дать скрипту пару секунд, чтобы дописать данные всех оставшихся игроков в базу.
3. Идентификация по UserId, а не по Никнейму
Обратите внимание, что в коде используется player.UserId. Игроки могут менять свои никнеймы за Robux, но их уникальный ID остается неизменным всю жизнь. Если сохранять данные по никнейму, после его смены игрок зайдет на сервер абсолютно «голым».
Лимиты DataStore, о которых нужно помнить
База данных Roblox не резиновая. Если вы будете сохранять монеты каждую секунду (например, при каждом поднятии монетки), Roblox заблокирует запросы за спам (системная ошибка 403 / Request Limit Exceeded).
- Когда сохранять? Только при выходе игрока (
PlayerRemoving) и при закрытии сервера (BindToClose). - А если игра вылетит? Для крупных проектов с онлайном дополнительно делают автосохранение всех игроков раз в 2–5 минут, но для старта связки Выход + Закрытие сервера более чем достаточно.
Теперь ваша система сохранения защищена от большинства багов и готова к полноценному релизу!
