ファネルイベントを使用すると、ユーザーがゲームの重要なステージを通過する進行状況を追跡できます。これには以下が含まれます:
- オンボーディング — ユーザーはゲームを始める際にどこで離脱しますか?
- 進行 — ユーザーはゲームを進める際にどこで止まりますか?
- ショップ — ユーザーはどこで購入を放棄しますか?
ゲームがファネルイベントの追跡を開始すると、クリエイターハブの分析ダッシュボードのファネルページがアンロックされます。ダッシュボードには最大10個のファネルのタブを追加できます。
ユーザーがファネルに対して180日以上イベントを持たない場合、保存されたステップは期限切れとなり、再度戻ってきた場合はそのファネルに対して新しいユーザーとしてカウントされます。
ファネルイベントを追跡する
ファネルイベントを追跡するには、まずゲーム内で最も重要なファネルを特定し、それをステップに分けます。目的はプレイヤーの行動を理解することなので、これらのステップは通常、何らかのアクションや成果に対応します。
RPGでは、ゲームに参加するためのステップ、クラスを選択するためのステップ、スタートルームを出るためのステップなどがあるかもしれません。プレイヤーがステップを完了した後に、通常は LogFunnelStepEvent() または LogOnboardingFunnelStepEvent() を呼び出しますが、最も重要なのは、これらのメソッドを呼び出すタイミングと、解釈しやすい名前を使用することです。
オンボーディングフローはファネルイベントを追跡するのに最適な場所です。ここで大多数のユーザーを失う可能性が高いからです。
一度限りのファネルを追跡する
一度限りのファネルは、ユーザーごとに一度だけ発生するコンバージョンイベントを監視します。
一般的な例はオンボーディングファネルで、これはゲームの新規ユーザーの保持率やセッション時間を改善する方法を理解するために重要です。以下の例は、Plantというタイクーンゲームのオンボーディングファネルで、新しいユーザーが農場に入り、種を植え、水をやるなどのステップを順番に行います:
local AnalyticsService = game:GetService("AnalyticsService")
-- FTUEの最初のステップをログ
AnalyticsService:LogOnboardingFunnelStepEvent(
player,
1, -- ステップ番号
"農場に入る" -- ステップ名
)
-- 2番目のステップをログ
AnalyticsService:LogOnboardingFunnelStepEvent(
player,
2, -- ステップ番号
"種を植える" -- ステップ名
)繰り返しのファネルを追跡する
繰り返しのファネルは、ユーザーごとに複数回発生するコンバージョンイベントを監視します。
一般的な例はショップファネルで、これはゲームの支払いコンバージョン、ARPPU、収益を改善する方法を理解するのに役立ちます。以下の例は、ユーザーがストアを開き、アイテムを表示し、カートにアイテムを追加するショップファネルです。
funnelSessionIdを使用して、繰り返しのファネル内で同じユーザーの異なるセッションを区別します。たとえば、単一のセッション内でショップを複数回開く場合です。
local AnalyticsService = game:GetService("AnalyticsService")
local HttpService = game:GetService("HttpService")
local funnelSessionId = HttpService:GenerateGUID()
-- ユーザーがストアを開いたときにログ
AnalyticsService:LogFunnelStepEvent(
player,
"ArmoryCheckout", -- ステップをグループ化するために使用されるファネル名
funnelSessionId, -- このユニークなチェックアウトセッションのファネルセッションID
1, -- ステップ番号
"ストアを開いた" -- ステップ名
)
-- ユーザーがアイテムを表示したときにログ
AnalyticsService:LogFunnelStepEvent(
player,
"ArmoryCheckout", -- ステップをグループ化するために使用されるファネル名
funnelSessionId, -- このユニークなチェックアウトセッションのファネルセッションID
2, -- ステップ番号
"アイテムを表示した" -- ステップ名
)
-- ユーザーがカートに追加したときにログ
AnalyticsService:LogFunnelStepEvent(
player,
"ArmoryCheckout", -- ステップをグループ化するために使用されるファネル名
funnelSessionId, -- このユニークなチェックアウトセッションのファネルセッションID
3, -- ステップ番号
"カートに追加した" -- ステップ名
)funnelSessionIdを実装する
ファネルを実装する際に、funnelSessionIdはイベントを追跡するのに役立ちますが、すべてのインスタンスで必要というわけではありません。以下のガイドラインを使用してください:
- 一度限りのファネル - 一度限りのファネルにはfunnelSessionIdを使用する必要はありません。なぜなら、ユーザーごとに一度しか発生しないからです。
- ストアファネル - 繰り返しのファネル内で同じユーザーの異なるセッションを区別するためにfunnelSessionIdを使用します。たとえば、前の例のように、単一のセッション内でショップを複数回開く場合です。このような場合、プレイヤーが単一のセッション内でショップを複数回開く可能性があるため、funnelSessionIdとしてGUIDを使用することをお勧めします。
- アイテムのアップグレード - 通常、単一のプレイセッションよりも長い期間にわたって異なるアイテムアップグレードパスを区別するためにfunnelSessionIdを使用します。ストアファネルの場合のようにGUIDを使用するのではなく、アップグレードされるアイテムに基づいてユニークなキーを構築することができます。たとえば:<playerId>-<itemId>のように。
分析は、各ファネルごとにユーザーごとに10個の最新のユニークなfunnelSessionId値のみを追跡します。ユーザーがそのファネルの最新の10個に含まれていないfunnelSessionIdを再利用した場合、ファネルはそれを新しいセッションとしてカウントします。
初期ステップ
ファネルは最初のステップがログされると開始されます。プレイヤーが参加したときにすぐにファネルを開始したい場合は、PlayerAddedイベントで最初のステップをログします。
local AnalyticsService = game:GetService("AnalyticsService")
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
AnalyticsService:LogOnboardingFunnelStepEvent(
player,
1, -- ステップ番号
"プレイヤーが参加" -- ステップ名
)
end)繰り返しのステップ
ユーザーがファネル内でステップを繰り返す場合、ファネルはそのステップの最初のインスタンスのみを考慮します。たとえば、ユーザーがファネルのステップ2を2回ログした場合、ファネルはステップ2の最初のインスタンスのみをカウントします。プレイヤーが切断して再接続した場合の一度限りのファネルを処理するために特別なアクションを取る必要はなく、funnelSessionIdが繰り返しのファネルを処理します。
繰り返しのステップはファネルによって無視されますが、依然としてログに記録され、グローバルレート制限に寄与します。
スキップされたステップ
何らかの理由でファネル内のステップをスキップした場合、以前のステップは自動的に完了します。たとえば、ステップ1、2、3のあるファネルがあり、ステップ3をログしたがステップ1または2をログしていない場合、ファネルはステップ1と2を完了したものと見なします。
ファネルフィルターを使用する
Robloxは、ファネルデータを分析するのに役立つフィルターを提供します。これにはプレイヤーデータやデバイスデータが含まれ、カスタムデータを送信することもできます。場合によっては、プレイヤーのステータスがファネル中に変わることがあります。たとえば、プレイヤーがモバイルからデスクトップにデバイスを切り替えるときです。
ファネルの二重カウントを避けるために、フィルターはファネルの最初のステップにのみ適用されます。これは、プレイヤーがファネル中にデバイスを切り替えた場合、ファネルはファネルに入るときのデバイスにのみ帰属することを意味します。
同様に、ファネルはコホート別に表示されます。つまり、プレイヤーが6/19にファネルに入った場合、ファネルは6/19のコホートに帰属し、たとえ6/20にファネルを完了してもそのようになります。
ファネルを修正する
ファネルステップを更新した後は、最新のファネルを表示するために正しい日付範囲を設定することが重要です。現在の日付が6/21で、6/14にオンボーディングファネルのステップ2を更新した場合、最新のファネルを表示するには日付範囲を6/14 – 6/21に設定する必要があります。
ファネルステップの更新を含む日付範囲を選択すると、関連するステップに警告が表示されます:

悪用者からファネルを保護する
データをクリーンに保つためには、悪用者が無効なデータを分析サービスに送信するのを防ぐために、サーバーコードにある程度のデータ検証を追加することが重要です。
たとえば、3つのステップを持つオンボーディングファネルがある場合、クライアントが各ステップを完了したときにサーバーに通知するためにRemoteEventを使用し、イベントをログする前にステップ番号が有効であることを確認するサーバーチェックを追加できます:
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local onboardingEvent = ReplicatedStorage:WaitForChild("OnboardingEvent")
local function fireOnboardingEvent(step: number)
onboardingEvent:FireServer({ step = step })
end
fireOnboardingEvent(1)
fireOnboardingEvent(2)
fireOnboardingEvent(10) -- 無効なステップlocal AnalyticsService = game:GetService("AnalyticsService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local onboardingEvent = ReplicatedStorage:WaitForChild("OnboardingEvent")
local maxStep = 3
local function onPlayerEventFired(player: Player, args: { step: number })
local step = args.step
if(step > maxStep) then
warn(`クライアントから受信した無効なチュートリアルステップ {step}。`)
return
end
print(`{player.Name} がステップを完了しました: {step}`)
AnalyticsService:LogOnboardingFunnelStepEvent(player, step)
end
onboardingEvent.OnServerEvent:Connect(onPlayerEventFired)カスタムフィールドを使用する
ファネルイベントは、セグメント間の比較を容易にするためにカスタムフィールドを分解することも可能です。たとえば、どのスターターカーがプレイヤーに最良の進行を提供するかを追跡したり、異なるマップを添付して特定のマップが他のマップよりも優れたゲームループを持っているかどうかを確認したりできます。

詳細については、カスタムフィールドを参照してください。
ファネルを使用してゲームを成長させる
追跡する最も重要なファネルの1つはオンボーディングです。なぜなら、多くのゲームが新規ユーザーの保持とエンゲージメントに苦労しているからです。
以下のPlantのオンボーディングファネルでは、最大の離脱はステップ2("種を植える")です。

このデータに基づいて、次のような改善が考えられます:
- ユーザーが始める際に種を植えるようにより良く誘導するためのコンテキスト指標を追加する。
- ユーザーが種を植え、成功した植物を育てることを要求する新しいユーザー体験を設計する。これにより、ポジティブフィードバック要素を作成したり、他のゲームデザイン技術を使用してこのイベントを改善できます。
