概要
キューとルールのシステムは、多数のシナリオを柔軟に処理できます。 以下は、より一般的なマッチメイキングのユースケースと関連するキューの例です。 PlayFab API を使用して、これらの各構成を直接送信できます。 これらのオプションは、ゲーム マネージャー UI を使用して設定することもできます。
[最初のキュー] または [クイック マッチ]
すべてのタイトルは、この単純なキューから始めて、基本的な流れを解決する必要があります。 このキューは 2 人のプレイヤーを一緒に照合します。また、マッチを行うためにプレイヤーが同じビルド文字列を渡すことを要求する 1 つのオプション ルールが含まれています。 ビルドを指定しない場合、プレイヤーは、ビルドに関係なく、このキュー内の他のプレイヤーとマッチできます。
"MatchmakingQueue": {
"Name": "MyFirstQueue",
"MinMatchSize": 2,
"MaxMatchSize": 2,
"ServerAllocationEnabled": false,
"Rules": [
{
"Type": "StringEqualityRule",
"Attribute": {
"Path": "Build",
"Source": "User"
},
"AttributeNotSpecifiedBehavior": "MatchAny",
"Weight": 1,
"Name": "BuildVersionRule"
}
]
}
複数のゲーム モード
タイトルには、ゲームをプレイするためのさまざまな方法があります。 これらのプレイヤーが互いにマッチしてはいけない場合、別々のキューに入れることでパフォーマンスが最適化されます。
{
"MatchmakingQueue": {
"Name": "FreeForAllQueue",
"MinMatchSize": 4,
"MaxMatchSize": 4,
"ServerAllocationEnabled": false,
"Rules": [
]
}
}
{
"MatchmakingQueue": {
"Name": "CaptureTheFlagQueue",
"MinMatchSize": 4,
"MaxMatchSize": 4,
"ServerAllocationEnabled": false,
"Rules": [
]
}
}
クロス ゲーム モードの検索
プレイヤーがゲームモード間で他のプレイヤーとマッチすることを目的としている場合は、単一のキューを使用して、交差設定ルールを作成します。 プレイヤーは複数のゲーム モードを指定でき、ルールにより、すべてのプレイヤーに少なくとも 1つ の共通のゲーム モードが含まれるものにマッチが制限されます。
注意
この機能が正しく動作するには、プレイに必要なプレイヤーの数がモード間で同じでなければなりません。
{
"MatchmakingQueue": {
"Name": "MultiGameModeSearchQueue",
"MinMatchSize": 4,
"MaxMatchSize": 4,
"ServerAllocationEnabled": false,
"Rules": [
{
"Type": "SetIntersectionRule",
"MinIntersectionSize": 1,
"Attribute": {
"Path": "GameMode",
"Source": "User"
},
"AttributeNotSpecifiedBehavior": "MatchAny",
"Weight": 1,
"Name": "GameModeRule"
}
]
}
}
スキルベースの自由参加型のゲーム、拡張機能あり
一般的なシナリオでは、スキルに基づいてプレイヤー同士をマッチさせます。 この例では、キューはプレイヤーのスキル属性が 0.2 以内であることを要求し、これらの属性は時間の経過とともに 0.5 まで増加します。 30 秒以上待つチケットの場合、スキルの差は許可されます。
この例の値は、利用可能なスキルの範囲が 0 から 1 の間であることを想定しています。 プレイヤーのスキルを追跡するためにタイトルで使用する値の範囲、およびマッチのスピードよりもスキルにどれだけ重点を置くかに合わせて、これらの値を調整します。
さらに、30 秒でオプションになるルールは、まったくプレイしないよりも、アンバランスなスキルを使用してゲームをプレイする方が良いゲームを対象としています。 アンバランスなゲームが全体的に負のエクスペリエンスであるゲームの場合、SecondsUntilOptional を調整します。 完全に削除すると、ルールは無期限にアクティブのままになります。
"MatchmakingQueue": {
"Name": "SkillBasedFreeForAllQueue",
"MinMatchSize": 4,
"MaxMatchSize": 4,
"ServerAllocationEnabled": false,
"Rules": [
{
"Type": "DifferenceRule",
"Difference": 0.2,
"MergeFunction": "Average",
"DefaultAttributeValue": 0.5,
"Expansion": {
"Delta": 0.1,
"Limit": 0.5,
"Type": "Linear",
"SecondsBetweenExpansions": 5
},
"Attribute": {
"Path": "Skill",
"Source": "User"
},
"AttributeNotSpecifiedBehavior": "UseDefault",
"Weight": 1,
"Name": "SkillRule",
"SecondsUntilOptional": 30
}
]
}
拡張のカスタマイズ
各時間間隔で任意の値を使用するように拡張機能をカスタマイズできます。 たとえば、許可されたスキルを開始時はゆっくり成長させ、時間の経過とともにスキルをより急速に成長させたい場合があります。
"MatchmakingQueue": {
"Name": "SkillBasedFreeForAllCustomExpansionQueue",
"MinMatchSize": 4,
"MaxMatchSize": 4,
"ServerAllocationEnabled": false,
"Rules": [
{
"Type": "DifferenceRule",
"Difference": 0.2,
"MergeFunction": "Average",
"DefaultAttributeValue": 0.5,
"Expansion": {
"DifferenceOverrides": [
0.025,
0.05,
0.1,
0.2,
0.3,
0.5
],
"Type": "Custom",
"SecondsBetweenExpansions": 5
},
"Attribute": {
"Path": "Skill",
"Source": "User"
},
"AttributeNotSpecifiedBehavior": "UseDefault",
"Weight": 1,
"Name": "SkillRule",
"SecondsUntilOptional": 30
}
]
}
時間の経過によるプレイヤーの数の拡張
一部のタイトルでは、最初はフル マッチを希望しますが、時間が経過するにつれてプレイヤーが少なくなるほど満足できる場合があります。 このような例の 1 つは、最大 50 人のプレイヤーで開始するが、マッチメイキングのタイムアウト後はより少ないプレイヤー数で続行できるよう設計されているバトル ロワイヤル スタイルのゲームです。
MinMatchSize と MaxMatchSize には展開が含まれていないため、MatchTotalRule を使用して、マッチに必要なプレイヤーの数を変更できます。 各プレイヤーは、関連付けられた属性を 1 に設定します。 このルールでは、これらの値を合計して、マッチに必要なプレイヤー数を動的に適用します。
注意
MaxOverrides または MinOverrides 配列を指定しない場合は、ルールの元の Max または Min の値が代わりに使用されます。
"MatchmakingQueue": {
"Name": "PlayerExpansionOverTime",
"MinMatchSize": 8,
"MaxMatchSize": 50,
"ServerAllocationEnabled": false,
"Rules": [
{
"Type": "MatchTotalRule",
"Attribute": {
"Path": "PlayerCount",
"Source": "User"
},
"Min": 8,
"Max": 50,
"Weight": 1,
"Expansion": {
"MinOverrides": [
50,
45,
40,
35,
25,
16,
8
],
"Type": "Custom",
"SecondsBetweenExpansions": 10
},
"Name": "PlayersRequiredRule",
"SecondsUntilOptional": 60
}
],
}
標準的な 4v4 スタイルのスキル ベース
PlayFab マッチメイキングはチーム指向のマッチをサポートします。 チームを指定すると、同じチケットで一緒に送信するプレイヤーがすべて 1 つのチームに割り当てられ、これらのプレイヤーが互いにプレイするよう強制されることはありません。
PlayFab Matchmaking は、チームのバランスを保つためにさまざまなチーム ルールに対応しています。 この例は、4 対 4 のマッチを対象としており、スキルがチーム間でバランスが取られるよう徹底しています。
"MatchmakingQueue": {
"Name": "Standard4v4TeamsQueue",
"MinMatchSize": 8,
"MaxMatchSize": 8,
"ServerAllocationEnabled": false,
"Teams": [
{
"Name": "Red",
"MinTeamSize": 4,
"MaxTeamSize": 4
},
{
"Name": "Blue",
"MinTeamSize": 4,
"MaxTeamSize": 4
}
],
"Rules": [
{
"Type": "TeamDifferenceRule",
"Attribute": {
"Path": "Skill",
"Source": "User"
},
"Difference": 0.2,
"DefaultAttributeValue": 0.5,
"Expansion": {
"Delta": 0.1,
"Limit": 0.5,
"Type": "Linear",
"SecondsBetweenExpansions": 5
},
"Name": "TeamSkillRule",
"SecondsUntilOptional": 30
}
]
}
マルチプレイヤー サーバー
キューは自動的に PlayFab のマルチプレイヤー サーバー機能に提供され、サーバーを割り当て、マッチしたプレイヤーのリストを提供します。 このキューは設定の最小の例を提供しています。この場合、ServerAllocationEnabledフラグは、起動するサーバーのビルドを示すBuildIdとともに提供されます。
ServerAllocationEnabled フラグを true に設定する場合は、マッチごとにサーバーを割り当てる必要がある場所を示す RegionSelectionRule も含める必要があります。
"MatchmakingQueue": {
"Name": "MultiplayerServersQueue",
"MinMatchSize": 24,
"MaxMatchSize": 24,
"ServerAllocationEnabled": true,
"BuildId": "6a4d2760-4295-417e-b149-0a12e3570d94",
"Rules": [
{
"Type": "RegionSelectionRule",
"MaxLatency": 200,
"Path": "Latency",
"Weight": 1,
"Name": "RegionSelectionRule"
}
]
}
大規模なチーム バトル (12 対 12)
大規模なチーム ゲームには、追加の要件がある場合があります。 この例では、キューはマルチプレイヤー サーバーを作成するように構成されています。多くのプレイヤーでのゲームを管理するためには、多くの場合、マルチプレイヤー サーバーが必要とされます。 この構成は、前の例と似ています。
スキルに加えて、チームの類似性を促進するために、別のチーム ルールを追加します。 各チームで許可される大規模なチームは 1 つのみです。これにより、事前に作成されたチームがランダムなプレイヤーの大規模なセットとマッチする一般的な状況を回避します。
"MatchmakingQueue": {
"Name": "LargeTeamsQueue",
"MinMatchSize": 24,
"MaxMatchSize": 24,
"ServerAllocationEnabled": true,
"BuildId": "6a4d2760-4295-417e-b149-0a12e3570d94",
"Teams": [
{
"Name": "Red",
"MinTeamSize": 12,
"MaxTeamSize": 12
},
{
"Name": "Blue",
"MinTeamSize": 12,
"MaxTeamSize": 12
}
],
"Rules": [
{
"Type": "TeamTicketSizeSimilarityRule",
"Name": "PreventLargePremadeVersusRandomsRule",
"SecondsUntilOptional": 20
},
{
"Type": "TeamDifferenceRule",
"Attribute": {
"Path": "Skill",
"Source": "User"
},
"Difference": 0.1,
"DefaultAttributeValue": 0.5,
"Expansion": {
"Delta": 0.1,
"Limit": 0.5,
"Type": "Linear",
"SecondsBetweenExpansions": 5
},
"Name": "TeamSkillRule",
"SecondsUntilOptional": 30
},
{
"Type": "RegionSelectionRule",
"MaxLatency": 200,
"Path": "Latency",
"Weight": 1,
"Name": "RegionSelectionRule"
}
]
}
バトル ロワイヤル スタイルのゲーム
バトル ロワイヤル スタイルのゲームでは、多くのプレイヤーがアリーナに配置されます。 この例では、ゲームは 4 つのチームで設定されています。 現時点では、このようなチーム シナリオで許可されるプレイヤーは 32 人に制限されています。 この制限は今後改善される予定です。
この例には、専用サーバー用のマルチプレイヤー サーバー設定情報も含まれています。このサーバーは、多数のプレイヤーがいるゲームには必要とされる場合が、よくあります。 この構成は、前の例と似ています。
"MatchmakingQueue": {
"Name": "BattleRoyaleStyleQueueWithTeams",
"MinMatchSize": 32,
"MaxMatchSize": 32,
"ServerAllocationEnabled": true,
"BuildId": "6a4d2760-4295-417e-b149-0a12e3570d94",
"Teams": [
{
"Name": "team1",
"MinTeamSize": 4,
"MaxTeamSize": 4
},
{
"Name": "team2",
"MinTeamSize": 4,
"MaxTeamSize": 4
},
{
"Name": "team3",
"MinTeamSize": 4,
"MaxTeamSize": 4
},
{
"Name": "team4",
"MinTeamSize": 4,
"MaxTeamSize": 4
},
{
"Name": "team5",
"MinTeamSize": 4,
"MaxTeamSize": 4
},
{
"Name": "team6",
"MinTeamSize": 4,
"MaxTeamSize": 4
},
{
"Name": "team7",
"MinTeamSize": 4,
"MaxTeamSize": 4
},
{
"Name": "team8",
"MinTeamSize": 4,
"MaxTeamSize": 4
}
],
"Rules": [
{
"Type": "RegionSelectionRule",
"MaxLatency": 200,
"Path": "Latency",
"Weight": 1,
"Name": "RegionSelectionRule"
}
]
}
非対称のクロスプレイのユーザー設定の処理
プレイヤーは異なるクロスプレイ設定を選択できるため、マッチメイキングのユーザー設定は非対称です。 クロスプレイを有効にするプレイヤーは、任意のプラットフォームで積極的にマッチします。一方、クロスプレイを無効にするプレイヤーは、自分のプラットフォーム上のプレイヤーとのみマッチすることを希望します。
文字列の等価性ルールまたは交差設定ルールを使用して、この種類の非対称性を処理できるマッチメイキング キューを実装できます。 この特定の例では、文字列の等価性を使用しています。
プレイヤーがクロスプレイを無効にした場合、クライアントは DeviceType ("xbox"、"playstation" など) を指定し、ルールにより、これらを同じプラットフォームのマッチに制限します。 プレイヤーがクロスプレイを有効にした場合、クライアントは DeviceType 属性を完全に省略し、MatchAny の AttributeNotSpecifiedBehavior により、これらが任意のプラットフォームとマッチすることを許可します。
注意
プレイヤーのグループがチケットを一緒に送信すると、このサービスにより、このグループは 1 つの単位として扱われます。マッチやチーム間でグループが分割されることはありません。 ゲーム クライアントは、チケットの送信前にグループ構成を検証する必要があります。 たとえば、プレイヤーがクロスプレイを無効にした場合、チケットが作成される前にプレイヤーがクロスプラットフォーム グループに参加できないようにします。
マッチメイキング時間が予想よりも長い場合は、クロスプレイをサポートするために必要に応じてクロスプラットフォーム キューを使用して、プラットフォームごとに個別のキューを作成することを検討してください。
"MatchmakingQueue": {
"Name": "CrossDeviceQueue",
"MinMatchSize": 32,
"MaxMatchSize": 32,
"ServerAllocationEnabled": false,
"BuildId": "6a4d2760-4295-417e-b149-0a12e3570d94",
"Rules": [
{
"Type": "StringEqualityRule",
"Attribute": {
"Path": "DeviceType",
"Source": "User"
},
"AttributeNotSpecifiedBehavior": "MatchAny",
"Weight": 1,
"Name": "CrossDeviceRule"
}
]
}
ホスト/検索者または役割ベースの要件
PlayFab マッチは、チケットベースのマッチング システムを使用しています。この場合、ゲーム ホストが事前に選択されることはありません。 ただし、MatchTotalRuleを使用してホスト検索システムをエミュレートし、マッチで許可されるホスト数を制限することができます。
この場合、チケットがホストである場合、1 を指定することで、チケットを事前に指定できます。 各マッチには、必ず 1 つのホストを含める必要があります。
注意
ホストの数が検索者を大幅に上回る場合 (またはその逆の場合)、この不均衡が原因で、すべてのプレイヤーのマッチメイキング時間が遅くなる可能性があります。 マッチメイキングの設計の影響を考慮して、マッチメイキング ルールとマッチに必要な平均時間を満たすのに十分なプレイヤーが特定のサブデータに存在することを確認します。
"MatchmakingQueue": {
"Name": "HostSearcherQueue",
"MinMatchSize": 8,
"MaxMatchSize": 8,
"ServerAllocationEnabled": false,
"BuildId": "6a4d2760-4295-417e-b149-0a12e3570d94",
"Rules": [
{
"Type": "MatchTotalRule",
"Attribute": {
"Path": "IsHost",
"Source": "User"
},
"Min": 1,
"Max": 1,
"Weight": 1,
"Name": "OneHostRule"
}
]
}
ゲームにはロール要件がある場合があります。 たとえば、あるゲームでは、ドラマー 1 人、ギタリスト 2 人、ボーカル 1 人が必要な場合があります。 または、戦車 1 台、1 秒あたりの損傷 (DPS) 2、サポート 1 つです。 ゲームでは、これらのロールを要求するために MatchTotalRule を使用する場合があります。
"MatchmakingQueue": {
"Name": "RoleBasedQueue",
"MinMatchSize": 4,
"MaxMatchSize": 4,
"ServerAllocationEnabled": false,
"BuildId": "6a4d2760-4295-417e-b149-0a12e3570d94",
"Rules": [
{
"Type": "MatchTotalRule",
"Attribute": {
"Path": "TankSelected",
"Source": "User"
},
"Min": 1,
"Max": 1,
"Weight": 1,
"Name": "TankRule"
},
{
"Type": "MatchTotalRule",
"Attribute": {
"Path": "DPSSelected",
"Source": "User"
},
"Min": 2,
"Max": 2,
"Weight": 1,
"Name": "DPSRule"
},
{
"Type": "MatchTotalRule",
"Attribute": {
"Path": "SupportSelected",
"Source": "User"
},
"Min": 1,
"Max": 1,
"Weight": 1,
"Name": "SupportRule"
}
]
}
さまざまな重要度を持つルール
ルールは、どのチケットが別のチケットとのマッチに適格であるかを制限すること、および、チケットが選択される順序を選択することによって、マッチメイキングを可能にします。 複数のルールが存在する場合、システムはすべての制限を考慮します。 ただし、タイトルでは、残りの対象チケットよりもルールの基本設定が優先される場合があります。
以下の例では、プレイヤーはスキル レベルと経験レベルが特定の範囲内である必要があります。 ただし、多数のチケットが指定されたスキルと経験の境界内に収まる場合、このキューでは、経験レベルが近いものよりもスキル レベルが近いものが優先されます。
制限を満たすチケットを評価する場合、スキルの違いは経験の違いより 3 倍大きく計算されます。
"MatchmakingQueue": {
"Name": "WeightingQueue",
"MinMatchSize": 4,
"MaxMatchSize": 4,
"ServerAllocationEnabled": false,
"BuildId": "6a4d2760-4295-417e-b149-0a12e3570d94",
"Rules": [
{
"Type": "DifferenceRule",
"Difference": 1,
"MergeFunction": "Average",
"Attribute": {
"Path": "skill",
"Source": "User"
},
"AttributeNotSpecifiedBehavior": "MatchAny",
"Weight": 3,
"Name": "SkillRule"
},
{
"Type": "DifferenceRule",
"Difference": 5,
"MergeFunction": "Average",
"Attribute": {
"Path": "experience",
"Source": "User"
},
"AttributeNotSpecifiedBehavior": "MatchAny",
"Weight": 1,
"Name": "ExperienceRule"
}
]
}
DLC パック
さまざまな DLC パックを使用することで、プレイヤーは、SetIntersectionRule を使用して DLC が一致する他のプレイヤーのみを見つけることを選択できます。 各プレイヤーは自分が所有する DLC パックを渡します。マッチには少なくとも 1 つの DLC パックを共有するグループが必要です。
注意
30 秒後、ルールはオプションになるため、プレイヤーは DLC を共有せずにマッチできます。
"MatchmakingQueue": {
"Name": "DlcQueue",
"MinMatchSize": 4,
"MaxMatchSize": 4,
"ServerAllocationEnabled": false,
"BuildId": "6a4d2760-4295-417e-b149-0a12e3570d94",
"Rules": [
{
"Type": "SetIntersectionRule",
"MinIntersectionSize": 1,
"Attribute": {
"Path": "DlcPacks",
"Source": "User"
},
"AttributeNotSpecifiedBehavior": "MatchAny",
"Weight": 1,
"Name": "DlcRule",
"SecondsUntilOptional": 30
}
]
}
統計を有効にする
統計を有効にすると、タイトルではキューに関する情報を表示できます。 この情報は、プレイヤーがプレイしたいゲーム モードを選択する場合にプレイヤーの期待を設定するのに役立ちます。
逆に、タイトルでは、ビジネス インテリジェンスを目的とする場合、またはトラフィックの多いキューにプレイヤーを誘導することを避けるために、この情報を隠したい場合があります。
このキューでは、キューに存在するプレイヤーの数を表示する機能とチケットのマッチにかかる推定時間を表示する機能の両方を有効にすることができます。
注意
サーバーは常にこの情報を取得できます。 次の構成では、ユーザーがこの呼び出しを行うことも許可されるかどうかのみを制御します。
"MatchmakingQueue": {
"Name": "StatisticsEnabledQueue",
"MinMatchSize": 8,
"MaxMatchSize": 8,
"ServerAllocationEnabled": false,
"Rules": [],
"StatisticsVisibilityToPlayers": {
"ShowNumberOfPlayersMatching": true,
"ShowTimeToMatch": true
}
}