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

すべてを統合する - ピアツーピアで参加可能なセッション - (Unreal Engine モジュール)

Last updated on February 4, 2026

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

マッチセッション作成メニューを作成、退出、および現在のセッションステータス表示に接続する

  1. まず、CreateMatchSessionP2PWidget_Starter CPP ファイルを開き、CreateSession() 関数に移動します。Online Session からセッション作成関数への呼び出しを追加します。親ウィジェットがプレイヤーが選択したゲームモードを保存していることを覚えておいてください。そのため、選択されたゲームモードを取得して Online Session に渡します。

    void UCreateMatchSessionP2PWidget_Starter::CreateSession() const
    {
    if (OnlineSession->ValidateToStartSession.IsBound() &&
    !OnlineSession->ValidateToStartSession.Execute())
    {
    return;
    }

    // Make sure the retry and cancel game session is performed by this class when the P2P network type is selected.
    W_Parent->GetProcessingWidgetComponent()->OnCancelClicked.Clear();
    W_Parent->GetProcessingWidgetComponent()->OnRetryClicked.Clear();
    W_Parent->GetProcessingWidgetComponent()->OnCancelClicked.AddUObject(this, &ThisClass::CancelJoiningSession);
    W_Parent->GetProcessingWidgetComponent()->OnRetryClicked.AddUObject(this, &ThisClass::CreateSession);

    W_Parent->SetLoadingMessage(TEXT_REQUESTING_SESSION_CREATION, false);
    W_Parent->SwitchContent(UCreateMatchSessionWidget::EContentType::LOADING);

    OnlineSession->CreateMatchSession(
    OnlineSession->GetLocalUserNumFromPlayerController(GetOwningPlayer()),
    EGameModeNetworkType::P2P,
    W_Parent->GetSelectedGameModeType(), W_Parent->GetSelectedGameStyle());
    }
  2. CancelJoiningSession() 関数に移動します。ここでは、単に LeaveSession を呼び出して参加をキャンセルします。ピアツーピア(P2P)セッションにいるため、参加時にセッション情報にすでにホスト IP アドレスが含まれている可能性があります。その場合、UI はプレイヤーにセッションのキャンセルを許可しません。それ以外の場合、ゲームはバックエンドからの更新を待ち、プレイヤーにキャンセルを許可します。

    void UCreateMatchSessionP2PWidget_Starter::CancelJoiningSession() const
    {
    W_Parent->SetLoadingMessage(TEXT_LEAVING_SESSION, false);
    W_Parent->SwitchContent(UCreateMatchSessionWidget::EContentType::LOADING);

    OnlineSession->LeaveSession(
    OnlineSession->GetPredefinedSessionNameFromType(EAccelByteV2SessionType::GameSession));
    }
  3. 以前にいくつかのコールバック関数を準備しました。これらが機能するためには、デリゲートにバインドする必要があります。CPP ファイル内で、NativeOnActivated に移動し、以下のコードに置き換えます。

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

    // Get online session
    UOnlineSession* BaseOnlineSession = GetWorld()->GetGameInstance()->GetOnlineSession();
    if (!ensure(BaseOnlineSession))
    {
    return;
    }
    OnlineSession = Cast<UAccelByteWarsOnlineSessionBase>(BaseOnlineSession);
    ensure(OnlineSession);

    // Get parent menu widget
    W_Parent = GetFirstOccurenceOuter<UCreateMatchSessionWidget>();
    if (!ensure(W_Parent))
    {
    return;
    }

    OnlineSession->GetOnCreateSessionCompleteDelegates()->AddUObject(this, &ThisClass::OnCreateSessionComplete);
    OnlineSession->GetOnLeaveSessionCompleteDelegates()->AddUObject(this, &ThisClass::OnCancelJoiningSessionComplete);
    OnlineSession->GetOnSessionServerUpdateReceivedDelegates()->AddUObject(this, &ThisClass::OnSessionServerUpdateReceived);

    Btn_StartMatchSessionP2P->OnClicked().AddUObject(this, &ThisClass::CreateSession);
    }
  4. また、不要になったときに適切にアンバインドする必要があります。そのためには、NativeOnDeactivated に移動し、以下のコードに置き換えます。

    void UCreateMatchSessionP2PWidget_Starter::NativeOnDeactivated()
    {
    Super::NativeOnDeactivated();

    OnlineSession->GetOnCreateSessionCompleteDelegates()->RemoveAll(this);
    OnlineSession->GetOnLeaveSessionCompleteDelegates()->RemoveAll(this);
    OnlineSession->GetOnSessionServerUpdateReceivedDelegates()->RemoveAll(this);

    Btn_StartMatchSessionP2P->OnClicked().RemoveAll(this);
    W_Parent->GetProcessingWidgetComponent()->OnRetryClicked.RemoveAll(this);
    W_Parent->GetProcessingWidgetComponent()->OnCancelClicked.RemoveAll(this);
    }

マッチ参照メニューを検索、参加、および現在のセッションステータス表示に接続する

  1. BrowseMatchP2PWidget_Starter CPP ファイルを開き、FindSessions() 関数に移動します。ここでは、Online Session から FindSessions() 関数を呼び出す必要があります。バックエンドが返す最大セッション数を増やしたい場合は、Header ファイルの SessionsNumToQuery 値を増やすことができます。

    void UBrowseMatchP2PWidget_Starter::FindSessions(const bool bForce) const
    {
    W_Parent->SetLoadingMessage(TEXT_LOADING_DATA, true, false);
    W_Parent->SwitchContent(UBrowseMatchWidget::EContentType::BROWSE_LOADING);
    Btn_Refresh->SetIsEnabled(false);

    OnlineSession->FindSessions(
    OnlineSession->GetLocalUserNumFromPlayerController(GetOwningPlayer()),
    SessionsNumToQuery,
    bForce);
    }
  2. CancelJoining() 関数に移動し、以下のコードに置き換えます。マッチ作成メニューと同様に、この関数は単に LeaveSession を呼び出します。

    void UBrowseMatchP2PWidget_Starter::CancelJoining() const
    {
    W_Parent->SetLoadingMessage(TEXT_LEAVING_SESSION, false, false);
    W_Parent->SwitchContent(UBrowseMatchWidget::EContentType::JOIN_LOADING);

    OnlineSession->LeaveSession(
    OnlineSession->GetPredefinedSessionNameFromType(EAccelByteV2SessionType::GameSession));
    }
  3. JoinSession() 関数に移動し、以下のコードに置き換えて、対応する Online Session 関数を呼び出します。

    void UBrowseMatchP2PWidget_Starter::JoinSession(const FOnlineSessionSearchResult& SessionSearchResult) const
    {
    if (OnlineSession->ValidateToJoinSession.IsBound() &&
    !OnlineSession->ValidateToJoinSession.Execute(SessionSearchResult))
    {
    return;
    }

    W_Parent->SetLoadingMessage(TEXT_JOINING_SESSION, false, false);
    W_Parent->SwitchContent(UBrowseMatchWidget::EContentType::JOIN_LOADING);

    OnlineSession->JoinSession(
    OnlineSession->GetLocalUserNumFromPlayerController(GetOwningPlayer()),
    OnlineSession->GetPredefinedSessionNameFromType(EAccelByteV2SessionType::GameSession),
    SessionSearchResult);
    }
  4. コールバック関数をコールバックデリゲートにバインドします。CPP ファイル内で、NativeOnActivated に移動し、以下のコードに置き換えます。

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

    // Get online session
    UOnlineSession* BaseOnlineSession = GetWorld()->GetGameInstance()->GetOnlineSession();
    if (!ensure(BaseOnlineSession))
    {
    return;
    }
    OnlineSession = Cast<UAccelByteWarsOnlineSessionBase>(BaseOnlineSession);
    ensure(OnlineSession);

    // Get parent menu widget
    W_Parent = GetFirstOccurenceOuter<UBrowseMatchWidget>();
    if (!ensure(W_Parent))
    {
    return;
    }

    OnlineSession->GetOnLeaveSessionCompleteDelegates()->AddUObject(this, &ThisClass::OnCancelJoiningComplete);
    OnlineSession->GetOnFindSessionsCompleteDelegates()->AddUObject(this, &ThisClass::OnFindSessionComplete);
    OnlineSession->GetOnJoinSessionCompleteDelegates()->AddUObject(this, &ThisClass::OnJoinSessionComplete);
    OnlineSession->GetOnSessionServerUpdateReceivedDelegates()->AddUObject(this, &ThisClass::OnSessionServerUpdateReceived);

    Btn_Refresh->OnClicked().AddUObject(this, &ThisClass::FindSessions, true);
    W_Parent->GetJoiningWidgetComponent()->OnCancelClicked.AddUObject(this, &ThisClass::CancelJoining);

    FindSessions(false);
    }
  5. これらのコールバックを適切にアンバインドする方法を実装します。NativeOnDeactivated に移動し、以下のコードに置き換えます。

    void UBrowseMatchP2PWidget_Starter::NativeOnDeactivated()
    {
    Super::NativeOnDeactivated();

    OnlineSession->GetOnLeaveSessionCompleteDelegates()->RemoveAll(this);
    OnlineSession->GetOnFindSessionsCompleteDelegates()->RemoveAll(this);
    OnlineSession->GetOnJoinSessionCompleteDelegates()->RemoveAll(this);
    OnlineSession->GetOnSessionServerUpdateReceivedDelegates()->RemoveAll(this);

    Btn_Refresh->OnClicked().RemoveAll(this);
    W_Parent->GetJoiningWidgetComponent()->OnCancelClicked.RemoveAll(this);
    }
  6. プロジェクトをコンパイルし、エラーがないことを確認します。

リソース