ホストとしてマッチメイキングを開始する方法

MatchMaker クライアントのクラスを使うことで、マッチメイキングをホスト(検索を待ち受ける)として開始することが可能です。

マッチメイキングのホストになると他のユーザーからのマッチング検索の対象になり、マッチして新しいユーザーが参加するとホストに通知が送られるなど、さまざまな機能を使うことができるようになります。

ホストのユーザーに限らず、マッチングしたユーザーどうしで自由にメッセージを送信し合うことが可能です。

ホストとしてできること

ホストは、以下の機能を使用できます。

  • マッチメイキングの解散。任意にマッチメイキングを解散させて、マッチしたメンバーに解散を通知することが可能です。
  • マッチメイキングを検索対象からの除外。任意にマッチメイキングを解散せず、他のユーザーから検索に引っかからないようにすることが可能です。
  • マッチしたメンバーにメッセージ送信。マッチしたユーザーと、任意のメッセージを送受信することが可能です。
  • マッチングの完了。マッチング完了を通知することが可能です。
  • 特定ユーザーの追放。マッチした特定のユーザーを追い出すことが可能です。
  • P2P を使った通信を開始するために、クライアントのアドレスを同期することが可能です。

マッチメイキングをホストする

MatchMaker クラスを初期化

#define REG_EVENT(__EVENT__, __LAMBDA__) this->eventUnsubscriptions.push_back(__EVENT__->Register(__LAMBDA__))

void DiarkisMatchMakerBase::SetupUdpMatchMaker(std::shared_ptr<IDiarkisUdp> udp_, std::shared_ptr<LoggerFactory> loggerFactory)
{
mm = shared_ptr<IDiarkisMatchMaker>(DiarkisCreateMatchMaker());
mm->SetupAsUdp(udp_))

// クライアントライブラリで使用するロガーをセットする
mm->SetLoggerFactory(loggerFactory, "-UDP");

REG_EVENT(mm->GetHostEvent(), [this](void*, const DiarkisMMHostEventArgs& e) { OnHostMatchmaking(e); });
REG_EVENT(mm->GetAbortEvent(), [this](void*, const DiarkisMMResponseEventArgs& e) { OnAbortMatchmaking(e);});
REG_EVENT(mm->GetDisbandEvent(), [this](void*, const DiarkisMMSyncEventArgs& e) { OnDisbandMatchmaking(e);});
REG_EVENT(mm->GetMemberLeaveEvent(), [this](void*, const DiarkisMMSyncEventArgs& e) { OnMemberLeave(e); });
REG_EVENT(mm->GetMemberJoinEvent(), [this](void*, const DiarkisMMSyncEventArgs& e) { OnMemberJoin(e); });
REG_EVENT(mm->GetMemberSyncEvent(), [this](void*, const DiarkisMMSyncEventArgs& e) { OnMemberSync(e); });
  REG_EVENT(mm->GetJoinEvent(), [this](void*, const DiarkisMMJoinResponseEventArgs& e) { OnJoin(e); });
  REG_EVENT(mm->GetLeaveEvent(), [this](void*, const DiarkisMMResponseEventArgs& e) { OnLeave(e); });

  REG_EVENT(mm->GetCompleteEvent(), [this](void*, void*) { OnComplete(); });
REG_EVENT(mm->GetSearchEvent(), [this](void*, const DiarkisMMJoinResponseEventArgs& e) { OnSearch(e); });

 REG_EVENT(mm->GetResultsEvent(), [this](void*, const DiarkisMMResultEventArgs& e) { OnResutls(e); });
 REG_EVENT(mm->GetP2PAddressEvent(), [this](void*, const DiarkisMMP2PEventArgs& e) { OnP2PAddress(e); });

  REG_EVENT(mm->GetP2PResponseEvent(), [this](void*, const DiarkisMMResponseEventArgs& e) { OnP2PResponse(e); });
 REG_EVENT(mm->GetBackfillEvent(), [this](void*, const DiarkisMMResponseEventArgs& e) { OnBackfillEvent(e); });
  REG_EVENT(mm->GetKickEvent(), [this](void*, const DiarkisPayloadEventArgs& e) { OnKick(e); });
  REG_EVENT(mm->GetKickResponseEvent(), [this](void*, const DiarkisMMResponseEventArgs& e) { OnKickResponse(e); });
}

NOTE: 以下の例では、サーバ側で RankMatch というマッチメイキングのプロファイルが定義されていることが前提の例になります。

// マッチングに使用するプロ路ファイルを指定。(予めサーバにプロファイルをセットされているもの)
std::string profileID = "RankMatch";

// マッチングの条件プロパティーを指定する。
std::vector<MatchMakerCondition> conditionMap;
MatchMakerCondition codition;
codition.value = rankValue;
codition.key = "rank";
conditionMap.push_back(codition);

std::vector<uint8_t> metadata(0);   // empty

// マッチングを識別するためのユニークなID(ユーザーIDなど)。
std::string uid = "XXXXXXXXXXXXXXX";
mm->SetUID(uid);

// マッチングに参加できるユーザー数を設定
mm->SetMaxMembers(8);

// Set ttl
mm->SetTime(60);

// マッチングに使用するマッチングプロファイルを指定
mm->SetProfileID(profileID);

// マッチメイキング条件のプロパティ設定
mm->SetProperties(conditionMap);

// Set Metadata
mm->SetMetaData(metadata);

// 自分が参加せずに複数のマッチングを開始したい場合はtrueに設定します。
mm->SetReserveOnly(false);

mm->HostMatchmaking();

マッチメイキング開始のレスポンス・イベント

HostMatchmaking を実行することで、サーバでの処理の成功の可否の応答を受け取れます。

// HostMatchmaking のサーバ応答
// ホストになることに失敗したかどうかがわかる
void DiarkisMatchMakerBase::OnHostMatchmaking(const DiarkisMMHostEventArgs& e)
{

}

新しいユーザーがマッチしてジョインした際の通知イベント

新しいユーザーがマッチして、ジョインすることで、既に参加している全てのユーザーに OnMemberJoin イベントが発火して新しいユーザーが参加したことを通知します。

void DiarkisMatchMakerBase::OnMemberJoin(const DiarkisMMSyncEventArgs& e)
{
// 新たにマッチングしたユーザークライアントからのメッセージバイトを処理
    vector<uint8_t> payload = e.GetPayload();
    std::string newUid((char*)payload.data(), payload.size());

// 新メンバー加入時の処理を行う。
}

既に参加したユーザーが離脱した際の通知イベント

既に参加しているユーザーがマッチメイキングを離脱すると 参加している全てのユーザーで

 OnMemberLeave イベントが発火してユーザーが離脱したことを通知します。

void DiarkisMatchMakerBase::OnMemberLeave(const DiarkisMMSyncEventArgs& e)
{
vector<uint8_t> payload = e.GetPayload();
    std::string leaveUid((char*)payload.data(), payload.size());

// メンバー退出した時の処理を行う。
}

任意の同期メッセージを受信する

既に参加しているユーザーから任意で送られてくる同期メッセージをイベントとして受け取ることが可能です。

void DiarkisMatchMakerBase::OnMemberSync(const DiarkisMMSyncEventArgs& e)
{

}

マッチメイキングが完了した通知を任意に送信する

マッチメイキングの定員に達するとサーバから自動で OnComplete イベントの通知が参加している全てのクライアントで発生します。

またホストは任意に NotifyMatchmakingCompletion を実行することで、OnComplete イベントを発生させることが可能です。

完了を通知

mm->NotifyMatchmakingCompletion();

受信イベント

void DiarkisMatchMakerBase::OnComplete(void)
{

}

P2P 通信を開始するためにクライアントのアドレスを同期する

全ての参加しているユーザーに対して、参加ユーザー全員のクライアント・アドレスを共有することができます。

同期実行

mm.P2PAddressSync();

受信イベント

void DiarkisMatchMakerBase::OnP2PAddress(const DiarkisMMP2PEventArgs& e)
{
// マッチメイキングに参加したユーザークライアントのアドレスのリスト
// The format of the address string is "0.0.0.0:8888".
   std::vector<std::string> addressList = e.GetAddresses();

// P2P接続の処理を行う
}

マッチメイキングをクリア(中断)する

ホストとして、マッチメイキングを中断させることができます。マッチメイキングをクリアすると検索の対象ではなくなり新たなマッチの参加がなくなりますが、マッチメイキング自体はなくなりません。

mm->AbortMatchmaking();

レスポンスを受け取る

void DiarkisMatchMakerBase::OnAbortMatchmaking(const DiarkisMMResponseEventArgs& e)
{

}

マッチメイキングを解散する

ホストとしてマッチメイキングを解散させることができます。解散するとマッチメイキング自体が削除されてマッチした参加ユーザーも離脱します。その際に解散の通知っを全てのマッチしたユーザーが受け取ります。

std::string msg = "Disband";
std::vector<uint8_t> payload((uint8_t*)msg.data(), (uint8_t*)msg.data() + msg.size());

mm->DisbandMatchmaking(payload);

解散の通知を受け取る

void DiarkisMatchMakerBase::OnDisbandMatchmaking(const DiarkisMMSyncEventArgs& e)
{

}

バックフィルを実行する

既にインゲームなどで使っているルームを使って再度新しく MatchMaker を使ってユーザークライアントを招き入れることが可能です。

NotifyMatchmakingCompletion マッチングを完了したものを、StartBackfill を使用して、再度検索対象にすることが可能となります。

既にインゲームで使っているルームを使ってバックフィルを実行する

string inGameRoomID = inGameRoom.GetRoomID();

// Backfillを埋め戻しを開始するためには、ルームIDを渡す必要がある
mm.StartBackfill(inGameRoomID);

レスポンスを受け取る

void DiarkisMatchMakerBase::OnBackfillEvent(const DiarkisMMResponseEventArgs& e)
{
// success が true の場合、埋め戻し動作が正常に開始されたことを示す。
bool bSuccess = e.IsSuccess();
}

任意のマッチ参加ユーザーを追い出す

ホストは、マッチしている特定のユーザーをマッチメイキングから追い出すことが可能です。

ユーザーが追い出されると、他のマッチしたユーザー(追い出されたユーザー含め)に対して通知が送信されます。

追い出しを実行する

// 追い出すユーザーのユーザーIDを渡す
mm.Kick(userIDToKickOut);

追い出し実行のレスポンスを受け取る

サーバから追い出しが成功したかどうかのレスポンスを受け取ります。

void DiarkisMatchMakerBase::OnKickResponse(const DiarkisMMResponseEventArgs& e)
{

}

ユーザーが追い出された通知を受け取る

void DiarkisMatchMakerBase::OnKick(const DiarkisPayloadEventArgs& e)
{

}