Widgetと画面遷移
Widgetの制御構成
Widget制御(BP)からゲームロジックを分離したいので、以下の構成を考えます。
- Widgetマネージャ: Widgetアクターを管理する。GameInstanceSubsystemから派生させたシングルトンクラス。
- Widget: 表示とアニメーション
- Widgetアクター: Widgetのゲームロジックを制御する(C++) これら3つの要素でWidgetの制御を行います。
Widgetアクター(AWidgetBase)の定義
ベースとなるWidgetアクターclass(WidgetBase.h)の定義です。
このクラスを派生させてWidgetを制御します。
"ファクトリー"(Create)と"BPとのインターフェイス"(OnAction)があります。
OnActionでOnClickedなのど処理を行います。
//=======================================================================
/// @file WidgetBase.h
/// @brief Widgetクラスのベース
/// @author inuvatico
/// @date 2021/04/02
/// @version 1.0
/// @copyright 2020 inuvatico
/// Released under the MIT license.
/// see https://opensource.org/licenses/MIT
/// @par (new/Add/Change : 2020/10/17)
//=======================================================================
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "WidgetBase.generated.h"
UCLASS(Blueprintable, BlueprintType)
class AWidgetBase : public AActor
{
GENERATED_BODY()
public:
//! ファクトリー
static AWidgetBase* Create(UObject* Obj) {
AWidgetBase* Wg = Obj->GetWorld()->SpawnActor<AWidgetBase>(AWidgetBase::StaticClass());
return Wg;
}
public:
// BPとのインターフェイス
UFUNCTION(BlueprintCallable, Category = "WidgetBase")
virtual bool OnAction(FString Action, int32 Param0, int32 Param1) { return true; }
};
Widgetマネージャ(GInstSubInstanceMng.h)の定義
このクラスを使ってWidgetアクターの登録/取得を行います
インスタンスはUGInstSubInstanceMng::Get()で取得します。
Widgetアクターの登録
Widgetアクターの登録はSetWidget(FString Key, AWidgetBase* WidgetObj);で行います。
パラメータには取得用のkeyを指定します。
Widgetアクターの取得
Widgetアクターの取得はGetWidget(const FString Key, bool bDefault = true);で行います。
取得したいクラスのKeyを指定します。
【ヘッダ】
//=======================================================================
/// @file GInstSubInstanceMng.h
/// @brief インスタンスの管理を行う
/// @author inuvatico
/// @date 2021/04/02
/// @version 1.0
/// @copyright 2021 inuvatico
/// Released under the MIT license.
/// see https://opensource.org/licenses/MIT
/// @par (new/Add/Change : 2021/04/02)
//=======================================================================
#pragma once
#include "CoreMinimal.h"
#include "Containers/Map.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "Blueprint/UserWidget.h"
#include "GInstSubInstanceMng.generated.h"
class AWidgetBase;
//=======================================================
//! インスタンスの管理
//=======================================================
UCLASS(Blueprintable, BlueprintType)
class UGInstSubInstanceMng : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintPure, Category = "GameInstance")
static UGInstSubInstanceMng* Get();
UGInstSubInstanceMng();
virtual
~UGInstSubInstanceMng();
virtual void PostInitProperties() override {
Super::PostInitProperties();
InitWidget();
}
virtual void Initialize(FSubsystemCollectionBase& Collection) override
{
UE_LOG(LogTemp, Log, TEXT("UMyGameInstanceSubsystem::Initialize()"));
}
virtual void Deinitialize() override
{
UE_LOG(LogTemp, Log, TEXT("UMyGameInstanceSubsystem::Deinitialize()"));
}
private:
static UGInstSubInstanceMng * GInstSubInstanceMng; //! インスタンス
private:
//===============================================
// WidgetList関係
//===============================================
private:
UPROPERTY()
TMap<FString, AWidgetBase* > WidgetActorList; //ウィジェットアクターのリスト
void InitWidget();
public:
#define WIDGET_DEFAULT "WidgetDefault"
UFUNCTION(BlueprintCallable, Category = "GameInstance")
AWidgetBase* GetWidget(const FString Key, bool bDefault = true);
void SetWidget(FString Key, AWidgetBase* WidgetObj) {
WidgetActorList.Add(Key, WidgetObj);
}
AWidgetBase* SetDefaultWidget();
void ClearWidget();
};
【ソース】
//=======================================================================
/// @file GInstSubInstanceMng.h
/// @brief インスタンスの管理を行う
/// @author inuvatico
/// @date 2021/04/02
/// @version 1.0
/// @copyright 2020 inuvatico
/// Released under the MIT license.
/// see https://opensource.org/licenses/MIT
/// @par (new/Add/Change : 2020/10/17)
//=======================================================================
#include "GInstSubInstanceMng.h"
#include "UI/WidgetBase.h"
#include "Res/ResDef.h"
//================================================
//! ゲームインスタンスマネージャのポインタ
//================================================
UGInstSubInstanceMng* UGInstSubInstanceMng::GInstSubInstanceMng = nullptr;
UGInstSubInstanceMng* UGInstSubInstanceMng::Get() {
return GInstSubInstanceMng;
}
//================================================
//! コンストラクタ
//================================================
UGInstSubInstanceMng::UGInstSubInstanceMng() {
GInstSubInstanceMng = this;
}
//================================================
//! デストラクタ
//================================================
UGInstSubInstanceMng::~UGInstSubInstanceMng() {}
//================================================
//! ウィジェット関係の初期化
//================================================
void UGInstSubInstanceMng::InitWidget() {}
//================================================
//! デフォルトのWidgetActorを設定
//================================================
AWidgetBase* UGInstSubInstanceMng::SetDefaultWidget() {
AWidgetBase *Wg = AWidgetBase::Create(this);
SetWidget(WIDGET_DEFAULT, Wg);
return Wg;
}
//================================================
//! WidgetActorの解放
//================================================
void UGInstSubInstanceMng::ClearWidget() {
WidgetActorList.Empty();
}
//================================================
//! WidgetActorの取得
//================================================
AWidgetBase* UGInstSubInstanceMng::GetWidget(
const FString Key, //!< 取得したいActorのKey
bool bDefault //!< true: Actorが未登録の場合、defaultのクラスを返す
) {
AWidgetBase* Wg = nullptr;
if (WidgetActorList.Contains(Key)) {
if (WidgetActorList[Key]) {
return WidgetActorList[Key];
}
}
if (bDefault) {
if (WidgetActorList.Contains(Key)) {
if (WidgetActorList[WIDGET_DEFAULT]) {
return WidgetActorList[WIDGET_DEFAULT];
}
}
return SetDefaultWidget();
}
return nullptr;
}