セッション作成メニューを追加する - セッション入門 - (Unreal Engine モジュール)
注釈:本資料は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;

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

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

成功状態
成功状態は、セッション作成成功のメッセージ、セッション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;

UIの準備
このセクションでは、AccelByte Gaming Services(AGS)セッション統合のためにUIを準備します。
-
セッション作成を実装するには、Visual Studioで
CreateSessionWidget_Starterクラスヘッダーファイルを開き、以下のコードを追加します。protected:
// ...
UFUNCTION()
void CreateSession();
UFUNCTION()
void OnCreateSessionComplete(FName SessionName, bool bSucceeded); -
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);
}
} -
セッションからの離脱を実装するには、
CreateSessionWidget_Starterクラスヘッダーファイルを開き、以下のコードを追加します。protected:
// ...
UFUNCTION()
void LeaveSession();
UFUNCTION()
void OnLeaveSessionComplete(FName SessionName, bool bSucceeded); -
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);
}
} -
対応するボタンに関数をバインドするには、
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
// ...
} -
ウィジェットが閉じるときにこれらの関数をアンバインドするには、同じ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
// ...
} -
Visual StudioでByte Warsをビルドし、Unreal Editorで開きます。
-
Unreal EditorのContent Browserから、
/Content/TutorialModules/Play/SessionEssentials/UI/に移動し、W_CreateSession_Starterを開きます。すべてのウィジェットがBind Widgetsタブで適切にバインドされており、Parent classがCreateSessionWidget_Starterに設定されていることを確認します。
-
セッション作成ウィジェットをテストするには、
Content/TutorialModules/Play/SessionEssentials/DA_SessionEssentials.uassetを開き、Is Starter Mode Activeを有効にします。Data Assetを保存します。
-
エディターでゲームをプレイし、Online Play > Create a Sessionに移動すると、正しく実装されている場合はCreate Eliminationボタンが表示されます。
リソース
- このチュートリアルセクションで使用されているファイルは、Byte Wars Unreal GitHubリポジトリで入手できます。
- AccelByteWars/Content/TutorialModules/Play/SessionEssentials/DA_SessionEssentials.uasset
- AccelByteWars/Content/TutorialModules/Play/SessionEssentials/UI/W_CreateSession_Starter.uasset
- AccelByteWars/Source/AccelByteWars/TutorialModules/Play/SessionEssentials/UI/CreateSessionWidget_Starter.h
- AccelByteWars/Source/AccelByteWars/TutorialModules/Play/SessionEssentials/UI/CreateSessionWidget_Starter.cpp