MatchMaker クライアントのクラスを使うことで、マッチメイキングをホスト(検索を待ち受ける)として開始することが可能です。
マッチメイキングのホストになると他のユーザーからのマッチング検索の対象になり、マッチして新しいユーザーがジョインするとホストに通知が送られるなど、さまざまな機能を使うことができるようになります。
ホストのユーザーに限らず、マッチしてジョインしたユーザーは自由に他のマッチしたユーザーにメッセージを送信して同期を取ることも可能です。
ホストとしてできること
以下がホストとして、できることの一覧になります。
- マッチメイキングのクリア。マッチメイキングを任意に解散させて他のマッチしたユーザーに通知します。
- 任意のメッセージをマッチしたユーザー同士で送受信することが可能です。
- マッチングの完了を任意に通知することが可能です。
- マッチした特定のユーザーを追い出すことが可能です。
- P2P を使った通信を開始するためのクライアントのアドレスを同期することが可能です。
マッチメイキングをホストする
NOTE: 以下の例では、サーバ側で RankMatch というマッチメイキングのプロファイルが定義されていることが前提の例になります。
Diarkis.Modules.MatchMaker mm = new Diarkis.Modules.MatchMaker();
// Specify which matchmaking profile to use for your matchmaking
mm.MatchmakingProfileID = "RankMatch";
// Define how many user clients allowed to join your matchmaking
mm.MaxMatchMembers = 8;
// Unique ID to identify your matchmaking i.e. your user ID etc.
mm.UID = "Set some unique ID to identify your matchmaking";
// Matchmaking condition properties
Dictionary<string, int> properties = new Dictionary<string, int>();
properties.Add("rank", 10);
mm.Properties = properties;
// Set this to true, if you wish to start multiple matchmakings without joining yourself
mm.ReverseOnly = false;
// Start hosting your matchmaking
mm.HostMatchmaking();
マッチメイキング開始のレスポンス・イベント
HostMatchmaking を実行することで、サーバでの処理の成功の是非を通知するイベントです。
// Server response for HostMatchmaking
// that tells you if becoming a host has failed or not
mm.OnHostResponse += (bool success, string matchmakingRoomID, byte[] response) =>
{
};
新しいユーザーがマッチしてジョインした際の通知イベント
新しいユーザーがマッチして、ジョインすることで、既に参加している全てのユーザーに OnMemberJoin イベントが発火して新しいユーザーが参加したことを通知します。
mm.OnMemberJoin += (byte[] message) =>
{
// Message byte array data from the newly matched user client
};
既に参加したユーザーが離脱した際の通知イベント
既に参加しているユーザーがマッチメイキングを離脱すると 参加している全てのユーザーで
OnMemberLeave イベントが発火してユーザーが離脱したことを通知します。
mm.OnMemberLeave += (byte[] message) =>
{
// Message byte array data from the user client that has left
};
任意の同期メッセージを受信する
既に参加しているユーザーから任意で送られてくる同期メッセージをイベントとして受け取ることが可能です。
mm.OnMemberSync += (byte[] message) =>
{
};
マッチメイキングが完了した通知を任意に送信する
マッチメイキングの定員に達するとサーバから自動で OnComplete イベントの通知が参加している全てのクライアントで発生します。
またホストは任意に NotifyMatchmakingCompletion を実行することで、OnComplete イベントを発生させることが可能です。
同期実行
mm.NotifyMatchmakingCompletion();
受信イベント
mm.OnComplete += () =>
{
};
P2P 通信を開始するためにクライアントのアドレスを同期する
全ての参加しているユーザーに対して、参加ユーザー全員のクライアント・アドレスを共有することができます。
同期実行
mm.P2PAddressSync();
受信イベント
mm.OnP2PAddressSync += (string[] addressList) => {
// The list of all matched and joined user clients' client addresses.
// The format of the address string is "0.0.0.0:8888".
};
マッチメイキングをクリア(中断)する
ホストとして、マッチメイキングを中断させることができます。マッチメイキングをクリアすると検索の対象ではなくなり新たなマッチの参加がなくなりますが、マッチメイキング自体はなくなりません。
mm.ClearMatchmaking();
レスポンスを受け取る
mm.OnClearMatchmakingResponse += (bool success, byte[] payload) =>
{
};
マッチメイキングを解散する
ホストとしてマッチメイキングを解散させることができます。解散するとマッチメイキング自体が削除されてマッチした参加ユーザーも離脱します。その際に解散の通知っを全てのマッチしたユーザーが受け取ります。
byte[] message = Encoding.UTF8.GetBytes("This message will be delivered to all matched user clients");
mm.DisbandMatchmaking(message);
解散の通知を受け取る
mm.OnDisbandMatchmaking += (byte[] message) => {
};
バックフィルを実行する
既にインゲームなどで使っているルームを使って再度新しく MatchMaker を使ってユーザークライアントを招き入れることが可能です。
ClearMatchmaking を使って haltMatchmaking を true にしたものを再度検索対象にする場合にもStartBackfill 使用します。
既にインゲームで使っているルームを使ってバックフィルを実行する
string inGameRoomID = inGameRoom.GetRoomID();
// We need to pass the room ID to start the backfill
mm.StartBackfill(inGameRoomID);
中断している (haltMatchmaking = true) のマッチメイキングを再開する
string haltedMatchmakingRoomID = mm.RoomID;
mm.StartBackfill(haltedMatchmakingRoomID);
レスポンスを受け取る
mm.OnBackfillStartResponse += (bool success, byte[] payload) => {
// If success is true, the backfill operation has successfully started.
};
任意のマッチ参加ユーザーを追い出す
ホストは、マッチしている特定のユーザーをマッチメイキングから追い出すことが可能です。
ユーザーが追い出されると、他のマッチしたユーザー(追い出されたユーザー含め)に対して通知が送信されます。
追い出しを実行する
// You must pass the user ID of the user to kick out.
mm.Kick(userIDToKickOut);
追い出し実行のレスポンスを受け取る
サーバから追い出しが成功したかどうかのレスポンスを受け取ります。
mm.OnKickResponse += (bool success, byte[] payload) => {
};
ユーザーが追い出された通知を受け取る
mm.OnKick += (string kickedOutUserID) => {
};