ROBLOX — DataStore2 или как хранить данные игроков

Автор: | 20 июня, 2020
Поделиться...

С этого момента нумерацию записей прекращаю. А то уже ошибаться начал.

Не смотря на то, что присутствует механизм сохранения данных он.. (как бы корректней сказать?) не совсем уж удобный. Поэтому большинство игр использует разработанный модуль DataStore. на текущий момент уже версии 2.

Первично автор о нём написал тут:

https://devforum.roblox.com/t/how-to-use-datastore2-data-store-caching-and-data-loss-prevention/136317

Там же присутствует ссылка на скачивание и.. из неё нам понадобится идентификатор со страницы:

1936396537 — он нам нужен будет для альтернативного использования, без загрузки и установки модуля в игру на этапе её написания.

В виду того что обновления для данного модуля есть, но не обновляются на Roblox.Com, советую всё-таки качать модуль отсюда и импортировать его.

Так же я нашёл русскоязычное описание по использованию данного модуля на youtube, так что если кого интересует, то вот оно (вместе со всем плейлистом)

По большому счёту, всё описано в первой ссылке. В том числе и с примером использования. Но, не для того я это всё пишу, чтобы по ссылкам прыгать.

Итак, поехали!

В блоке ServerScriptService создаём скрипт загрузки данных ScriptSaveLoad.

local Players = game:GetService("Players") -- берём ссылку на список игроков
local ServerScriptService = game:GetService("ServerScriptService") -- берём ссылку на сервис серверных скриптов

-- local DataStore2 = require(ServerScriptService.DataStore2) -- если скачали модуль и залили в игру
local DataStore2 = require(1936396537) -- если не скачивать модуль с его установкой

-- Комбинируй все ключи которые есть для хранилища DATA, т.е. переменные (числа или строки) которые касаются игроке
DataStore2.Combine("DATA","points","money") -- ..., 
DataStore2.Combine("DATA","X","Y","posX","posX") -- можно и так добавлять - в то же самое хранилище!!!

Players.PlayerAdded:Connect(function(player) -- объявляем функицю подключения игрока
	local pointsStore = DataStore2("points", player) -- создаём ссылку на хранилище очков
	local moneyStore = DataStore2("money", player) -- создаём ссылку на хранилище денег и т.д. и т.п.
	
	local leaderstats = Instance.new("Folder") -- создаём таблицу лидеров
	leaderstats.Name = "leaderstats"
	
	local points= Instance.new("NumberValue") -- созадём локальную переменную очков
	points.Name = "Points" -- задаём ей имя
	points.Value = pointsStore:Get(0) -- получаем значение из хранилища, 0 это значение по умолчанию для новых игроков
	
	local money= Instance.new("NumberValue") -- создаём локальную переменную для денег
	money.Name = "Money" -- задаём ей имя
	money.Value = moneyStore:Get(0) --  получаем значение из хранилища, 0 это значение по умолчанию для новых игроков

	points.Parent = leaderstats	-- указываем кто у кого родителем выступает
	money.Parent = leaderstats
	leaderstats.Parent = player
	
	pointsStore:OnUpdate(function(newPoints) -- функция запускается каждый раз при изменнении значения в хранилище
		points.Value = newPoints
	end)	
end)

Если обратите внимание, то третья строка закомментирована. Оно практически идентично следующей строке. Главное отличие, что отлаживать не получиться, если в модуле сработает ошибка. Но, т.к. данным модулем пользуется просто масса разработчиков, то ошибку нужно будет искать у себя, а не в модуле. Хотя… Скачанный и установленный модуль, даёт больше уверенности в том, что он не будет удалён и будет всегда доступен в игре без изменений со стороны разработчика модуля. А посему — живучи оба варианта. Устанавливается модуль так: жмём правой мышкой по ServerScriptService и выбираем пункт «Insert from file…» после чего выбираем на диске модуль.

Собственно и всё на этом. Содержимое модуля нас совершенно не интересует. Разве что посмотреть какие методы в нём можно использовать.

--[[
	DataStore2: A wrapper for data stores that caches, saves player's data, and uses berezaa's method of saving data.
	Use require(1936396537) to have an updated version of DataStore2.

	DataStore2(dataStoreName, player) - Returns a DataStore2 DataStore

	DataStore2 DataStore:
	- Get([defaultValue])
	- Set(value)
	- Update(updateFunc)
	- Increment(value, defaultValue)
	- BeforeInitialGet(modifier)
	- BeforeSave(modifier)
	- Save()
	- SaveAsync()
	- OnUpdate(callback)
	- BindToClose(callback)

	local coinStore = DataStore2("Coins", player)

	To give a player coins:

	coinStore:Increment(50)

	To get the current player's coins:

	coinStore:Get()
--]]

Ну что, нам нужен скрипт примера по использованию? Например кинем обычный Part, привяжем к нему ClickDetector ну и где-нибудь создадим скрипт по обработке кликов по нему.

-- инициализируем подключение	
local DataStore2 = require(game.ServerScriptService.DataStore2) -- вариант локального модуля
-- local DataStore2 = require(1936396537) -- вариант подключаемого модуля

workspace.Part.ClickDetector.MouseClick:Connect(function(player)
	local pointsStore = DataStore2("points", player)
	pointsStore:Increment(1) -- даём 1 поинт
end)

Внимание! Вы должны всюду использовать либо вариант установленного модуля, либо подгружаемого! Т.к. в противном случае, это будут два совершенно разных модуля и наличие ошибок неизбежно!

Осталось сделать последнии настройки. Во первых нам надо опубликовать нашу игру — можно сделать её Private пока идёт тестирование и её никто не увидит.

А далее нам надо включить использование API в нашей локальной студии, чтобы оно работало не только в опубликованном виде.

Жмём Save. И ещё надо добавить булеву переменную, чтобы модуль понимал, что он работает в режиме тестирования из Studio. Для этого добавляем в ServerStorage переменную BoolValue с именем SaveInStudio и ставим галочку в Value — т.е. True — разрешено.

Запускаем игру. Кликаем по кирпичу. Видим что поинты меняются.

Останавливаем игру. В логах видим запись о сохранении данных.

Снова запускаем игру и.. данные автоматом загружаются.

Посмотреть на работу данного примера можно тут:

https://www.roblox.com/games/4587789852/NecroWorld


Поделиться...

ROBLOX — DataStore2 или как хранить данные игроков: 5 комментариев

  1. Александр

    А извините а у меня вопрос а как сделать чтоб уровень игроков выводился на экран?

    1. Admin Автор записи

      В данном случае вы делаете всё то же самое, что и для Points разве что меняете имя переменной на переменную хранящую текущий уровень игрока.

  2. Daniel

    2022 способ абсолютно рабочий, спасибо вам большое!

  3. PaRus_Pro

    А можно ли потом будет, допустим, обнулить свои прогресс, дабы сыграть заново?

    1. Admin Автор записи

      Конечно можно. Самый простой вариант обнуления всего и вся — задать новое имя БД.

Добавить комментарий для Admin Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *