ロールベースのマッチメイキングを設定する
注釈:本資料はAI技術を用いて翻訳されています。
概要
AccelByte Gaming Services(AGS)のマッチメイキングはロールベースのマッチメイキングをサポートしています。ロールベースのマッチメイキングを使用すると、プレイヤーは選択した「ロール」(タンク、ヒーラー、またはダメージディーラー[DPS:Damage Per Second]など)に基づいてマッチングし、ゲームをプレイできます。この記事では、ロールベースのマッチメイキングの設定方法を説明します。
前提条件
- AGS の Lobby、Matchmaking、および Session に精通していること。
- セッションテンプレート、マッチルールセット、および マッチプール を設定済みであること。
- AGS Game SDK をゲームクライアントに統合済みであること。
マッチルールセットの設定
この例では、マルチプレイヤーオンラインバトルアリーナ(MOBA)に似たスタイルのゲームをサポートするマッチルールセットを作成します。ルールセットは、タンク、ヒーラー、DPS の 3 つの利用可能なロールを持つ、競技的な 5 対 5 用に設定されます。理想的なチームは、3 人の DPS、1 人のタンク、1 人のヒーラーで構成されます。プレイヤーはロールの希望を送信でき、マッチメイキングは希望に基づいてロールを割り当てます。ゲームはまた、ルールセットでマッチメイキングレーティング(MMR)統計とプレイヤーのレイテンシも考慮します。以下は例です。
{
"auto_backfill": true,
"alliance": {
"min_number": 2,
"max_number": 2,
"player_min_number": 5,
"player_max_number": 5,
"matching_rule": [
{
"attribute": "mmr",
"criteria": "distance",
"reference": 100
}
],
"combination": {
"has_combination": true,
"alliances": [
[
{
"name": "dps",
"min": 3,
"max": 3
},
{
"name": "tank",
"min": 1,
"max": 1
},
{
"name": "healer",
"min": 1,
"max": 1
}
]
]
}
},
"flexing_rule": [
{
"duration": 20,
"attribute": "mmr",
"criteria": "distance",
"reference": 150
},
{
"duration": 30,
"attribute": "mmr",
"criteria": "distance",
"reference": 200
}
],
"region_expansion_rate_ms": 5000,
"region_expansion_range_ms": 50,
"region_latency_initial_range_ms": 100,
"region_latency_max_ms": 1000
}
ロールベースのマッチメイキングを作成するための combination ルールには、以下のオブジェクトがあります。
has_combination: マッチメイキングが組み合わせを持ち、ロールベースのマッチメイキングを使用することを示します。alliances: マッチメイキングで利用可能なロールと各ロールに必要な数を指定します。name: ロール名を指定します。min: マッチを開始するために必要なロールの最小数を指定します。max: マッチにおけるロールの最大数を指定します。
上記のサンプルマッチルールセットを使用すると、マッチメイキングはキュー内で 6 人の DPS、2 人のタンク、2 人のヒーラーで構成される 10 人のプレイヤーを探し始めます。マッチメイキングは最初にマッチメイキングレーティング(MMR)統計を +/- 100 の MMR 差で考慮し、20 秒後に 150 に拡大し、30 秒後に 200 に拡大します。また、100 ミリ秒(ms)(ping)の範囲から開始し、5 秒ごとに 50 ms ずつ拡大して最大範囲 1000 ms に到達するまでのリージョンレイテンシ拡張ルールも追加する必要があります。
このサンプルロール設定は、マッチメイキング基準(3 人の DPS、1 人のヒーラー、1 人のタンク)に基づいてロールの希望を送信するプレイヤーがマッチメイキングキューに十分にいる場合に機能します。プレイヤーは十分にいるが、キュー内に必要なロールが十分にない場合、マッチメイキングは開始できず、必要なロールが利用可能になるか、マッチメイキングチケットが期限切れになるまで、プレイヤーはマッチを見つけることができません。これを解決するために、ロールフレキシング を追加して、マッチメイキングサービスがルールセット基準を満たすために利用可能なプレイヤーにランダムにロールを割り当ててマッチを開始できるようにすることができます。ロールフレキシング が適用されると、プレイヤーは希望外のロールを取得する可能性があります。このルールセットは次のようになります。
{
"auto_backfill": true,
"alliance": {
"min_number": 2,
"max_number": 2,
"player_min_number": 5,
"player_max_number": 5,
"matching_rule": [
{
"attribute": "mmr",
"criteria": "distance",
"reference": 100
}
],
"combination": {
"role_flexing_enable": true,
"role_flexing_second": 20,
"role_flexing_player": 2,
"has_combination": true,
"alliances": [
[
{
"name": "dps",
"min": 3,
"max": 3
},
{
"name": "tank",
"min": 1,
"max": 1
},
{
"name": "healer",
"min": 1,
"max": 1
}
]
]
}
},
"flexing_rule": [
{
"duration": 20,
"name": "mmr",
"criteria": "distance",
"reference": 150
},
{
"duration": 30,
"name": "mmr",
"criteria": "distance",
"reference": 200
}
],
"region_expansion_rate_ms": 5000,
"region_expansion_range_ms": 50,
"region_latency_initial_range_ms": 100,
"region_latency_max_ms": 1000
}
次に、サンプルルールセットに ロールフレキシング ルールを追加します。
role_flexing_enable: このルールは、利用可能なプレイヤーに対してフレキシングロールを有効にします。一定時間が経過し、キューに利用可能なロールがない場合、マッチメイキングは利用可能なプレイヤーでマッチを開始するために必要なロールをランダムに割り当てます。role_flexing_second: マッチメイキングがキュー内の利用可能なプレイヤーにランダムなロールを割り当てる前に経過する必要がある時間(秒単位)を指定します。role_flexing_player: ランダムなロールを取得するプレイヤーの数を指定します。
改善されたルールセットを使用すると、マッチメイキングサービスは引き続きキュー内で 6 人の DPS、2 人のタンク、2 人のヒーラーで構成される 10 人のプレイヤーを探し始めます。20 秒後、必要なロールが満たされていない場合、マッチメイキングはマッチを開始するために必要な欠けているロールを埋めるために、キュー内の利用可能なプレイヤーにランダムにロールを割り当てます。
ロールフレキシング を使用すると、キュー内の不十分なロールの問題を解決できます。ただし、キュー内にプレイヤーが十分にいない場合は、ルールセットにアライアンスチーム数のフレキシングを追加することで、この問題を解決できます。マッチを開始するために必要なロールの数を減らしたり、各チームの最小プレイヤー数を減らしたりできます。
次に、60 秒後にチームあたり最小 3 人のプレイヤーでマッチを開始できるようにサンプルルールセットを調整します。ロールの組み合わせに関しては、60 秒後に DPS ロールの最小値を 1 に減らします。ルールセットは次のようになります。
{
"auto_backfill": true,
"alliance": {
"min_number": 2,
"max_number": 2,
"player_min_number": 5,
"player_max_number": 5,
"matching_rule": [
{
"attribute": "mmr",
"criteria": "distance",
"reference": 100
}
],
"combination": {
"role_flexing_enable": true,
"role_flexing_second": 20,
"role_flexing_player": 2,
"has_combination": true,
"alliances": [
[
{
"name": "dps",
"min": 3,
"max": 3
},
{
"name": "tank",
"min": 1,
"max": 1
},
{
"name": "healer",
"min": 1,
"max": 1
}
]
]
}
},
"alliance_flexing_rule": [
{
"duration": 60,
"min_number": 2,
"max_number": 2,
"player_min_number": 3,
"player_max_number": 5,
"combination": {
"role_flexing_enable": true,
"role_flexing_second": 20,
"role_flexing_player": 2,
"has_combination": true,
"alliances": [
[
{
"name": "dps",
"min": 1,
"max": 3
},
{
"name": "tank",
"min": 1,
"max": 1
},
{
"name": "healer",
"min": 1,
"max": 1
}
]
]
}
}
],
"flexing_rule": [
{
"duration": 20,
"name": "mmr",
"criteria": "distance",
"reference": 150
},
{
"duration": 30,
"name": "mmr",
"criteria": "distance",
"reference": 200
}
],
"region_expansion_rate_ms": 5000,
"region_expansion_range_ms": 50,
"region_latency_initial_range_ms": 100,
"region_latency_max_ms": 1000
}
アライアンスフレキシングルールを追加した後、60 秒後にキューに十分なプレイヤーがいない場合、各チームに 1 人の DPS、1 人のタンク、1 人のヒーラーを持つ最小 6 人のプレイヤーでマッチを開始できます。また、ルールセットで auto_backfill を true に設定しているため、マッチメイキングはゲームプレイ中にチームの欠けている DPS を埋めるためにさらにプレイヤーを追加できます。
アライアンスフレキシングルール を使用すると、必要に応じて各チームのロール構成を調整できます。たとえば、90 秒後にキューに十分なプレイヤーがいない場合、モードを 4 対 4 に変更し、チーム構成を変更して、チーム内で DPS よりも多くのタンクロールを持つ可能性を開くことができます。
// Sample ruleset is still the same, but shows the alliance flexing rule as an example
...
"alliance_flexing_rule": [
{
"duration": 90,
"min_number": 2,
"max_number": 2,
"player_min_number": 4,
"player_max_number": 4,
"combination": {
"role_flexing_enable": true,
"role_flexing_second": 20,
"role_flexing_player": 2,
"has_combination": true,
"alliances": [
[
{
"name": "dps",
"min": 1,
"max": 2
},
{
"name": "tank",
"min": 1,
"max": 2
},
{
"name": "healer",
"min": 1,
"max": 1
}
]
]
}
}
]
...
ロールの希望を使用したマッチメイキングのリクエスト
AGS ドキュメントでは、マッチメイキングリクエストを「マッチチケット」と呼びます。
プレイヤーは、プレイヤーセッション属性でロールの希望を設定できます。ロールの希望は、マッチチケットを送信する際に ロール属性 がない場合に使用されます。以下は、プレイヤーセッション属性でロールの希望を設定するためのペイロードの例です。
POST /session/v1/public/namespaces/{namespace}/users/me/attributes
{
"roles": [
"dps",
"tank"
]
}
// AccelByte Unreal OSS Sample
// TO FOLLOW
上記の例では、プレイヤーはゲーム内で DPS とタンクのロールを主なロールの希望として設定します。マッチチケットにロール属性がない場合、AGS マッチメイキングはマッチメイキングプロセス中にプレイヤー属性のロールを考慮します。
ロールの希望は、マッチチケットを送信する際にゲームクライアントによって直接設定することもできます。以下は、マッチチケットを送信する際にロールの希望を追加するためのペイロードの例です。
POST /match2/v1/namespaces/{namespace}/match-tickets
{
"matchPool": "matchpool_name",
"attributes": {
"role": {
// The key is using the AGS userId of the player
"69174d0186f34445b681b8a6e928b64b": [
"dps",
"tank"
]
}
},
"latencies": {
"us-west-1": 35,
"us-east-2": 83,
"ap-northeast-1": 139,
"eu-central-1": 158,
"eu-west-1": 165,
"ap-southeast-2": 164,
"sa-east-1": 198,
"ap-southeast-1": 211
},
"sessionId": ""
}
新しい変数(UserIdToRoleMap など)を初期化することで、マッチメイキングプロセスに関与するすべてのユーザーを簡単に定義してマッピングできます。検索ハンドルのクエリ設定で、ユーザーの ID をキーとして、そのロールを値として入力するだけです。
- OSS
- Unity
const FOnlineSubsystemAccelByte* OnlineSubsystem = static_cast<FOnlineSubsystemAccelByte*>(IOnlineSubsystem::Get(ACCELBYTE_SUBSYSTEM));
ensure(OnlineSubsystem != nullptr);
const FOnlineSessionAccelBytePtr SessionInterface = StaticCastSharedPtr<FOnlineSessionV2AccelByte>(OnlineSubsystem->GetSessionInterface());
ensure(SessionInterface != nullptr);
TSharedRef<FOnlineSessionSearch> SearchHandle = MakeShared<FOnlineSessionSearch>();
const FString MatchPoolName = "match_pool_name";
SearchHandle->QuerySettings.Set(SETTING_SESSION_MATCHPOOL, MatchPoolName, EOnlineComparisonOp::Equals);
// Set user role attributes
TMap<FString, TArray<FString>> UserIdToRoleMap{};
UserIdToRoleMap.Add("69174d0186f34445b681b8a6e928b64b", {"dps", "tank"});
for (auto UserId : UserIdToRoleMap)
{
const FName SettingKey = FName(UserId.Key);
const TArray<FString> SettingValue = UserId.Value;
FOnlineSearchSettingsAccelByte::Set(SearchHandle->QuerySettings, SettingKey, SettingValue, EOnlineComparisonOp::Equals);
}
const FOnStartMatchmakingComplete OnStartMatchmakingCompleteDelegate = FOnStartMatchmakingComplete::CreateLambda(
[](FName SessionName, const struct FOnlineError& ErrorDetails, const struct FSessionMatchmakingResults& Results){
// On Start Matchmaking Complete
});
if (!SessionInterface->StartMatchmaking(USER_ID_TO_MATCHMAKING_USER_ARRAY(LocalUserId.ToSharedRef()), NAME_GameSession, FOnlineSessionSettings(), SearchHandle, OnStartMatchmakingCompleteDelegate))
{
// Return false
}
var matchmaking = AccelByteSDK.GetClientRegistry().GetApi().GetMatchmakingV2();
// Get current user ID
string myUserId = AccelByteSDK.GetClientRegistry().GetApi().session.UserId;
string matchPoolName = "match_pool_name";
var optionalParams = new MatchmakingV2CreateTicketRequestOptionalParams
{
attributes = new Dictionary<string, object>()
{
{ myUserId, new string[] {"dps", "tank"} }
},
};
string matchTicketId = "";
matchmaking.CreateMatchmakingTicket(matchPoolName, optionalParams, result =>
{
if (result.IsError)
{
// Do something if CreateMatchmakingTicket fails
Debug.Log($"Error CreateMatchmakingTicket, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if CreateMatchmakingTicket succeeds
});
マッチチケットの ロール属性 では、プレイヤーの userId を使用することが重要です。マッチチケットのロール属性は、プレイヤーセッション属性のロールよりも優先されます。ロールの希望は、マッチチケット属性またはプレイヤーセッション属性のみに設定できます。ただし、両方にロールの希望を設定した場合、マッチチケットのロール属性が使用されます。
サンプルルールセットでマッチメイキングレーティング(MMR)属性が使用されているため、AGS Statistics で MMR を設定することを忘れないでください。詳細については、スキルベースのマッチメイキングを参照してください。