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

セッション作成メニューを追加する - セッション入門 - (Unreal Engine モジュール)

Last updated on February 4, 2026

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

メニューの内容

このチュートリアルでは、セッションの作成とセッションからの離脱リクエストを送信するために使用するセッション作成ユーザーインターフェース(UI)メニューを準備する方法を学びます。ファイルは リソース セクションで提供されており、2つの部分で構成されています。

  • CreateSessionWidget_Starter: 実装の大部分を保持するC++クラス。
    • ヘッダーファイル: /Source/AccelByteWars/TutorialModules/Play/SessionEssentials/UI/CreateSessionWidget_Starter.h
    • CPPファイル: /Source/AccelByteWars/TutorialModules/Play/SessionEssentials/UI/CreateSessionWidget_Starter.cpp
  • W_CreateSession_Starter: Unreal Motion Graphics(UMG)を使用して作成および設計されたウィジェットブループリントクラス。
    • ウィジェットブループリントファイル: /Content/TutorialModules/Play/UI/W_CreateSession_Starter.uasset
備考

UMGの詳細については、UMG UI Designerをお読みください。

セッション作成メニューには4つの状態があります。

  • デフォルト: セッション作成ボタンを表示します。
  • ロード中: リクエストが送信され、レスポンスを待機していることを表示します。
  • エラー: リクエストが失敗した場合、またはエラーレスポンスを受信した場合にエラーメッセージを表示します。
  • 成功: 作成されたセッションのIDと離脱ボタンを表示します。

状態の変更は、エンジンが提供するコンポーネントである Widget Switcher と、空、ロード中、エラー、成功の状態を表示するための事前定義された子ウィジェットを持つカスタム Widget Switcher である AccelByteWars Widget Switcher の組み合わせを使用して可能になります。

備考

Widget Switcherの詳細については、Unreal Engine API Referenceをお読みください。

以下は、C++ヘッダーファイルでのこれらのウィジェットの宣言です。

private:
// ...
UPROPERTY(BlueprintReadOnly, meta = (BindWidget, BlueprintProtected = true, AllowPrivateAccess = true))
UWidgetSwitcher* Ws_ContentOuter;

UPROPERTY(BlueprintReadOnly, meta = (BindWidget, BlueprintProtected = true, AllowPrivateAccess = true))
UWidget* W_Selection;

UPROPERTY(BlueprintReadOnly, meta = (BindWidget, BlueprintProtected = true, AllowPrivateAccess = true))
UAccelByteWarsWidgetSwitcher* Ws_Processing;

これらのウィジェットの状態を変更するユーティリティ関数が提供されています。この関数は、Widget Switcherの子とコントローラーのフォーカスの切り替えを処理します。

void UCreateSessionWidget_Starter::SwitchContent(const EContentType Type)
{
UWidget* ContentTarget = nullptr;
UWidget* FocusTarget = nullptr;
EAccelByteWarsWidgetSwitcherState ProcessingWidgetState = EAccelByteWarsWidgetSwitcherState::Empty;
bool bEnableBackButton = true;

switch (Type)
{
case EContentType::CREATE:
ContentTarget = W_Selection;
ProcessingWidgetState = EAccelByteWarsWidgetSwitcherState::Loading;
FocusTarget = Btn_CreateSession;
break;
case EContentType::LOADING:
ContentTarget = Ws_Processing;
ProcessingWidgetState = EAccelByteWarsWidgetSwitcherState::Loading;
bEnableBackButton = false;
break;
case EContentType::SUCCESS:
ContentTarget = Ws_Processing;
ProcessingWidgetState = EAccelByteWarsWidgetSwitcherState::Not_Empty;
FocusTarget = Btn_Leave;
break;
case EContentType::ERROR:
ContentTarget = Ws_Processing;
ProcessingWidgetState = EAccelByteWarsWidgetSwitcherState::Error;
FocusTarget = Btn_Back;
break;
default: ;
}

// Display the target widget. If the last widget is different, enable force state to directly display the correct initial state.
const bool bForceState = Ws_ContentOuter->GetActiveWidget() != ContentTarget;
Ws_ContentOuter->SetActiveWidget(ContentTarget);
Ws_Processing->SetWidgetState(ProcessingWidgetState, bForceState);

// Refresh widget focus.
Btn_Back->SetIsEnabled(bEnableBackButton);
bIsBackHandler = bEnableBackButton;
if (FocusTarget)
{
DesiredFocusTargetButton = FocusTarget;
FocusTarget->SetUserFocus(GetOwningPlayer());
}
RequestRefreshFocus();

// Set FTUEs
if (Type == EContentType::SUCCESS)
{
InitializeFTUEDialogues(true);
}
else
{
DeinitializeFTUEDialogues();
}
}

デフォルト状態

デフォルト状態は、Btn_CreateSessionというボタンを表示し、C++親クラスにバインドされています。

ボタンタイプとしてCommon Button Baseを使用します。

以下のコードは、クラスヘッダーファイルでのボタンの宣言です。

private:
// ...
UPROPERTY(BlueprintReadOnly, meta = (BindWidget, BlueprintProtected = true, AllowPrivateAccess = true))
UCommonButtonBase* Btn_CreateSession;

Preview of the Default state unreal engine session essentials

ロード中状態

ロード中状態は、カスタムWidget SwitcherであるWs_Processingによって提供されます。この状態は、ロード中メッセージのみで構成されています。

Preview of the Loading state unreal engine session essentials

エラー状態

エラー状態もWs_Processingによって提供され、エラーメッセージとリトライボタンで構成されています。

Preview of the Error state unreal engine session essentials

成功状態

成功状態は、セッション作成成功のメッセージ、セッションIDを表示するためのTb_SessionIdというテキストボックス、およびBtn_leaveという離脱ボタンで構成されています。

以下は、テキストボックスとボタンの宣言です。

private:
// ...
UPROPERTY(BlueprintReadOnly, meta = (BindWidget, BlueprintProtected = true, AllowPrivateAccess = true))
UCommonButtonBase* Btn_Leave;
// ...
UPROPERTY(BlueprintReadOnly, meta = (BindWidget, BlueprintProtected = true, AllowPrivateAccess = true))
UTextBlock* Tb_SessionId;

Preview of Success state

UIの準備

このセクションでは、AccelByte Gaming Services(AGS)セッション統合のためにUIを準備します。

  1. セッション作成を実装するには、Visual StudioでCreateSessionWidget_Starterクラスヘッダーファイルを開き、以下のコードを追加します。

    protected:
    // ...
    UFUNCTION()
    void CreateSession();

    UFUNCTION()
    void OnCreateSessionComplete(FName SessionName, bool bSucceeded);
  2. CreateSessionWidget_StarterクラスCPPファイルを開き、以下のコードを追加します。これらのコードは、セッション作成リクエストを送信するときと完了したときのUI変更を処理します。後で、バックエンドへの実際のリクエストを呼び出すコードを追加します。

    void UCreateSessionWidget_Starter::CreateSession()
    {
    if (!SessionOnlineSession)
    {
    return;
    }

    // An event to validate to start the session will be used in the Play with Party module.
    if (SessionOnlineSession->ValidateToStartSession.IsBound() &&
    !SessionOnlineSession->ValidateToStartSession.Execute())
    {
    return;
    }

    Ws_Processing->LoadingMessage = TEXT_REQUESTING_SESSION_CREATION;
    SwitchContent(EContentType::LOADING);
    // ...
    }
    void UCreateSessionWidget_Starter::OnCreateSessionComplete(FName SessionName, bool bSucceeded)
    {
    // Abort if not a game session.
    if (!SessionName.IsEqual(SessionOnlineSession->GetPredefinedSessionNameFromType(EAccelByteV2SessionType::GameSession)))
    {
    return;
    }

    if (bSucceeded)
    {
    // Get session ID
    const FNamedOnlineSession* OnlineSession = SessionOnlineSession->GetSession(SessionName);
    Tb_SessionId->SetText(FText::FromString(OnlineSession->GetSessionIdStr()));

    SwitchContent(EContentType::SUCCESS);
    }
    else
    {
    Ws_Processing->ErrorMessage = TEXT_FAILED_TO_CREATE_SESSION;
    Ws_Processing->bShowRetryButtonOnError = true;
    SwitchContent(EContentType::ERROR);
    }
    }
  3. セッションからの離脱を実装するには、CreateSessionWidget_Starterクラスヘッダーファイルを開き、以下のコードを追加します。

    protected:
    // ...
    UFUNCTION()
    void LeaveSession();

    UFUNCTION()
    void OnLeaveSessionComplete(FName SessionName, bool bSucceeded);
  4. CreateSessionWidget_StarterクラスCPPファイルを開き、以下のコードを追加します。これらは、現在のセッションから離脱するリクエストを送信するときと完了したときのUI変更を処理します。後で、バックエンドへの実際のリクエストを呼び出すコードを追加します。

    void UCreateSessionWidget_Starter::LeaveSession()
    {
    if (!SessionOnlineSession)
    {
    return;
    }

    Ws_Processing->LoadingMessage = TEXT_LEAVING_SESSION;
    SwitchContent(EContentType::LOADING);
    // ...
    }
    void UCreateSessionWidget_Starter::OnLeaveSessionComplete(FName SessionName, bool bSucceeded)
    {
    // Abort if not a game session.
    if (!SessionName.IsEqual(SessionOnlineSession->GetPredefinedSessionNameFromType(EAccelByteV2SessionType::GameSession)))
    {
    return;
    }

    if (bSucceeded)
    {
    SwitchContent(EContentType::CREATE);
    }
    else
    {
    Ws_Processing->ErrorMessage = TEXT_FAILED_TO_LEAVE_SESSION;
    Ws_Processing->bShowRetryButtonOnError = false;
    SwitchContent(EContentType::ERROR);
    }
    }
  5. 対応するボタンに関数をバインドするには、CreateSessionWidget_StarterクラスCPPファイル内のNativeOnActivatedに以下の強調表示されたコードを追加します。

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

    #pragma region "UI related"
    Btn_Back->OnClicked().AddUObject(this, &ThisClass::DeactivateWidget);
    Btn_CreateSession->OnClicked().AddUObject(this, &ThisClass::CreateSession);
    Btn_Leave->OnClicked().AddUObject(this, &ThisClass::LeaveSession);
    Ws_Processing->OnRetryClicked.AddUObject(this, &ThisClass::CreateSession);
    #pragma endregion
    // ...
    }
  6. ウィジェットが閉じるときにこれらの関数をアンバインドするには、同じCPPファイルのNativeOnDeactivatedに移動し、以下の強調表示されたコードを追加します。

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

    #pragma region "UI related"
    Btn_Back->OnClicked().RemoveAll(this);
    Btn_CreateSession->OnClicked().RemoveAll(this);
    Btn_Leave->OnClicked().RemoveAll(this);
    Ws_Processing->OnRetryClicked.RemoveAll(this);
    #pragma endregion
    // ...
    }
  7. Visual StudioでByte Warsをビルドし、Unreal Editorで開きます。

  8. Unreal EditorのContent Browserから、/Content/TutorialModules/Play/SessionEssentials/UI/に移動し、W_CreateSession_Starterを開きます。すべてのウィジェットがBind Widgetsタブで適切にバインドされており、Parent classCreateSessionWidget_Starterに設定されていることを確認します。

    Bind widgets tab Unreal Engine session essentials

  9. セッション作成ウィジェットをテストするには、Content/TutorialModules/Play/SessionEssentials/DA_SessionEssentials.uassetを開き、Is Starter Mode Activeを有効にします。Data Assetを保存します。

    Data Asset changes preview Unreal Engine session essentials

  10. エディターでゲームをプレイし、Online Play > Create a Sessionに移動すると、正しく実装されている場合はCreate Eliminationボタンが表示されます。

リソース