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

すべてを統合する - ピアツーピアでのクイックマッチ - (Unreal Engine モジュール)

Last updated on February 4, 2026

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

マッチメイキングUIの目的は、マッチメイキングの正確な状態を表示することです。そのため、ウィジェットには多くの高レベルな状態があります。各状態がいつ表示されるべきかを理解するには、次の図を参照してください:

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

  1. MatchmakingP2PWidget_Starter CPPファイルを開き、以下のコードを使用してStartMatchmaking()関数を置き換え、マッチメイキングの開始をトリガーします。OnlineSession変数は、先ほど作成したオンラインセッション(MatchmakingP2POnlineSession_Starterクラス)への参照です。

    void UMatchmakingP2PWidget_Starter::StartMatchmaking()
    {
    if (OnlineSession->ValidateToStartMatchmaking.IsBound() &&
    !OnlineSession->ValidateToStartMatchmaking.Execute(SelectedGameModeType))
    {
    return;
    }

    // Reset stored invite
    SessionInvite = nullptr;

    // Reset auto join session countdown.
    AutoJoinCurrentCountdown = AutoJoinDelay;
    MatchFoundCurrentCountdown = MatchFoundDelay;
    SessionJoinedCurrentCountdown = SessionJoinedDelay;
    Tb_WaitingForPlayersCountdown->SetText(FText::FromString(FString::FromInt(AutoJoinCurrentCountdown)));

    ChangeWidgetState(EWidgetState::REQUEST_SENT);

    OnlineSession->StartMatchmaking(
    GetOwningPlayer(),
    OnlineSession->GetPredefinedSessionNameFromType(EAccelByteV2SessionType::GameSession),
    EGameModeNetworkType::P2P,
    SelectedGameModeType, SelectedGameStyle);
    }
  2. 以下のコードを使用してJoinSession()関数を置き換え、マッチメイキング完了時にゲームが受信した招待へのセッション参加をトリガーします。

    void UMatchmakingP2PWidget_Starter::JoinSession()
    {
    if (!SessionInvite)
    {
    ChangeWidgetState(EWidgetState::ERROR);
    Tb_ErrorText->SetText(TEXT_FAILED_SESSION_INVITE_INVALID);
    }

    ChangeWidgetState(EWidgetState::JOINING_MATCH);

    OnlineSession->JoinSession(
    OnlineSession->GetLocalUserNumFromPlayerController(GetOwningPlayer()),
    OnlineSession->GetPredefinedSessionNameFromType(EAccelByteV2SessionType::GameSession),
    SessionInvite->Session);
    }
  3. 以下のコードを使用してCancelMatchmaking()関数を置き換え、マッチメイキングのキャンセルをトリガーします:

    void UMatchmakingP2PWidget_Starter::CancelMatchmaking()
    {
    ChangeWidgetState(EWidgetState::CANCELING_MATCH);

    OnlineSession->CancelMatchmaking(
    GetOwningPlayer(),
    OnlineSession->GetPredefinedSessionNameFromType(EAccelByteV2SessionType::GameSession));
    }
  4. 以下のコードを使用してRejectSessionInvite()関数を置き換え、マッチセッション招待の拒否をトリガーします:

    void UMatchmakingP2PWidget_Starter::RejectSessionInvite()
    {
    if (!SessionInvite)
    {
    ChangeWidgetState(EWidgetState::ERROR);
    Tb_ErrorText->SetText(TEXT_FAILED_SESSION_INVITE_INVALID);
    }

    ChangeWidgetState(EWidgetState::REJECTING_MATCH);

    OnlineSession->RejectSessionInvite(
    OnlineSession->GetLocalUserNumFromPlayerController(GetOwningPlayer()),
    *SessionInvite.Get());
    }
  5. 以下のコードを使用してNativeTick()関数を置き換え、自動参加カウントダウンがゼロになったときにセッション参加をトリガーします。

    void UMatchmakingP2PWidget_Starter::NativeTick(const FGeometry& MyGeometry, float InDeltaTime)
    {
    Super::NativeTick(MyGeometry, InDeltaTime);

    MoveCameraToTargetLocation(InDeltaTime, FVector(60.0f, 800.0f, 160.0f));

    // Manual "Auto" Join
    if (WidgetState == EWidgetState::WAITING_FOR_PLAYER && AutoJoinCurrentCountdown > 0)
    {
    AutoJoinCurrentCountdown -= InDeltaTime;
    Tb_WaitingForPlayersCountdown->SetText(FText::FromString(FString::FromInt(AutoJoinCurrentCountdown)));

    if (AutoJoinCurrentCountdown <= 0)
    {
    JoinSession();
    }
    }

    // Match found delay
    if (WidgetState == EWidgetState::MATCH_FOUND && MatchFoundCurrentCountdown > 0)
    {
    MatchFoundCurrentCountdown -= InDeltaTime;
    if (MatchFoundCurrentCountdown <= 0 && SessionInvite)
    {
    // Check if auto join is enabled or not
    const TSharedPtr<FOnlineSessionInfoAccelByteV2> SessionInfo = StaticCastSharedPtr<FOnlineSessionInfoAccelByteV2>(
    SessionInvite->Session.Session.SessionInfo);
    check(SessionInfo.IsValid());
    const bool bAutoJoin = SessionInfo->GetBackendSessionData()->Configuration.AutoJoin;

    ChangeWidgetState(bAutoJoin ? EWidgetState::JOINING_MATCH : EWidgetState::WAITING_FOR_PLAYER);
    }
    }

    // Session joined delay
    if (WidgetState == EWidgetState::SESSION_JOINED && SessionJoinedCurrentCountdown > 0)
    {
    SessionJoinedCurrentCountdown -= InDeltaTime;
    if (SessionJoinedCurrentCountdown <= 0)
    {
    ChangeWidgetState(EWidgetState::REQUESTING_SERVER);
    }
    }
    }
  6. コールバック関数をバインドして、特定のマッチメイキングイベントが発生したときに関連するユーザーインターフェースを表示します。この関数は、StartMatchmaking()を即座にトリガーする役割も担っています。これを行うには、以下のコードでNativeOnActivated()関数を置き換えます:

    void UMatchmakingP2PWidget_Starter::NativeOnActivated()
    {
    Super::NativeOnActivated();

    UOnlineSession* BaseOnlineSession = GetWorld()->GetGameInstance()->GetOnlineSession();
    if (!ensure(BaseOnlineSession))
    {
    return;
    }

    OnlineSession = Cast<UAccelByteWarsOnlineSessionBase>(BaseOnlineSession);
    ensure(OnlineSession);

    // Get selected game mode type from the previous widget
    UAccelByteWarsBaseUI* BaseUIWidget = Cast<UAccelByteWarsGameInstance>(GetGameInstance())->GetBaseUIWidget();
    for (const UCommonActivatableWidget* Widget : BaseUIWidget->Stacks[EBaseUIStackType::Menu]->GetWidgetList())
    {
    if (const UQuickPlayWidget* QuickPlayWidget = Cast<UQuickPlayWidget>(Widget))
    {
    SelectedGameModeType = QuickPlayWidget->GetSelectedGameModeType();
    SelectedGameStyle = QuickPlayWidget->GetSelectedGameStyle();
    }
    }

    Btn_Back->OnClicked().AddUObject(this, &ThisClass::DeactivateWidget);
    Btn_Join->OnClicked().AddUObject(this, &ThisClass::JoinSession);
    Btn_Cancel->OnClicked().AddUObject(this, &ThisClass::CancelMatchmaking);
    Btn_Reject->OnClicked().AddUObject(this, &ThisClass::RejectSessionInvite);
    Btn_Retry->OnClicked().AddUObject(this, &ThisClass::StartMatchmaking);

    OnlineSession->GetOnStartMatchmakingCompleteDelegates()->AddUObject(this, &ThisClass::OnStartMatchmakingComplete);
    OnlineSession->GetOnMatchmakingCompleteDelegates()->AddUObject(this, &ThisClass::OnMatchmakingComplete);
    OnlineSession->GetOnSessionInviteReceivedDelegates()->AddUObject(this, &ThisClass::OnSessionInviteReceived);
    OnlineSession->GetOnJoinSessionCompleteDelegates()->AddUObject(this, &ThisClass::OnJoinSessionComplete);
    OnlineSession->GetOnSessionServerUpdateReceivedDelegates()->AddUObject(this, &ThisClass::OnSessionServerUpdateReceived);

    OnlineSession->GetOnCancelMatchmakingCompleteDelegates()->AddUObject(this, &ThisClass::OnCancelMatchmakingComplete);
    OnlineSession->GetOnRejectSessionInviteCompleteDelegate()->AddUObject(this, &ThisClass::OnRejectSessionInviteComplete);

    // Start matchmaking immediately
    StartMatchmaking();
    }
  7. ウィジェットがアクティブでないときは、これらのコールバックをアンバインドします。以下のコードでNativeOnDeactivated()を置き換えます:

    void UMatchmakingP2PWidget_Starter::NativeOnDeactivated()
    {
    Btn_Back->OnClicked().RemoveAll(this);
    Btn_Join->OnClicked().RemoveAll(this);
    Btn_Cancel->OnClicked().RemoveAll(this);
    Btn_Reject->OnClicked().RemoveAll(this);
    Btn_Retry->OnClicked().RemoveAll(this);

    OnlineSession->GetOnStartMatchmakingCompleteDelegates()->RemoveAll(this);
    OnlineSession->GetOnMatchmakingCompleteDelegates()->RemoveAll(this);
    OnlineSession->GetOnSessionInviteReceivedDelegates()->RemoveAll(this);
    OnlineSession->GetOnJoinSessionCompleteDelegates()->RemoveAll(this);
    OnlineSession->GetOnSessionServerUpdateReceivedDelegates()->RemoveAll(this);

    OnlineSession->GetOnCancelMatchmakingCompleteDelegates()->RemoveAll(this);
    OnlineSession->GetOnRejectSessionInviteCompleteDelegate()->RemoveAll(this);

    Super::NativeOnDeactivated();
    }
  8. プレイヤーがゲームセッションから退出できるようにするために、バインドする必要があるボタンがいくつかあります。これらのボタンは、マッチロビーの退出ボタン、および一時停止とゲームオーバーウィジェットの終了ボタンです。これを行うには、セッションから退出するためのデリゲートを割り当てます。MatchmakingP2POnlineSession_Starter CPPファイルを開き、RegisterOnlineDelegates()関数に以下のコードを追加します:

    void UMatchmakingP2POnlineSession_Starter::RegisterOnlineDelegates()
    {
    // ...
    const TDelegate<void(APlayerController*)> LeaveSessionDelegate = TDelegate<void(APlayerController*)>::CreateWeakLambda(
    this, [this](APlayerController*)
    {
    LeaveSession(GetPredefinedSessionNameFromType(EAccelByteV2SessionType::GameSession));
    });
    UPauseWidget::OnQuitGameDelegate.Add(LeaveSessionDelegate);
    UMatchLobbyWidget::OnQuitLobbyDelegate.Add(LeaveSessionDelegate);
    UGameOverWidget::OnQuitGameDelegate.Add(LeaveSessionDelegate);
    // ...
    }
  9. オンラインセッションが初期化解除されたときは、イベントのリスニングを停止するためにアンバインドする必要があります。これは、ClearOnlineDelegates()関数に以下のコードを追加することで実行できます:

    void UMatchmakingP2POnlineSession_Starter::ClearOnlineDelegates()
    {
    // ...
    UPauseWidget::OnQuitGameDelegate.RemoveAll(this);
    UMatchLobbyWidget::OnQuitLobbyDelegate.RemoveAll(this);
    UGameOverWidget::OnQuitGameDelegate.RemoveAll(this);
    // ...
    }

リソース