ドキュメント

サポート

Matchmaker

Matchmaker

マッチメイキングルール

Create rules that control how players are matched together based on their custom data and Quality of Service results.
読み終わるまでの所要時間 4 分最終更新 4日前

Rule (ルール) は、論理的な目標追求動作を記述する一般的な方法です。ルールは、マッチメイキングのロジックの異なるレベル - マッチレベルとチームレベル - に適用されます。マッチレベル のルールは、それらが定義されているマッチの妥当性を確保するためのもので、チームレベル のルールは、それらが定義されているチームの妥当性を確保するためのものです。

ルールのフォーマット

{ "Type": "RuleType", "Source": "SourcePath", "Not": true/false, "EnableRule": true/false, "Relaxations": [ { Relaxation1, Relaxation2 } ]}

フィールド

必須

説明

Type (タイプ)はいstring適用するルール。サポートされているルール の表 (下記) を参照してください。
Source (ソース)はいstringデータソースパス。サポートされているデータソース を参照してください。
リファレンスいいえstring、number または array*比較対象となる参照。あらゆるルールで使用されるわけではありません。*有効な参照の型は、ルールのタイプによって異なります。
NotいいえBooleantrue に設定すると、ルールが逆になります。指定しなかった場合は false になります。
EnableRule (ルールを有効にする)いいえBooleanfalse に設定すると、ルールが無効になります。指定しなかった場合は true になります。これは通常、緩和によってルールを無効または有効にするために使用されます。
Relaxations (緩和)いいえList<Relaxations>適用する緩和のリスト。ルールの緩和と発動 に関するセクションを参照してください。

サポートされているルール

ルール

入力

説明

Difference (差)Source:List<number>

Reference:Number
リスト内のすべての値の差が特定の距離内であることを求めるルール。
Equality (等値)Source:List<string または number>

Reference: string または number*
リスト内のすべての値が等しいことを求めるルール。

*参照は、ソースで定義された入力型です。
LessThan (より小さい)Source:Number

Reference:Number
ソース値が参照値よりも小さいことを求めるルール。
LessThanEqual (以下)Source:Number

Reference:Number
ソース値が参照値よりも小さいか、または等しいことを求めるルール。
GreaterThan (より大きい)Source:Number

Reference:Number
ソース値が参照値よりも大きいことを求めるルール。
GreaterThanEqual (以上)Source:Number

Reference:Number
ソース値が参照値よりも大きいか、または等しいことを求めるルール。
InList (リスト内)Source: string または number

Reference:List<string または number>
ソース値が参照リスト内にあることを求めるルール。

*参照は、ソースで定義された入力型です。
Intersection (交差)Source:List<List<string または number>>

Overlap:Number
特定のリストの一覧に、指定されたオーバーラップ数の最小交差が存在することを求めるルール。

サポートされているデータソース

全プレイヤーのデータ

チケット内の各プレイヤーによって定義されたカスタムデータには、
Players.CustomData.{your_custom_field_name}
を使用してルールからアクセスできます。これらのカスタム定義データは、クライアントによってチケットの作成時に追加されます。チケットの作成方法については、チケットの作成 に関するセクションを参照してください。

全プレイヤーの QoS

チケット内の各プレイヤーの QoS (Quality of Service) データには、
Players.QoSResults.Latency
Players.QoSResults.PacketLoss
を使用してルールからアクセスできます。QoS (Quality of Service) を参照してください。

Leaderboards

サーバーが権威を持つマッチメイキングは、Unity Leaderboards とのインテグレーションによりサポートされます。 各プレイヤーのリーダーボードデータには、
Players.CustomData.ExternalData.Leaderboard.Score
Players.CustomData.ExternalData.Leaderboard.Tier
を使用してルールからアクセスできます。このデータソースを選択している場合には、さらに対象のリーダーボードの
Id
が入った
ExternalData
オブジェクトを定義する必要があります。
"ExternalData": { "Leaderboard": { "Id": "my-leaderboard" }}
受信するチケットには、利用可能なリーダーボードデータが自動で追加され、そのデータは、定義されているルールに従って評価されます。定義されているリーダーボードに関連するデータを持っていないプレイヤーは、スコアが 0 の状態でこのリーダーボードに追加されます。 リーダーボードでティアが有効になっていない場合には、リーダーボードがティアを使ったルールに対して互換性がない状態になります。このプールに入ったチケットはいずれも、マッチが失敗します。

Cloud Save

サーバーが権威を持つマッチメイキングは、ほかにも**Unity Cloud Save** とのインテグレーションによりサポートされます。 各プレイヤーの Cloud Save データには、
Players.CustomData.ExternalData.CloudSave.{cloud_save_data_path}
を使用してルールからアクセスできます。
{cloud_save_data_path}
は、ルールで使用される値までのパスをピリオド区切りで示したものです。データパスの最初のセクションは、そのキーの Cloud Save アイテムを取得するためのものです。データパスの残りのセクションは、取得したアイテムを走査するために使用されます。

Cloud Save のキー

Cloud Save アイテム

データパス

取得される値

Skill500Skill500
Maps
["desert", "sea"]
Maps
["desert", "sea"]
Inventory
{ "Apples": 10, "Bottles": 3 }
Inventory.Apples10
Cloud Save データソースを選択している場合、オプションの
ExternalData
オブジェクトを定義して動作を設定できます。
"ExternalData": { "CloudSave": { "AccessClass": "Protected", "Default": 0 }}
アクセスクラス は、プレイヤーデータの取得元を示します。同じキーであっても、アクセスクラスが異なれば違ったアイテムが格納されていることがあります。アクセスクラスが指定されていない場合には、デフォルトの
Protected
が設定されます。
初期値は定義することもできます。この初期値は、指定されたデータパスにある Cloud Save アイテムをプレイヤーが持っていない場合に使用されます。初期値のデータ型は、定義されているルールと互換性のあるものでなければなりません。例えば、Reference のデータ型が Number のみの Equality ルールでは、初期値のデータ型として Number のみが許容されます。これに対して、Reference のデータ型が List<String> のみの InList ルールでは、初期値のデータ型として String のみが許容されます。 受信するチケットには、利用可能な Cloud Save データが自動で追加され、そのデータは、定義されているルールに従って評価されます。定義されている Cloud Save データパスに関連するデータをプレイヤーが持っておらず、初期値の指定もない場合には、チケットがルールの定義に対して互換性がない状態になります。

サポートされているデータ操作

マッチメイキングチケット内のプレイヤーカスタムデータで指定された一部の入力については、それらに対するルールを作成するための操作がサポートされています。

操作

入力

出力

説明

Count (数)List<*>Number指定されたリスト内の要素の数を取得します。*任意の型が有効です (string、bool、list、number など)。
Median (中央値)List<Number>Number指定されたリスト内の数値の中央値を取得します。
Avg (平均)List<Number>Number指定されたリスト内の数値の平均値を取得します。
Sum (合計)List<Number>Number指定されたリスト内の数値の合計値を取得します。
Min (最小)List<Number>Number指定された数値のリストから最小の数値を取得します。
Max (最大)List<Number>Number指定された数値のリストから最大の数値を取得します。

以下に示すのは、Skill フィールドへのアクセスの例です。
{ ..."Source": "Players.CustomData.Skill"... }
以下に示すのは、マッチ/チームのすべてのプレイヤーのスキルの平均を計算する例です。
{ ..."Source": "Players.CustomData.Skill.Avg"... }

サポートされているルールの例

Difference (差)

以下の例では、ルールがどこに配置されているか (マッチレベルかチームレベルか) に応じて、マッチまたはチーム内のすべてのプレイヤーのスキルの差が 200 ポイント以内であることが確認されます。
{ "Type": "Difference", "Source": "Players.CustomData.Skill", "Reference": 200 // Valid types: number}

Equality (等値)

以下の例では、チームレベルのルールによって、Monster チーム のすべてのプレイヤーがこのチームを選択したことが確認されます。
{ "Type": "Equality", "Source": "Players.CustomData.SelectedTeam", "Reference": "Monster" // Valid types: string or number}
以下の例では、マッチレベルのルールによって、マッチ内のすべてのプレイヤーが同じパスワードを使用していることが確認されます。
{ "Type": "Equality", "Source": "Players.CustomData.Password"}
以下の例では、マッチレベルのルールによって、マッチ内のすべてのプレイヤーが 同じスキルブラケット にあることが確認されます。
{ "Type": "Equality", "Source": "Players.Custom.SkillBracket"}

LessThanEqual (以下)

以下の例では、チームレベルのルールによって、各チームに最大 2 人のメディックがいることが確認されます。
{ "Type": "LessThanEqual", "Source": "Players.CustomData.PreferMedic.Count", "Reference": 2 // Valid types: number}

GreaterThanEqual (以上)

以下の例では、マッチングレベルのルールによって、マッチ内のすべてのプレイヤーのスキルが少なくとも 500 であることが確認されます。
{ "Type": "GreaterThanEqual", "Source": "Players.CustomData.Skill", "Reference": 500 // Valid types: number}

InList (リスト内)

以下の例では、チームレベルのルールによって、モンスターキャラクターが選択された場合にプレイヤーが Monster チームに配置されることが確認されます。
{ "Type": "InList", "Source": "Players.CustomData.ChosenCharacter", "Reference": [ "Monster1", "Monster2", "Monster3" ] // Valid types: List<string> or List<number>}

Intersection (交差)

以下の例では、マッチレベルのルールによって、マッチ内のすべてのプレイヤーが好みのマップを少なくとも 3 つ共通で持っていることが確認されます。
{ "Type": "Intersection", "Source": "Players.CustomData.PreferredMaps", "Overlap": 3}
以下の例では、マッチレベルルールによって、マッチ内のすべてのプレイヤーが参照リスト内のアイテムの少なくとも 1 つを持っていることが確認されます。
{ "Type": "Intersection", "Source": "Players.CustomData.Items", "Overlap": 1, "Reference": [ "PluePill", "RedPill" ] // Valid types: List<string> or List<number>}

リーダーボード

以下の例では、チームレベルルールによって、チーム内の各プレイヤーのリーダーボードスコアの差が 300 以内であることが確認されます。
"TeamRules": [ { "Name": "Score", "Type": "Difference", "Source": "Players.CustomData.ExternalData.Leaderboard.Score", "ExternalData": { "Leaderboard": { "Id": "my-leaderboard" } }, "Reference": 300, "Not": false, "EnableRule": true }]
以下の例では、マッチレベルルールによって、マッチ内のすべてのプレイヤーがリーダーボードの同じティアにあることが確認されます。
"MatchRules": [ { "Name": "Tier", "Type": "Equality", "Source": "Players.CustomData.ExternalData.Leaderboard.Tier", "ExternalData": { "Leaderboard": { "Id": "my-leaderboard" } }, "Not": false, "EnableRule": true }]

Cloud Save

以下の例では、チームレベルルールによって、チーム内のすべてのプレイヤーが、ロックが解除されていないマップを少なくとも 1 つ共通で持っていることが確認されます。プレイヤーが Cloud Save 内にキー
Maps
のアイテムを持っていない場合には、マッチメイキングのために
["starter"]
が割り当てられます。この値は、Cloud Save で保存されません。
"TeamRules": [ { "Name": "Unlocked Maps", "Type": "Intersection", "Source": "Players.CustomData.ExternalData.CloudSave.Maps.Unlocked", "ExternalData": { "CloudSave": { "AccessClass": "Protected", "Default": ["starter"] } }, "Not": false, "EnableRule": true, "Overlap": 1 }]