すべてを統合する - 専用サーバーでのクイックマッチ - (Unity モジュール)
注釈:本資料はAI技術を用いて翻訳されています。
マッチメイキングの開始、キャンセル、ステータス表示のために UI を接続する
-
MatchmakingDSMenu_Starterクラスを開き、作成したラッパーを保存する変数を定義します。private MatchmakingDSWrapper_Starter matchmakingDSWrapper; -
マッチメイキングイベントを処理するコールバック関数を登録する新しい関数を作成します。これらのコールバック関数は次のステップで作成します。
private void RegisterMatchmakingEvents()
{
if (!matchmakingDSWrapper) return;
MatchmakingEssentialsWrapper.OnMatchFound += OnMatchmakingComplete;
MatchmakingEssentialsWrapper.OnMatchmakingExpired += OnMatchmakingExpired;
MatchmakingEssentialsWrapper.OnDSStatusChanged += OnDSStatusChanged;
MatchmakingEssentialsWrapper.OnSessionInviteReceived += OnSessionInviteReceived;
} -
マッチメイキングイベントのリスニングを停止するために、コールバック関数の登録をクリアする新しい関数を作成します。
private void ClearMatchmakingEvents()
{
if (!matchmakingDSWrapper) return;
MatchmakingEssentialsWrapper.OnMatchFound -= OnMatchmakingComplete;
MatchmakingEssentialsWrapper.OnMatchmakingExpired -= OnMatchmakingExpired;
MatchmakingEssentialsWrapper.OnDSStatusChanged -= OnDSStatusChanged;
MatchmakingEssentialsWrapper.OnSessionInviteReceived -= OnSessionInviteReceived;
} -
StartMatchmaking()関数を以下のコードに置き換えます。この関数は、選択されたゲームモードに基づいてマッチプールを使用してマッチメイキングを開始するリクエストを送信します。マッチプールはAccelByteWarsOnlineSessionModelsクラスのGetGameSessionRequestModel()を使用して取得されます。private void StartMatchmaking()
{
// Get the match pool name from the game config.
SessionV2GameSessionCreateRequest request =
AccelByteWarsOnlineSessionModels.GetGameSessionRequestModel(MatchmakingMenu.SelectedGameMode, GameSessionServerType.DedicatedServerAMS);
if (request == null)
{
BytewarsLogger.LogWarning("Failed to start matchmaking. Session type is not supported.");
stateSwitcher.ErrorMessage = InvalidSessionTypeMessage;
stateSwitcher.SetState(MatchmakingMenuState.Error);
return;
}
// Re-register matchmaking events.
ClearMatchmakingEvents();
RegisterMatchmakingEvents();
// Start matchmaking
stateSwitcher.SetState(MatchmakingMenuState.StartMatchmaking);
matchmakingDSWrapper.StartMatchmaking(request.matchPool, OnStartMatchmakingComplete);
} -
マッチメイキングが開始されたときに処理するコールバック関数を作成します。リクエストが失敗した場合、メニューをエラー状態に切り替えます。それ以外の場合は、キャンセルボタンをマッチメイキングのキャンセルにバインドし、メニューをマッチ検索状態に切り替えます。
private void OnStartMatchmakingComplete(Result<MatchmakingV2CreateTicketResponse> result)
{
if (result.IsError)
{
ClearMatchmakingEvents();
stateSwitcher.ErrorMessage = result.Error.Message;
stateSwitcher.SetState(MatchmakingMenuState.Error);
return;
}
stateSwitcher.OnCancelButtonClicked = () => CancelMatchmaking(result.Value.matchTicketId);
stateSwitcher.SetState(MatchmakingMenuState.FindingMatch);
} -
CancelMatchmaking()関数を以下のコードに置き換えます。これはマッチメイキングをキャンセルするリクエストを送信し、メニューをマッチメイキングキャンセル状態に切り替えます。private void CancelMatchmaking(string matchTicketId)
{
ClearMatchmakingEvents();
stateSwitcher.SetState(MatchmakingMenuState.CancelMatchmaking);
matchmakingDSWrapper.CancelMatchmaking(matchTicketId, OnCancelMatchmakingComplete);
} -
マッチメイキングがキャンセルされたときに処理するコールバック関数を作成します。リクエストが失敗した場合、メニューをエラー状態に切り替えます。それ以外の場合は、メニューを閉じて前のメニューに戻ります。
private void OnCancelMatchmakingComplete(Result result)
{
if (result.IsError)
{
stateSwitcher.ErrorMessage = result.Error.Message;
stateSwitcher.SetState(MatchmakingMenuState.Error);
return;
}
MenuManager.Instance.OnBackPressed();
} -
セッションから退出する新しい関数を作成します。これを使用して、マッチメイキングによって作成されたセッションから退出し、プレイヤーがマッチメイキングの進行をキャンセルできるようにします。
private void LeaveSession(string sessionId)
{
ClearMatchmakingEvents();
stateSwitcher.SetState(MatchmakingMenuState.LeaveMatch);
matchmakingDSWrapper.LeaveGameSession(sessionId, OnLeaveSessionComplete);
} -
セッション退出が完了したときに処理するコールバック関数を作成します。リクエストが失敗した場合、エラー状態に切り替えます。それ以外の場合は、メニューを閉じて前のメニューに戻ります。
private void OnLeaveSessionComplete(Result result)
{
if (result.IsError)
{
stateSwitcher.ErrorMessage = result.Error.Message;
stateSwitcher.SetState(MatchmakingMenuState.Error);
return;
}
MenuManager.Instance.OnBackPressed();
} -
セッションに参加する関数を作成し、マッチメイキングが見つかったときに作成されたセッションにプレイヤーが参加できるようにします。
private void JoinSession(string sessionId)
{
stateSwitcher.OnCancelButtonClicked = () => LeaveSession(sessionId);
stateSwitcher.SetState(MatchmakingMenuState.JoinMatch);
matchmakingDSWrapper.JoinGameSession(sessionId, OnJoinSessionComplete);
} -
ゲームセッションが作成または参加されたときに処理するコールバック関数を作成します。成功した場合、メニューを参加状態に切り替え、サーバーを待機します。
private async void OnJoinSessionComplete(Result<SessionV2GameSession> result)
{
// Abort if already attempt to cancel join the match.
if (stateSwitcher.CurrentState != MatchmakingMenuState.JoinMatch)
{
return;
}
if (result.IsError)
{
ClearMatchmakingEvents();
stateSwitcher.ErrorMessage = result.Error.Message;
stateSwitcher.SetState(MatchmakingMenuState.Error);
return;
}
stateSwitcher.SetState(MatchmakingMenuState.JoinedMatch);
await UniTask.Delay(StateChangeDelay * 1000); // Delay a bit before changing menu state.
stateSwitcher.SetState(MatchmakingMenuState.RequestingServer);
} -
セッション招待を拒否する関数を作成します。これを使用して、マッチメイキングが見つかったときに作成されたセッションをプレイヤーが拒否できるようにします。
private void RejectSessionInvite(string sessionId)
{
ClearMatchmakingEvents();
stateSwitcher.SetState(MatchmakingMenuState.RejectMatch);
matchmakingDSWrapper.RejectGameSessionInvite(sessionId, OnRejectSessionInviteComplete);
} -
セッション招待の拒否が完了したときに処理するコールバック関数を作成します。失敗した場合、エラー状態に切り替えます。それ以外の場合は、メニューを閉じて前のメニューに戻ります。
private void OnRejectSessionInviteComplete(Result result)
{
if (result.IsError)
{
stateSwitcher.ErrorMessage = result.Error.Message;
stateSwitcher.SetState(MatchmakingMenuState.Error);
return;
}
MenuManager.Instance.OnBackPressed();
} -
マッチメイキングがマッチするプレイヤーを見つけたときに処理するコールバック関数を作成します。失敗した場合、エラー状態に切り替えます。それ以外の場合は、マッチ発見状態に切り替え、バックエンドからのセッション招待を待機していることを示します。
private void OnMatchmakingComplete(Result<MatchmakingV2MatchFoundNotification> result)
{
if (result.IsError)
{
ClearMatchmakingEvents();
stateSwitcher.ErrorMessage = result.Error.Message;
stateSwitcher.SetState(MatchmakingMenuState.Error);
return;
}
MatchmakingEssentialsWrapper.OnMatchFound -= OnMatchmakingComplete;
// Only change menu if session invite not already received.
if (stateSwitcher.CurrentState != MatchmakingMenuState.JoinMatchConfirmation)
{
stateSwitcher.SetState(MatchmakingMenuState.MatchFound);
}
} -
セッション招待が受信されたときに処理するコールバック関数を作成します。これはマッチメイキングがマッチを見つけたときに発生します。参加ボタンと拒否ボタンをそれぞれセッションへの参加または拒否に再バインドし、メニューを参加確認状態に切り替えます。
private async void OnSessionInviteReceived(Result<SessionV2GameInvitationNotification> result)
{
if (result.IsError)
{
ClearMatchmakingEvents();
stateSwitcher.ErrorMessage = result.Error.Message;
stateSwitcher.SetState(MatchmakingMenuState.Error);
return;
}
MatchmakingEssentialsWrapper.OnSessionInviteReceived -= OnSessionInviteReceived;
stateSwitcher.OnJoinButtonClicked = () => JoinSession(result.Value.sessionId);
stateSwitcher.OnRejectButtonClicked = () => RejectSessionInvite(result.Value.sessionId);
// Delay to prevent menu state overlap (session invite and match found may arrive simultaneously).
await UniTask.Delay(StateChangeDelay * 1000);
stateSwitcher.SetState(MatchmakingMenuState.JoinMatchConfirmation);
} -
専用サーバー情報が受信されたときに処理するコールバック関数を作成します。専用サーバーのステータスに基づいて、対応するメニュー状態を表示します。
private void OnDSStatusChanged(Result<SessionV2DsStatusUpdatedNotification> result)
{
if (result.IsError)
{
ClearMatchmakingEvents();
stateSwitcher.ErrorMessage = result.Error.Message;
stateSwitcher.SetState(MatchmakingMenuState.Error);
return;
}
SessionV2DsInformation dsInfo = result.Value.session.dsInformation;
switch (dsInfo.StatusV2)
{
case SessionV2DsStatus.AVAILABLE:
ClearMatchmakingEvents();
break;
case SessionV2DsStatus.FAILED_TO_REQUEST:
case SessionV2DsStatus.ENDED:
case SessionV2DsStatus.UNKNOWN:
ClearMatchmakingEvents();
stateSwitcher.ErrorMessage = FailedToFindServerMessage;
stateSwitcher.SetState(MatchmakingMenuState.Error);
break;
default:
stateSwitcher.SetState(MatchmakingMenuState.RequestingServer);
break;
}
} -
チケットの有効期限切れによりマッチメイキングが失敗したときに処理するコールバック関数を作成します。
private void OnMatchmakingExpired(Result<MatchmakingV2TicketExpiredNotification> result)
{
ClearMatchmakingEvents();
stateSwitcher.ErrorMessage = result.IsError ? result.Error.Message : MatchmakingExpiredMessage;
stateSwitcher.SetState(MatchmakingMenuState.Error);
} -
事前定義された
OnEnable()関数を以下のコードに置き換えて、メニューが表示されたときにラッパーを初期化し、マッチメイキングを開始します。private void OnEnable()
{
matchmakingDSWrapper ??= TutorialModuleManager.Instance.GetModuleClass<MatchmakingDSWrapper_Starter>();
if (matchmakingDSWrapper) StartMatchmaking();
} -
最後に、事前定義された
OnDisable()関数を以下のコードに置き換えて、メニューが閉じられたときにマッチメイキングイベントのリスニングを停止します。private void OnDisable()
{
ClearMatchmakingEvents();
}
リソース
-
このチュートリアルで使用されているファイルは、Unity Byte Wars GitHub リポジトリで入手できます。