7.5. 基本機能 - ランダムマッチメイク

ランダムマッチメイクについて説明します。

 

参考:

ランダムマッチメイクは、ローカルマッチメイクでは対応していません。

 

セッションの離脱処理については7.8. 基本機能 - セッション離脱を参照してください。

ランダムマッチメイク機能

インターネットマッチメイクではランダムマッチメイク機能を使用できます。ランダムマッチメイク機能を使用すると、指定された条件で検索を行い、条件を満たすセッションが見つかれば参加し、見つからなければ指定された条件のセッションを構築します。

ランダムマッチメイク機能は非同期処理です。JoinRandomSessionAsync() を呼び出すことで非同期処理が開始され、IsJoinRandomSessionCompleted() によって非同期処理の終了を検知できます。ランダムマッチメイクに成功すると GetJoinRandomSessionResult() は IsSuccess() が真となる Result 値を返します。

検索条件は配列で最大 2 つまで指定でき、その場合は先頭にある検索条件から順に検索が行われます。

コード 7-8. ランダムマッチメイク機能の使用
// 作成するセッションの設定
nn::pia::inet::NexCreateSessionSetting createSessionSetting;
createSessionSetting.SetGameMode(SessionGameMode); // ゲームモード
createSessionSetting.SetMaxParticipantNum(MaxEntry); // 最大参加人数
createSessionSetting.SetAttribute(SessionAttributeIndex, SessionAttributeValue); // セッションの属性値
createSessionSetting.SetOpenSession(true); // 作成されてすぐに参加可能状態にします。

// 検索条件の設定
const uint8_t SearchCriteriaListSize = 2; // 検索条件は最大 2 つまで設定可能です。
nn::pia::inet::NexSessionSearchCriteria sessionSearchSettingList[SearchCriteriaListSize];
  
// Attribute 単体指定
sessionSearchSettingList[0].SetGameMode(SessionGameMode); // ゲームモードの値
sessionSearchSettingList[0].SetMaxParticipantNum(MaxEntry); // 最大参加人数
sessionSearchSettingList[0].SetAttribute(SessionAttributeIndex, SessionAttributeValue); // セッションの属性値

// Attribute 複数指定 (最初の条件より緩和した条件)
sessionSearchSettingList[1].SetGameMode(SessionGameMode); // ゲームモードの値
sessionSearchSettingList[1].SetMaxParticipantNumRange(MaxEntry, MaxEntry); // 最大参加人数
const uint32_t AttributeArraySize = 5;
uint32_t attributeArray[AttributeArraySize] = {2, 4, 6, 11, 72};
sessionSearchSettingList[1].SetAttribute(SessionAttributeIndex, attributeArray, AttributeArraySize); // マッチメイクの属性値の範囲指定

// ランダムマッチメイクの設定
nn::pia::inet:NexJoinRandomSessionSetting joinRandomSessionSetting;
joinRandomSessionSetting.SetCreateSessionSetting(&createSessionSetting); // ランダムマッチメイクで作成するセッションの設定
joinRandomSessionSetting.SetSessionSearchCriteria(sessionSearchCriteriaList, SearchCriteriaListSize); // ランダムマッチメイクで検索するセッションの条件
joinRandomSessionSetting.SetBlockListOption(true, true); // ブロックリストの設定

// ランダムマッチメイク機能の非同期処理開始
nn::pia::Result result = nn::pia::session::Session::GetInstance()->JoinRandomSessionAsync(&joinRandomSessionSetting);
if (result.IsFailure())
{
    // エラー処理
}

// 非同期処理の開始に成功した場合、ディスパッチ関数を定期的に呼び出して非同期処理の進行を待つ必要があります
while (nn::pia::session::Session::GetInstance()->IsJoinRandomSessionCompleted() == false)
{
    nn::pia::common::Scheduler::GetInstance()->Dispatch();
    // サーバーとのキープアライブ通信などのために NEX の Scheduler::Dispatch を呼ぶ必要があります
    nn::nex::Scheduler::GetInstance()->DispatchAll();
}

// 非同期処理の結果確認
result = nn::pia::session::Session::GetInstance()->GetJoinRandomSessionResult();
if (result.IsFailure())
{
    // エラー処理
}

// 非同期処理に成功した場合、セッションを作成しているか、セッションに参加しています。

レンジ拡大形式+マッチメイク優先度によるセッション選択方法のマッチメイク

インターネットマッチメイクでは、NEX のオートマッチメイク機能で提供されているレンジ拡大形式+ゲーム進行度によるセッション選択方法のマッチメイクを利用できます。レンジ拡大形式+ゲーム進行度のマッチメイクについての詳細は「NEX プログラミングマニュアル」 - 「サーバーサービス」 - 「マッチメイク」 - 「マッチメイクセッションの選び方」を参照してください。

Pia ではわかりやすさのため、ゲーム進行度をマッチメイク優先度と呼称しています。

レンジ拡大形式+マッチメイク優先度のマッチメイクを利用する場合は、セッションの検索条件の設定でセッションの選択方法に inet::SelectionMethod_BroadenRangeWithSelectionPriority を設定する他に、次の対応が必要になります。

  • セッションの作成条件、検索条件を設定する際にマッチメイクの属性値のインデックス inet::SessionBroadenRangeAttributeIndex へレーティング値などのパラメータ設定
  • ゲームの進行に合わせて Session::UpdateSelectionPriority() によるマッチメイク優先度の更新

レンジ拡大形式で条件の合うセッションが複数ある場合に、マッチメイク優先度の高いセッションへマッチメイクします。

どちらかを設定しないことによって、レンジ拡大形式のみ、マッチメイク優先度のみのいずれかの選択方法でのマッチメイクも可能です。

コード 7-9. レンジ拡大形式+マッチメイク優先度によるセッション選択方法のマッチメイクの使用
// 作成するセッションの設定
nn::pia::inet::NexCreateSessionSetting createSessionSetting;
createSessionSetting.SetAttribute(nn::pia::inet::SessionBroadenRangeAttributeIndex, InitialRatingValue); // レーティング値の設定
createSessionSetting.SetSelectionPriority(InitialSelectionPriority); // マッチメイク優先度の初期設定

// 検索条件の設定
nn::pia::inet::NexSessionSearchCriteria sessionSearchSetting;
sessionSearchSetting.SetAttribute(nn::pia::inet::SessionBroadenRangeAttributeIndex, InitialRatingValue); // レーティング値の設定
sessionSearchSetting.SetRandomSessionSelectionMethod(nn::pia::inet::SelectionMethod_BroadenRangeWithSelectionPriority); // レンジ拡大形式+マッチメイク優先度によるセッション選択方法を設定

// ランダムマッチメイクの設定
nn::pia::inet:NexJoinRandomSessionSetting joinRandomSessionSetting;
joinRandomSessionSetting.SetCreateSessionSetting(&createSessionSetting);
joinRandomSessionSetting.SetSessionSearchCriteria(&sessionSearchSetting, 1);

// ゲーム中
// マッチメイク優先度の更新を行う前に UpdateSelectionPriority() を呼び出して問題ないかを確認する必要があります。
if (nn::pia::session::Session::GetInstance()->IsUpdatableSelectionPriority(temporaryPriority))
{
    nn::pia::session::Session::GetInstance()->UpdateSelectionPriority(temporaryPriority);
}

スコア付けによるセッション選択方法のマッチメイク

次のパラメータについて、検索条件に合致するセッションのものと自身のものを比較してスコア換算し、そのスコアが一番高いセッションを選択します。

  • レーティング値の差
  • 切断率の差
  • 違反率の差
  • インターネット経路を考慮した距離
  • 国コードの一致
  • 距離情報が無いときの国コードの一致
  • マッチメイクセッションのマッチメイク優先度
  • マッチメイクセッションの存続時間(WebAPI でのみ設定可能)

パラメータのスコア換算の設定方法については、「NEX プログラミングマニュアル」 - 「サーバーサービス」 - 「WebAPI」 - 「マッチメイクセッション」 - 「スコア付けによるオートマッチメイク機能向け API」を参照してください。

これらのパラメータ(存続時間を除く)をセッションの作成条件、及び検索条件に設定した上で、検索条件のセッションの選択方法に nn::pia::inet::SelectionMethod_ScoreBased を設定する必要があります。

また、サーバに対してスコアの換算方法は複数設定できるため、スコア換算の設定時に指定した設定番号を検索条件に指定する必要があります。

nn::pia::inet::NexCreateSessionSetting createSessionSetting;
nn::pia::inet::NexSessionSearchCriteria sessionSearchCriteriaList[2];

// 下記はマッチメイクに設定される値
createSessionSetting.SetRatingValue(rating); // レーティング値
createSessionSetting.SetDisconnectionRate(disconnectionRate); // 切断率
createSessionSetting.SetViolationRate(violationRate); // 違反率
createSessionSetting.SetUseGeoIp(true); // インターネット経路を考慮した距離
createSessionSetting.SetCountryCode(cfgCountryCode); // 国コード

// デバッグ目的で IP アドレスを指定することができます
nn::pia::common::InetAddress geoIpAddressForCreateSession = GEO_IP_LIST[geoIpIndexForCreateSession];
createSessionSetting.SetOverrideIpAddress(geoIpAddressForCreateSession);

// 検索の際に比較に用いる値
sessionSearchCriteriaList[0].SetRandomSessionSelectionMethod(nn::pia::inet::SelectionMethod_ScoreBased); // スコア付けによるセッション選択方法を設定
sessionSearchCriteriaList[0].SetScoreSettingIndex(1); // 使用するスコア換算設定のインデックス
sessionSearchCriteriaList[0].SetRatingValue(rating); // レーティング値
sessionSearchCriteriaList[0].SetDisconnectionRate(disconnectionRate); // 切断率
sessionSearchCriteriaList[0].SetViolationRate(violationRate); // 違反率
sessionSearchCriteriaList[0].UseGeoIp(true); // インターネット経路を考慮した距離
sessionSearchCriteriaList[0].SetCountryCode(cfgCountryCode); // 国コード
// デバッグ目的で IP アドレスを指定することができます
nn::pia::common::InetAddress geoIpAddressForSearchCriteria = GEO_IP_LIST[geoIpIndexForSearchCriteria];
sessionSearchCriteriaList[0].SetOverrideIpAddress(geoIpAddressForSearchCriteria);

sessionSearchCriteriaList[1].SetRandomSessionSelectionMethod(nn::pia::inet::SelectionMethod_ScoreBased);
sessionSearchCriteriaList[1].SetScoreSettingIndex(2); // 別のスコア換算設定のインデックスも指定可能
// 以下、同様な設定のため省略

// ランダムマッチメイクの設定
nn::pia::inet:NexJoinRandomSessionSetting joinRandomSessionSetting;
joinRandomSessionSetting.SetCreateSessionSetting(&createSessionSetting);
joinRandomSessionSetting.SetSessionSearchCriteria(sessionSearchCriteriaList, 2);

// 上記の設定でランダムマッチメイク
result = nn::pia::session::Session::GetInstance()->JoinRandomSessionAsync(&joinRandomSessionSetting);