ue4

Widgetと画面遷移


Widgetの制御構成

Widget制御(BP)からゲームロジックを分離したいので、以下の構成を考えます。
vatico

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;
}

prev/next







digitalize
  始めました。