📷

【Roblox】Experienceのゲームデータを取得してKPIを確認する

2025/03/03に公開

はじめに

Experience内で管理しているゲームデータを定期的に取得して、KPIの進捗を確認するためのシステムを構築しましたので、その概要を紹介させて頂きます。
※ゲームデータとはステージごとのプレイ回数やクリア数、いいね数などの情報を指します。

Robloxバージョン:0.658.0.6580461

使用サービス

本システムは以下のサービスを使用しています。

  • Roblox
    • Open Cloud API
      • universe-datastores.objects:list
      • universe-datastores.objects:read
      • universe.ordered-data-store.scope.entry:read
    • DataStore
  • Google Workspace
    • Google Apps Script (GAS)
    • Spreadsheet

システム設計

本システムは以下のフローに従いゲームデータを取得します。

  1. ExperienceはゲームデータをDataStoreに保存する
  2. GASはトリガー設定で定期的に起動する
  3. スケジュール管理用Spreadsheetから、本日分の取得が未完了か確認する
  4. Open Cloud APIを実行して、DataStore内のゲームデータを取得する
  5. 取得したゲームデータをデータ保存用Spreadsheetに保存する
  6. スケジュール管理用Spreadsheetに、本日分の取得完了を記録する

設計詳細

システム設計の各フローについて説明します。

1.ExperienceはゲームデータをDataStoreに保存する

ゲームデータをDataStoreにどのように保存するか、Experience開発者と相談して決定しました。
その際Experience側のDataStoreの取得制限と更新制限を超えないように、更新頻度に注意して設計します。またDataStoreのEntry数が多すぎると、GASの実行時間中に全てのゲームデータが取りきれない等の問題がありますので、Entry数にも注意して設計します。

2.GASはトリガー設定で定期的に起動する

GASは5分おきに起動するトリガーを設定して自動実行します。ゲームデータの取得は1日1回ですが、何からの障害によってデータの取得もしくは保存に失敗した場合に即座にリトライできるように備えます。

3.スケジュール管理用Spreadsheetから、本日分の取得が未完了か確認する

ゲームデータを取得した日時を記録しておき、本日分が取得済みかどうかの判定に使用します。未取得の場合は取得フェーズに進み、取得済みの場合はGASを終了します。

last_get_at
2025/01/01

4.Open Cloud APIを実行して、DataStore内のゲームデータを取得する

Open Cloud APIを使用してDataStore内のゲームデータを取得します。ゲームデータが格納されているEntryのKeyが決まっている場合は、直接Get Data Store EntryのAPIで取得します。

複数のEntryがあり条件を満たしたEntryのみ取得する、という場合は工夫が必要です。
例えば、Entry1つ1つにステージの情報が格納されており、プレイ回数が多い順に100件取得するとします。この場合は、KeyにステージID、値にプレイ回数を入れたOrderedDataStoreを用意して対応します。
Experience側は、ステージプレイごとにOrderedDataStoreをIncrementします。
GAS側は、List Ordered Data Store EntriesのAPIを使用してプレイ回数の多い順に100件取得します。ここで得られたKeyを用いてGet Data Store EntryのAPIを実行すると、プレイ回数上位100位までのステージ情報が取得できます。

Open Cloud APIは複数同時に実行できますので、非同期で通信できるUrlFetchApp.fetchAll() 関数を使用します。ただし、Open Cloud APIの1分間の通信回数制限を超えないようにUtilities.sleep()で時間調整する必要がありました。

5.取得したゲームデータはデータ保存用Spreadsheetに保存する

取得したゲームデータはデータ保存用のSpreadsheetに保存します。Spreadsheetにはセルの個数制限がありますので、月ごとにSpreadsheetを新規作成します。データ取得日のシートを作成し、ゲームデータをテーブル形式(1行目にカラム、2行目以降にゲームデータ)で保存します。

ユーザーのフリーワードをSpreadsheetのセルに保存する場合は注意が必要です。
例えば、先頭に半角イコール「=」が含まれると自動で関数として扱われ、計算後の結果が保存されてしまいます。この場合は、GAS側でフリーワードの先頭にアポストロフィー「'」を付与して、計算させないようにしました。

ugc_stage_id ugc_stage_name play_count clear_count good_count bad_count
10001 'hoghoge 432 400 380 20
10002 '=(1+2) 321 310 250 60
10003 '00001 210 100 10 90

6.スケジュール管理用Spreadsheetに、本日分の取得完了を記録する

本日分のデータ取得と保存が完了したら、スケジュール管理用Spreadsheetに今日の日付を書き込み、GASを終了します。処理のどこかでエラーが発生した場合は5分後に実行されるGASがゲームデータの取得からやり直します。

last_get_at
2025/01/02

エラー対応

本システムの運用を続けていると、しばしば以下のエラーの発生がみられます。

通信エラー

500系エラーは通信リトライを実装する事で解決する場合があります。
継続して発生する場合は、Roblox Status[1]やGoogle Workspace Status Dashboard[2]で、障害が確認できます。

Spreadsheetエラー

関数SpreadsheetApp.openById()がSpreadsheetに接続できない場合に発生しますが、確認しても殆どが正常です。Google 側の障害でSpreadsheetに接続できないのかもしれません。

その他

ごく稀にGASが原因不明の停止を引き起こし、タイムアウトまで復旧しない事がありました。
30分程度タイムアウトせず、強制終了しない限り止まりませんでした。

サービスの制限

本システムで使用しているサービスの制限について以下に記載します。
これらの制限を超えないように実装しました。

Roblox

DataStoreの制限

DataStore名 50 文字
Key名 50 文字
スコープ 50 文字
データサイズ 4 MB

DataStoreのスループット(Experience)

読み込み 25 MB / 分
書き込み 4 MB / 分

DataStoreのスループット(Open Cloud API)

リクエスト回数 300 / 分
読み込みデータサイズ 20 MB / 分
書き込みデータサイズ 10 MB / 分

OrderedDataStoreのスループット(Open Cloud API)

リクエスト回数 300 / 分

Google Workspace

Spreadsheetの制限

セル文字数 50,000 文字
セル数 10,000,000セル
シート枚数 1,000 枚
シート名 100 文字

GASの制限(Google Workspaceアカウント)

Spreadsheetの作成回数 3200 / 日
トリガーの合計実行時間 6 時間 / 日
URL 取得の呼び出し 100,000 件 / 日
スクリプトのランタイム 6 分 / 実行
トリガー 20 / ユーザー / スクリプト
URL 取得レスポンスのサイズ 50 MB / 呼び出し
URL 取得ヘッダーのサイズ 8 KB / 呼び出し
URL 取得 URL の長さ 2 KB / 呼び出し
URL 取得ヘッダー 100 / 呼び出し

まとめ

Experience内で管理しているゲームデータを定期的に取得するシステムの概要を紹介しました。
Open Cloud APIを使用する事で、定期的にゲームデータを取得することができます。
Spreadsheetに保存しておけば、グラフを作成してデータの推移を確認する事も、月の合計値や平均値を出して分析する事も、KPIを確認する事も容易に行えるでしょう。

お読みいただきありがとうございました。

参考

脚注
  1. Roblox Status ↩︎

  2. Google Workspace Status Dashboard ↩︎

ランド・ホー Roblox開発チーム

Discussion