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

すべてをまとめる - 専用サーバーで参加可能なセッションを作成する - (Unity モジュール)

Last updated on February 4, 2026

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

UI を接続してマッチセッションを作成・参加する

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

    private MatchSessionDSWrapper_Starter matchSessionDSWrapper;
  2. ゲームセッションイベントを処理するコールバック関数を登録する新しい関数を作成します。これらのコールバック関数は次のステップで作成します。

    private void RegisterMatchSessionEvents()
    {
    if (!matchSessionDSWrapper) return;
    MatchSessionEssentialsWrapper.OnDSStatusChanged += OnDSStatusChanged;
    }
  3. ゲームセッションイベントのリスニングを停止するため、コールバック関数の登録をクリアする新しい関数を作成します。

    private void ClearMatchSessionEvents()
    {
    if (!matchSessionDSWrapper) return;
    MatchSessionEssentialsWrapper.OnDSStatusChanged -= OnDSStatusChanged;
    }
  4. CreateMatchSession() 関数を以下のコードに置き換えます。この関数は、選択されたゲームモードに基づいてセッションテンプレートを使用し、新しいゲームセッションを作成するリクエストを送信します。セッションテンプレートは AccelByteWarsOnlineSessionModels クラスの GetGameSessionRequestModel() を使用して取得されます。

    private void CreateMatchSession()
    {
    // Get the session template name from the game config.
    SessionV2GameSessionCreateRequest request =
    AccelByteWarsOnlineSessionModels.GetGameSessionRequestModel(CreateMatchSessionMenu.SelectedGameMode, GameSessionServerType.DedicatedServerAMS);
    if (request == null)
    {
    BytewarsLogger.LogWarning("Failed to create match session. Session type is not supported.");
    stateSwitcher.ErrorMessage = InvalidSessionTypeMessage;
    stateSwitcher.SetState(MatchSessionMenuState.Error);
    return;
    }

    // Reregister match session events.
    ClearMatchSessionEvents();
    RegisterMatchSessionEvents();

    // Create a new match session.
    stateSwitcher.SetState(MatchSessionMenuState.CreateMatch);
    matchSessionDSWrapper.CreateGameSession(request, OnJoinSessionComplete);
    }
  5. JoinMatchSession() 関数を以下のコードに置き換えます。この関数は、セッション ID でゲームセッションに参加するリクエストを送信します。

    private void JoinMatchSession(string sessionId)
    {
    // Reregister match session events.
    ClearMatchSessionEvents();
    RegisterMatchSessionEvents();

    stateSwitcher.SetState(MatchSessionMenuState.JoinMatch);
    matchSessionDSWrapper.JoinGameSession(sessionId, OnJoinSessionComplete);
    }
  6. ゲームセッションが作成または参加されたときに処理するコールバック関数を作成します。成功した場合、メニューを参加状態に切り替え、サーバーを待機します。

    private async void OnJoinSessionComplete(Result<SessionV2GameSession> result)
    {
    // Abort if already attempt to cancel join the match.
    if (stateSwitcher.CurrentState is
    not (MatchSessionMenuState.CreateMatch or MatchSessionMenuState.JoinMatch))
    {
    return;
    }

    if (result.IsError)
    {
    ClearMatchSessionEvents();
    stateSwitcher.ErrorMessage = result.Error.Message;
    stateSwitcher.SetState(MatchSessionMenuState.Error);
    return;
    }

    stateSwitcher.SetState(MatchSessionMenuState.JoinedMatch);
    await UniTask.Delay(StateChangeDelay * 1000); // Delay a bit before changing menu state.
    stateSwitcher.SetState(MatchSessionMenuState.RequestingServer);
    }
  7. LeaveMatchSession() 関数を以下のコードに置き換えます。この関数は、退出する有効なセッションがあるかどうかを確認します。ない場合は、単にメニューを閉じて前のメニューに戻ります。

    private void LeaveMatchSession(string sessionId)
    {
    ClearMatchSessionEvents();

    // Simply return from the menu if the session is empty.
    if (string.IsNullOrEmpty(sessionId))
    {
    MenuManager.Instance.OnBackPressed();
    return;
    }

    stateSwitcher.SetState(MatchSessionMenuState.LeaveMatch);
    matchSessionDSWrapper.LeaveGameSession(sessionId, OnLeaveMatchSessionComplete);
    }
  8. セッション退出が完了したときに処理するコールバック関数を作成します。リクエストが失敗した場合はエラー状態に切り替えます。それ以外の場合は、メニューを閉じて前のメニューに戻ります。

    private void OnLeaveMatchSessionComplete(Result result)
    {
    if (result.IsError && result.Error.Code != ErrorCode.SessionIdNotFound)
    {
    stateSwitcher.ErrorMessage = result.Error.Message;
    stateSwitcher.SetState(MatchSessionMenuState.Error);
    return;
    }

    MenuManager.Instance.OnBackPressed();
    }
  9. 専用サーバー情報を受信したときに処理するコールバック関数を作成します。専用サーバーのステータスに基づいて、対応するメニュー状態を表示します。

    private void OnDSStatusChanged(Result<SessionV2DsStatusUpdatedNotification> result)
    {
    if (result.IsError)
    {
    ClearMatchSessionEvents();
    stateSwitcher.ErrorMessage = result.Error.Message;
    stateSwitcher.SetState(MatchSessionMenuState.Error);
    return;
    }

    SessionV2DsInformation dsInfo = result.Value.session.dsInformation;
    switch (dsInfo.StatusV2)
    {
    case SessionV2DsStatus.AVAILABLE:
    ClearMatchSessionEvents();
    break;
    case SessionV2DsStatus.FAILED_TO_REQUEST:
    case SessionV2DsStatus.ENDED:
    case SessionV2DsStatus.UNKNOWN:
    ClearMatchSessionEvents();
    stateSwitcher.ErrorMessage = FailedToFindServerMessage;
    stateSwitcher.SetState(MatchSessionMenuState.Error);
    break;
    default:
    stateSwitcher.SetState(MatchSessionMenuState.RequestingServer);
    break;
    }
    }
  10. 次に、事前定義された OnEnable() 関数を以下のコードに置き換えます。このコードは、最初にラッパーを初期化し、メニューが表示されたときにゲームセッションを作成するか参加するかを決定します。また、リトライボタンとキャンセルボタンを適切に再バインドします。

    private void OnEnable()
    {
    matchSessionDSWrapper ??= TutorialModuleManager.Instance.GetModuleClass<MatchSessionDSWrapper_Starter>();
    if (!matchSessionDSWrapper)
    {
    return;
    }

    if (sessionToJoin == null)
    {
    stateSwitcher.OnRetryButtonClicked = CreateMatchSession;
    stateSwitcher.OnCancelButtonClicked = () => LeaveMatchSession(AccelByteWarsOnlineSession.CachedSession.id);
    CreateMatchSession();
    }
    else
    {
    stateSwitcher.OnRetryButtonClicked = () => JoinMatchSession(sessionToJoin.Session.id);
    stateSwitcher.OnCancelButtonClicked = () => LeaveMatchSession(sessionToJoin.Session.id);
    JoinMatchSession(sessionToJoin.Session.id);
    }
    }
  11. 最後に、事前定義された OnDisable() 関数を以下のコードに置き換えて、メニューが閉じられたときにゲームセッションイベントのリスニングを停止します。

    private void OnDisable()
    {
    sessionToJoin = null;
    ClearMatchSessionEvents();
    }

リソース