😎

【Roblox】ゲームパスの作成方法

2024/07/17に公開

はじめに

今回はプレイヤーに永久的に機能を付与させたりする時に使われるゲームパスの実装方法を解説します。

あと最初でめちゃくちゃ詰まった部分でゲームパス購入テストの方法についても共有します。

公式Reference

https://create.roblox.com/docs/ja-jp/reference/engine/classes/MarketplaceService#summary

実装順序

  1. ゲームパスの作成
  2. ローカルスクリプトでIDをを付与してAPIを叩く
  3. サーバースクリプトでAPIハンドラから購入されたことを受け取る
  4. ゲームパスIDに合わせて処理を実行する

ゲームパスの作成

プレースを作成して保存が完了したらクリエイターハブへ行く
https://create.roblox.com/

作成したワールドをクリック

パスを作成するタブをクリック

作成をクリック

パスの名前と画像を決めてパスを作成をクリック

作成したパスをクリック

販売中に変更し価格を決め変更を保存する

アセットIDをメモしておく

終了!

UIの配置


ローカルスクリプト

ローカルスクリプトでゲームパス購入APIを叩く処理を書いていきます。

local Players = game:GetService("Players")
local MarketplaceService = game:GetService("MarketplaceService")

local player = Players.LocalPlayer

local gui = script.Parent.ScreenGui
local firstButton = gui.FirstButton
local secondButton = gui.SecondButton

-- パスの購入を促す関数
local function promptPassPurchase(passId)
	local hasPass = false

	local success, message = pcall(function()
		hasPass = MarketplaceService:UserOwnsGamePassAsync(player.UserId, passId)
	end)

	if not success then
		warn("Error while checking if player has pass: " .. tostring(message))
		return
	end

	if hasPass then
		-- プレイヤーがすでにパスを所有している場合; 相手に伝える
		print("You already own this pass.")
	else
		-- プレイヤーがすでにパスを所有していない場合; 購入を促す
		MarketplaceService:PromptGamePassPurchase(player, passId)
	end
end

firstButton.Activated:Connect(function()
	--FirstPassのIDを引数に入れる
	promptPassPurchase(862267773)
end)

secondButton.Activated:Connect(function()
	--SecondPassのIDを引数に入れる
	promptPassPurchase(863161359)
end)

サーバースクリプト

サーバースクリプトでは購入されたイベントを受け取りそれぞれに合わせての処理を実行していきます。

local MarketplaceService = game:GetService("MarketplaceService")

local passFunctions = {}

--[]中にはFirstPassのID
passFunctions[862267773] = function(player)
	print("FirstPassが購入された")
end

--[]中にはSecondPassのID
passFunctions[863161359] = function(player)
	print("SecondPassが購入された")
end


-- 完了したプロンプトと購入を処理する関数
local function onPromptPurchaseFinished(player, purchasedPassID, purchaseSuccess)
	if purchaseSuccess then
		-- このプレイヤーにパスに関連した能力かボーナスを割り当てる
		passFunctions[purchasedPassID](player)
	else
		print(player.Name .. " failed to purchase the Pass with ID " .. purchasedPassID)
	end
end

MarketplaceService.PromptGamePassPurchaseFinished:Connect(onPromptPurchaseFinished)

サーバー側のスクリプトも開発者製品の実装と似たような感じで書けそうですね。

https://zenn.dev/landel_tech/articles/74db9055faa33a

https://zenn.dev/landel_tech/articles/25a1fe29c69097

テストする方法

Roblox Studio内の通常再生で実行するとなぜかすでにパスを持ってる判定になってしまうのでその回避方法を共有します。

テストタブを押しクライアントとサーバーの欄にある設定を以下のようにして開始ボタンを押してもらうだけでOKです。

実行するとサーバー用のRoblox Studioとクライアント用(操作する用)のStudioが開くことが確認出来たら完璧です。クライアント用で購入ボタンを押してもらうとテストでゲームパスを購入することができます。

※以下の動画に実際にテストしているものがのってます

実行結果

https://youtu.be/NzqXCiU1nAc

Landelテックブログ

Discussion