カスタムマッチメイキングに X-Ray を使用する
注釈:本資料はAI技術を用いて翻訳されています。
この記事では、ゲームのカスタムマッチメイキングにAccelByte Gaming Services(AGS)マッチメイキング X-Ray ツールを使用する方法について説明します。
前提条件
- マッチメイキングのカスタマイズの理解。
- AGS バージョン 3.76 以降の環境。
- マッチメイキング X-Ray がチケットを追跡できるようにするには、マッチメイキングルールセットに
"ticket_observability_enable": trueパラメータを追加します。
マッチメイキングプロセスデータの送信
カスタムマッチメイキングでマッチメイキングチケットのデータを X-Ray 機能がスクレイピングできるようにするには、カスタムマッチメイキングアプリがこのエンドポイントを呼び出す必要があります。
POST <baseURL>/sessionhistory/v2/admin/namespaces/<namespace>/xray/tickets
マッチメイキングプロセスデータを送信する際に使用できるアクションはいくつかあります。各アクションは、チケットが開始、キャンセル、または期限切れになった場合の以下のアクション以外は、同じペイロード構造を共有します。これらはすでにデフォルトでセッション履歴に送信されています。
matchFound: このアクションを使用して、マッチングされたチケットのデータを追跡します。matchNotFound: このアクションを使用して、まだキューに残っていて、タイムアウト期間前にまだマッチングされていないチケットのデータを追跡します。flexed: このアクションを使用して、フレックス状態にあるチケットのデータを追跡します。
マッチメイキングプロセス
この図は、マッチメイキングプロセス中に POST <baseURL>/sessionhistory/v2/admin/namespaces/<namespace>/xray/tickets エンドポイントをいつ呼び出すべきかを示しています。

サンプルコード
次の疑似コードは、POST <baseURL>/sessionhistory/v2/admin/namespaces/<namespace>/xray/tickets エンドポイントが呼び出される一般的なシナリオを示しています。
Pseudocode
function MakeMatches():
if isRuleFlexed == "yes":
callEndpoint("Publish ticket observability", "Flexed")
if IsMatched == "yes":
callEndpoint("Publish ticket observability", "matchFound")
else:
callEndpoint("Publish ticket observability", "matchNotFound")
X-Ray は、カスタムマッチメイキングによって送信されたデータのみをスクレイピングして公開します。入力されていないフィールドがある場合、それらは X-Ray に表示されません。
チケットデータを送信するたびに、エンドポイントを呼び出すようにしてください。マッチメイキングプロセスの各イテレーション (「ループ」と呼ばれる) では、flexed および matchNotFound アクションがループごとに 1 回送信されるため、単一のマッチメイキングチケット内でデータを複数回送信できます。
サンプルシナリオ
以下は、5v5 マッチメイキングモードに基づいて X-Ray にイベントを記録するサンプルシナリオです。
マッチメイキングプロセスの開始
プレイヤーがマッチのキューに入り、システムは次のような特定の基準を満たす他のプレイヤーの検索を開始します。
- スキルレベル (ランキングまたは過去のパフォーマンスに基づく)
- 地理的な場所 (低レイテンシを確保するため)
- 優先ロール (例: タンク、サポート、またはダメージ)
新しいプレイヤーがキューに参加すると、システムは複数のマッチメイキングサイクルを実行します。
ルールのフレックス
このシナリオでは、isRuleFlexed が yes に設定されています (isRuleFlexed = "yes")。指定された待機期間 (例: 2 分) の後、正確な基準を満たすプレイヤーが十分にいない場合、システムは待機時間を短縮するために特定のルールをフレックスする可能性があります。例えば:
- スキル範囲の拡大: 狭いスキル範囲にマッチを制限する代わりに、システムはより広い範囲のスキルレベルの参加を許可します。
- リージョンの拡大: システムは地理的制限を緩和し、許容可能なレイテンシを持つ近隣リージョンのプレイヤーが参加できるようにします。
この段階で、X-Ray を使用するカスタムマッチメイキングシステムは、flexed アクションでエンドポイントを呼び出してイベントをログに記録する必要があります。
マッチが見つかった
ルールをフレックスした後、システムは緩和された基準を満たす 5 人のプレイヤーの 2 つのチームを正常にマッチングし、マッチが見つかったシナリオ (isMatched = "yes") になります。この時点で、カスタムマッチメイキングシステムは、matchFound アクションでエンドポイントを呼び出してイベントをログに記録する必要があります。
マッチが見つからなかった
合理的な時間枠内にマッチが見つからない場合 (isMatched = "no")—おそらくプレイヤーの活動が低いか、1 日の異常な時間であるため—カスタムマッチメイキングシステムは、matchNotFound アクションでエンドポイントを呼び出してイベントをログに記録する必要があります。
サンプルリクエストボディテンプレート
{
"action": "matchFound",
"activeAllianceRule": {
"max_number": 2,
"min_number": 2,
"player_max_number": 5,
"player_min_number": 5
},
"activeMatchingRule": [
{
"attribute": "mmr",
"criteria": "distance",
"reference": 100
}
],
"function": "extend",
"gameMode": "5v5",
"isBackfillMatch": true,
"isRuleSetFlexed": true,
"iteration": 7,
"matchID": "d8140d69de02465b934281050dc0d69b",
"namespace": "GameAB",
"partyID": "0cc0cb97804b4ffd9fd8130f6e2622bb",
"remainingPlayersPerTicket": [
0
],
"remainingTickets": 0,
"sessionTickID": "3c29c2df8a0a44ac9a00afa69c14e8f7",
"tickID": 1727664260471,
"timeToMatchSec": 4.71937726,
"timestamp": "2024-07-23T07:07:56.067Z",
"unbackfillReason": "unbackfill_blocked_player_exist",
"unmatchReason": "not_enough_players"
}
この表は、リクエストボディの各パラメータを説明しています。
| フィールド名 | フィールドの説明 | 必須 | 値の形式 | サンプル値 |
|---|---|---|---|---|
timestamp | エンドポイントを呼び出す際のタイムスタンプ | いいえ | Time | 2024-07-23T07:07:56.067Z |
partyID | チケットパーティー ID | いいえ | String | 0cc0cb97804b4ffd9fd8130f6e2622bb |
matchID | マッチの ID。マッチが見つかったときのみ入力されます | いいえ | String | d8140d69de02465b934281050dc0d69b |
Namespace | チケットの現在の名前空間 | いいえ | String | GameAB |
gameMode | チケットの現在のマッチプール | いいえ | String | 5v5 |
activeAllianceRule | 現在のアクティブなアライアンスルールセット | いいえ | JSON | (サンプル値を参照。) |
activeMatchingRule | 現在のアクティブなマッチングルールセット | いいえ | JSON | (サンプル値を参照。) |
function | エンドポイントを呼び出した関数の名前 | いいえ | String | extend |
iteration | マッチが見つかるまでの総イテレーション数 | いいえ | Integer | 7 |
TimeToMatchSec | マッチまでの時間 (秒単位)。マッチが見つかったときのみ入力されます | いいえ | Float64 | 4.71937726 |
unmatchReason | マッチが見つからなかった理由 | いいえ | String | not_enough_players |
remainingTickets | マッチが見つからなかったときの残りチケット数 | いいえ | Integer | 0 |
remainingPlayersPerTicket | マッチが見つからなかったときの残りプレイヤー数 | いいえ | Integer | 0 |
UnbackfillReason | バックフィルできなかった理由 | いいえ | String | unbackfill_blocked_player_exist |
IsBackfillMatch | 新しいマッチとバックフィルマッチを区別するフラグ | いいえ | Boolean | true |
IsRuleSetFlexed | ルールセットがフレックスされている場合のフラグ | いいえ | Boolean | false |
tickID | マッチメイキングチケットのチケット ID | いいえ | Int64 | 1727664260471 |
sessionTickID | マッチ実行時にセッションを区別するためのセッションチケット ID | いいえ | String | 3c29c2df8a0a44ac9a00afa69c14e8f7 |
カスタムマッチメイキングによって送信されたデータは、AGS 管理ポータルの Multiplayer > Diagnostics and Utilities > Matchmaking X-Ray で確認できます。
リクエストボディのすべてのフィールドはオプションですが、それらは X-Ray によってキャプチャされます。他のフィールドは公開またはキャプチャされません。たとえば、マッチングに特定の構成に依存する matchingRules フィールドがある場合、その値を activeAllianceRule に注入する必要があります。
サンプル ActiveAllianceRule 値
[
{
"max_number": 0,
"min_number": 0,
"player_max_number": 0,
"player_min_number": 0
}
]
サンプル ActiveMatchingRule 値
[
{
"attribute": "string",
"criteria": "string",
"reference": 0
}
]