メインコンテンツまでスキップ

すべてをまとめる - ピアツーピアによるクイックマッチ - (Unity モジュール)

Last updated on February 4, 2026

注釈:本資料はAI技術を用いて翻訳されています。

備考

AccelByte Gaming Services (AGS) SDK for Unity は WebGL で P2P をサポートしていません。このモジュールは WebGL ビルドでは使用できません。

UI を接続してマッチメイキングの開始、キャンセル、ステータス表示を行う

  1. MatchmakingP2PMenu_Starter クラスを開き、作成したラッパーを格納する変数を定義します。

    private MatchmakingP2PWrapper_Starter matchmakingP2PWrapper;
  2. マッチメイキングイベントを処理するコールバック関数を登録する新しい関数を作成します。これらのコールバック関数は次のステップで作成します。

    private void RegisterMatchmakingEvents()
    {
    if (!matchmakingP2PWrapper) return;
    MatchmakingEssentialsWrapper.OnMatchFound += OnMatchmakingComplete;
    MatchmakingEssentialsWrapper.OnMatchmakingExpired += OnMatchmakingExpired;
    MatchmakingEssentialsWrapper.OnSessionInviteReceived += OnSessionInviteReceived;
    }
  3. コールバック関数の登録をクリアしてマッチメイキングイベントのリスニングを停止する新しい関数を作成します。

    private void ClearMatchmakingEvents()
    {
    if (!matchmakingP2PWrapper) return;
    MatchmakingEssentialsWrapper.OnMatchFound -= OnMatchmakingComplete;
    MatchmakingEssentialsWrapper.OnMatchmakingExpired -= OnMatchmakingExpired;
    MatchmakingEssentialsWrapper.OnSessionInviteReceived -= OnSessionInviteReceived;
    }
  4. StartMatchmaking() 関数を以下のコードに置き換えます。この関数は、選択されたゲームモードに基づいてマッチプールを使用してマッチメイキングを開始するリクエストを送信します。マッチプールは AccelByteWarsOnlineSessionModels クラスの GetGameSessionRequestModel() を使用して取得されます。

    private void StartMatchmaking()
    {
    // Get the match pool name from the game config.
    SessionV2GameSessionCreateRequest request =
    AccelByteWarsOnlineSessionModels.GetGameSessionRequestModel(MatchmakingMenu.SelectedGameMode, GameSessionServerType.PeerToPeer);
    if (request == null)
    {
    BytewarsLogger.LogWarning("Failed to start matchmaking. Session type is not supported.");
    stateSwitcher.ErrorMessage = InvalidSessionTypeMessage;
    stateSwitcher.SetState(MatchmakingMenuState.Error);
    return;
    }

    // Reregister matchmaking events.
    ClearMatchmakingEvents();
    RegisterMatchmakingEvents();

    // Start matchmaking
    stateSwitcher.SetState(MatchmakingMenuState.StartMatchmaking);
    matchmakingP2PWrapper.StartMatchmaking(request.matchPool, OnStartMatchmakingComplete);
    }
  5. マッチメイキングが開始されたときに処理するコールバック関数を作成します。リクエストが失敗した場合、メニューをエラー状態に切り替えます。それ以外の場合は、キャンセルボタンをマッチメイキングのキャンセルにバインドし、メニューをマッチ検索状態に切り替えます。

    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);
    }
  6. CancelMatchmaking() 関数を以下のコードに置き換えます。これはマッチメイキングをキャンセルするリクエストを送信し、メニューをマッチメイキングキャンセル状態に切り替えます。

    private void CancelMatchmaking(string matchTicketId)
    {
    ClearMatchmakingEvents();
    stateSwitcher.SetState(MatchmakingMenuState.CancelMatchmaking);
    matchmakingP2PWrapper.CancelMatchmaking(matchTicketId, OnCancelMatchmakingComplete);
    }
  7. マッチメイキングがキャンセルされたときに処理するコールバック関数を作成します。リクエストが失敗した場合、メニューをエラー状態に切り替えます。それ以外の場合は、メニューを閉じて前のメニューに戻ります。

    private void OnCancelMatchmakingComplete(Result result)
    {
    if (result.IsError)
    {
    stateSwitcher.ErrorMessage = result.Error.Message;
    stateSwitcher.SetState(MatchmakingMenuState.Error);
    return;
    }

    MenuManager.Instance.OnBackPressed();
    }
  8. セッションを離脱する新しい関数を作成します。これを使用して、マッチメイキングによって作成されたセッションを離脱し、プレイヤーがマッチメイキングの進行をキャンセルできるようにします。

    private void LeaveSession(string sessionId)
    {
    ClearMatchmakingEvents();
    stateSwitcher.SetState(MatchmakingMenuState.LeaveMatch);
    matchmakingP2PWrapper.LeaveGameSession(sessionId, OnLeaveSessionComplete);
    }
  9. セッション離脱が完了したときに処理するコールバック関数を作成します。リクエストが失敗した場合、エラー状態に切り替えます。それ以外の場合は、メニューを閉じて前のメニューに戻ります。

    private void OnLeaveSessionComplete(Result result)
    {
    if (result.IsError)
    {
    stateSwitcher.ErrorMessage = result.Error.Message;
    stateSwitcher.SetState(MatchmakingMenuState.Error);
    return;
    }

    MenuManager.Instance.OnBackPressed();
    }
  10. セッションに参加する関数を作成し、プレイヤーがマッチメイキングが見つかったときに作成されたセッションに参加できるようにします。

    private void JoinSession(string sessionId)
    {
    stateSwitcher.OnCancelButtonClicked = () => LeaveSession(sessionId);
    stateSwitcher.SetState(MatchmakingMenuState.JoinMatch);
    matchmakingP2PWrapper.JoinGameSession(sessionId, OnJoinSessionComplete);
    }
  11. セッションに参加したときに対応する状態にメニューを切り替えるコールバック関数を作成します。

    private 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);
    }
  12. セッション招待を拒否する関数を作成します。これを使用して、プレイヤーがマッチメイキングが見つかったときに作成されたセッションを拒否できるようにします。

    private void RejectSessionInvite(string sessionId)
    {
    ClearMatchmakingEvents();
    stateSwitcher.SetState(MatchmakingMenuState.RejectMatch);
    matchmakingP2PWrapper.RejectGameSessionInvite(sessionId, OnRejectSessionInviteComplete);
    }
  13. セッション招待の拒否が完了したときに処理するコールバック関数を作成します。失敗した場合、エラー状態に切り替えます。それ以外の場合は、メニューを閉じて前のメニューに戻ります。

    private void OnRejectSessionInviteComplete(Result result)
    {
    if (result.IsError)
    {
    stateSwitcher.ErrorMessage = result.Error.Message;
    stateSwitcher.SetState(MatchmakingMenuState.Error);
    return;
    }

    MenuManager.Instance.OnBackPressed();
    }
  14. マッチメイキングがマッチするプレイヤーを見つけたときに処理するコールバック関数を作成します。失敗した場合、エラー状態に切り替えます。それ以外の場合は、マッチ発見状態に切り替え、バックエンドからのセッション招待を待機していることを示します。

    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 the menu state if the session invite is not already received.
    if (stateSwitcher.CurrentState != MatchmakingMenuState.JoinMatchConfirmation)
    {
    stateSwitcher.SetState(MatchmakingMenuState.MatchFound);
    }
    }
  15. セッション招待を受信したときに処理するコールバック関数を作成します。これはマッチメイキングがマッチを見つけたときに発生します。参加ボタンと拒否ボタンをそれぞれセッションへの参加または拒否に再バインドし、メニューを参加確認状態に切り替えます。

    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 a bit to prevent menu state overlap.
    * Since the session invite and match found event may be received at the same time. */
    await UniTask.Delay(StateChangeDelay * 1000);

    stateSwitcher.SetState(MatchmakingMenuState.JoinMatchConfirmation);
    }
  16. チケットの有効期限切れによりマッチメイキングが失敗したときに処理するコールバック関数を作成します。

    private void OnMatchmakingExpired(Result<MatchmakingV2TicketExpiredNotification> result)
    {
    ClearMatchmakingEvents();
    stateSwitcher.ErrorMessage = result.IsError ? result.Error.Message : MatchmakingExpiredMessage;
    stateSwitcher.SetState(MatchmakingMenuState.Error);
    }
  17. 事前定義された OnEnable() 関数を以下のコードに置き換えて、メニューが表示されたときにラッパーを初期化してマッチメイキングを開始します。

    private void OnEnable()
    {
    matchmakingP2PWrapper ??= TutorialModuleManager.Instance.GetModuleClass<MatchmakingP2PWrapper_Starter>();
    if (matchmakingP2PWrapper) StartMatchmaking();
    }
  18. 最後に、事前定義された OnDisable() 関数を以下のコードに置き換えて、メニューが閉じられたときにマッチメイキングイベントのリスニングを停止します。

    private void OnDisable()
    {
    ClearMatchmakingEvents();
    }

リソース