Developer Products — вторая вариация монетизации, через продукты разработчики. Главное её отличие — многоразовое использование и отсутствие логирования на серверах Roblox. Как следствие второго замечания — сохранение результатов покупки лежит полностью на программисте игры.
Т.к. в документации описание весьма не понятное, то использовалось, в качестве базы, видео:
Идём во вкладку Game, далее жмём правой мышью на Developer Products и Product settings.
Нас перекидывает на сайт, где мы и создаём свои многоразовые продажи.
Как и в случае Gamepass — удалить созданный продукт нельзя. Т.е. он будет создан навсегда. Хотя его и можно будет отредактировать.
Соответственно жмём тут «Create new» (или Edit) и заполняем.
Название, описание, цена в робуксах и конечно изображение. К изображениям предъявляются требования аналогичные Gamepass.
После создания, нашему продукту будет присвоен соответствующий Id (на предыдущем скриншоте его видно). Так же этот Id можно будет получить и в самой студии нажав правой мышью по соответствующему продукту и скопировав его.
Переходим ко второй части — скриптованию. Оно также состоит из клиентской и серверной частей.
Собственно серверный скрипт:
local MS = game:GetService("MarketplaceService") -- сокращение для вызова сервиса -- инициализируем подключение -- local DataStore2 = require(game.ServerScriptService.DataStore2) -- вариант локального модуля local DataStore2 = require(1936396537) -- вариант подключаемого модуля local function processReceipt(ReceiptInfo) local player = game:GetService("Players"):GetPlayerByUserId(ReceiptInfo.PlayerId) -- получаем Id игрока if not player then -- если не игрок, то вылетаем return Enum.ProductPurchaseDecision.NotProcessedYet end -- если игрок найден, выполняем действия -- print(ReceiptInfo.PlayerId .. " buy " .. ReceiptInfo.ProductId) local moneyStore = DataStore2("money", player) moneyStore:Increment(1000) -- даём 100 монет -- возвращаем, что покупка произведена return Enum.ProductPurchaseDecision.PurchaseGranted end MS.ProcessReceipt= processReceipt
Выпендриваться не будем и привяжем локальный скрипт к кнопке:
И собственно сам скрипт:
local MS = game:GetService("MarketplaceService") -- сокращения для вызова сервисов local players = game:GetService("Players") local PId = 946482776 -- Id продукта local button = script.Parent -- обозначение к чему привязан наш скрипт button.MouseButton1Down:Connect(function() local player = players.LocalPlayer -- локальный игрок MS:PromptProductPurchase(player,PId) -- выполнение запроса покупки end)
В скрипте SaveLoadScript соответственно добавляем отображение того, что мы можем изменить money в любой момент:
-- для leaderstats обязательны!!! pointsStore:OnUpdate(function(newPoints) -- функция запускается каждый раз при изменнении значения в хранилище points.Value = newPoints end) moneyStore:OnUpdate(function(newMoney) -- функция запускается каждый раз при изменнении значения в хранилище money.Value = newMoney end)
Ну вот собственно и всё. Запускаем и кликаем по кнопке:
Как всегда — можно увидеть результат в игре:
https://www.roblox.com/games/4587789852/NecroWorld