💵

【Roblox】ゲーム内有料アイテムのつくり方

2024/02/05に公開

はじめに

こんにちは、まつさこ です。

今回は、Robloxでゲーム内有料アイテムを作成する方法について解説します。本記事では、帽子や服などのアバターアイテムではなく、パワーアップアイテムやゲームパスなどのエクスペリエンス内でユーザーに提供できる有料アイテムを作成する方法を紹介します。

ゲーム内課金アイテムの種類

2024年2月現在、オリジナルのエクスペリエンスで提供できるゲーム内課金アイテムは以下の種類があります。

サブスクリプション

サブスクリプションは、ユーザーが毎月定額を支払い、そのエクスペリエンス内で特別な機能や特典を利用できるようにするアイテムです。例えば、毎月100 Robuxを支払うことで、エクスペリエンス内で特別なアイテムを利用できるようにすることができます。サブスクリプションには以下の特徴があります。

  • 自動更新(Auto-renewal):サブスクリプションは自動更新され、1回限りの購入ではありません。
  • Robuxの支払い(Robux Payout):サブスクリプションの収益はRobuxで受け取ります。
  • 単一階層(Single-Tiered):エクスペリエンス内のすべてのサブスクリプションは、ユーザーが同時に所有することができます。いずれかのサブスクリプションを持っていないと購入できないような、多層的なサブスクリプションは作成できません。

ゲームパス

ゲームパスは、ユーザーが1回限りの支払いを行い、そのエクスペリエンス内で特別な機能や特典を利用できるようにするアイテムです。一度購入したゲームパスは、エクスペリエンス内で永続的に利用できます。ゲームパスには以下の特徴があります。

製品

一時的なパワーアップアイテムや回復薬など、何度も購入できるアイテムです。適切な日本語訳が難しいのですが、英語では "Developer Products" と呼ばれます。

今回はこれらの中でも、ゲームパスのつくり方について解説します。

テスト用エクスペリエンスを作る

まずは、テスト用のエクスペリエンスを作成します。Roblox Studioを開き、新しいプレースを作成します。
今回はObbyのテンプレートを使用しました。もちろん、すでに作成済みのエクスペリエンスを使用しても構いません。

ひとまず、ゲームを公開しましょう。Robloxに公開されたゲームでないと、ゲームパスは作成できません。私は、いったんフレンドのみに公開にしました。

ブラウザの Creator Hub から、エクスペリエンスがアップロードされていることを確認しましょう。

Creator Hub のエクスペリエンス一覧はこちら

ゲームパスを作成する

Creator Hub から、Monetization タブを選択し、ゲームパスを作成します。

CREATE A PASS を選択すると、ゲームパスの作成画面が表示されます。ここで、ゲームパスの名前や説明を設定します。

アイテムを作成したら概要ページで「Sales」を選択します。Item for Sale にチェックを入れ、価格を設定するし、SAVE CHANGES で保存しましょう。

Roblox Studio でゲームパスを利用する

Roblox Studio で、ゲームパスを利用する方法を解説します。

  1. プレイヤーがパスを持っているかを判定しゲーム効果に反映する
  2. プレイヤーがパスを購入できるようにする

の二点について順に解説していきます。

プレイヤーがパスを持っているかを判定しゲーム効果に反映する

まず、Creator Hub で作成したゲームパスの Asset ID をコピーしておきます。エクスペリエンスのパス一覧から、対象のパスの「...」を選択し、Asset ID をコピーします。

Roblox Studio で、ゲームパスを利用するスクリプトを作成します。ServerScriptService 内に次のスクリプトを新規で作成します。

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

local passID = 0000000  -- ここにコピーしたIDをペースト

local function onPlayerAdded(player)
	local hasPass = false

	-- Check if the player already owns the Pass
	local success, message = pcall(function()
		hasPass = MarketplaceService:UserOwnsGamePassAsync(player.UserId, passID)
	end)

	-- If there's an error, issue a warning and exit the function
	if not success then
		warn("Error while checking if player has pass: " .. tostring(message))
		return
	end

	if hasPass then
		print(player.Name .. " owns the Pass with ID " .. passID)
		-- Assign this player the ability or bonus related to the Pass
	end
end

-- Connect "PlayerAdded" events to the function
Players.PlayerAdded:Connect(onPlayerAdded)

この状態でゲームを再生してみると、ゲームパスを購入していない場合は何も起こりませんが、購入している場合はコンソールにメッセージが表示されるはずです。

ゲームパスを作成した直後は、パスを所有していることになるので、購入している場合のログが出るはずです。

プレイヤーがパスを購入できるようにする

まず、購入ボタンのUIを作成します。StarterGui > ScreenGui 内に TextButton を作成してください。

分かりやすいように、適切に名前とボタンの文字を変更してください。

パスを購入するLocalScriptを、PurchaseButton配下に作成します。

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

local button = script.Parent
local passID = 0000000  -- 購入するパスのIDをペースト

-- Function to prompt purchase of the Pass
local function promptPurchase()
	local player = Players.LocalPlayer
	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
		-- Player already owns the Pass; tell them somehow
		print(player.Name .. " has already purchased the Pass with ID " .. passID)
	else
		-- Player does NOT own the Pass; prompt them to purchase
		MarketplaceService:PromptGamePassPurchase(player, passID)
	end
end

button.Activated:Connect(promptPurchase)

この時点で再生すると、プレイヤーはPassをすでに保有しているので、 {playerName} has already purchased the Pass with ID ***** とログが出てくるはずです。

次に、購入されたことを通知するスクリプトを ServerScriptService に作成します。

local MarketplaceService = game:GetService("MarketplaceService")

local passID = 0000000  -- チェック対象のパスのIDをペースト

-- Function to handle a completed prompt and purchase
local function onPromptPurchaseFinished(player, purchasedPassID, purchaseSuccess)
	if purchaseSuccess and purchasedPassID == passID then
		print(player.Name .. " purchased the Pass with ID " .. passID)
		-- Assign this player the ability or bonus related to the Pass
	end
end

-- Connect "PromptGamePassPurchaseFinished" events to the function
MarketplaceService.PromptGamePassPurchaseFinished:Connect(onPromptPurchaseFinished)

購入テストをするために、所有しているゲームパスをブラウザRobloxのサイドメニューの Inventory > Passes から削除します。自信が保有している状態から削除しただけなので、エクスペリエンスからゲームパスを削除したわけではありません。

Roblox Studioで再生すると、これまで出ていた {playerName} owns the Pass with ID ***** というログが出ないことが確認できます。ゲームパスを持っていないことが正常に判定されました。

しかし、Purchase Passボタンを押すとエラーが...
どうやら、AllowThirdPartySales が有効になっていないため、自分のゲームパスを購入できないようです。自分のエクスペリエンスのゲームパスなのに、なぜThirdPartySales認定...?

Roblox Studio 既知のバグ

このエラー、どうやらRoblox Studioのバグのようです。自分のエクスペリエンスのゲームパスを購入できないというのは、かなり致命的なバグですね...
Forumでも同じ問題に言及している人がいました。

エクスペリエンスをRobloxに保存し、Roblox Playerでテストすると、問題なくゲームパスが購入できることが確認できます。しかしここで購入を実行すると、普通にRobluxが消費されてしまうのでテストになりません。

取り急ぎの回避策としては、Roblox Studioのセキュリティ設定で、 Allow Third Party Sales を有効にすることです。ただこれは本来必要のない設定なので、Roblox Studioでのテストが終わったらオフにしましょう。

確かにRoblox Studioでテストできるようになりました。

まとめ

この記事では、Robloxでゲーム内有料アイテムを作成する方法について解説しました。ゲームパスを作成し、Roblox Studioでのテスト方法についても解説しました。
Roblox Studioでのテスト時のバグについては、今後のアップデートで修正されることを期待しましょう!

読んでくださりありがとうございました🤗

moze テックブログ

Discussion