ue4

Widgetと画面遷移


ボタン(WBP_TestMenu)の作成

エディタを使ってボタンを一つ配置します。 vatico

ブループリントの編集

変数WidgetBaseを追加します。

コンストラクタでの処理

  1. コンストラクタでWidgetBaseに参照先をセットします。(GInstSubInstanceMngから取得)
  2. キーには"TestMenu"を使います。

クリックイベントの処理

OnClickedイベントが発生したら、WidgetBaseの"OnAction"を呼び出します。
パラメータActionにはOnClickedを指定します。

vatico

Widgetアクター (ATestMenu)の実装

widgetアクター (ATestMenu)はAWidgetBaseを継承したクラスです。
CreateとOnActionメソッドを実装しています。
OnClickedイベントはOnActionを呼び出して行います。

Createメソッド

Createメソッドは以下の処理を行います。

  1. ATestMenuの作成
  2. ATestMenuの登録
  3. ボタン(WBP_TestMenu)の作成

また、ResDef.hで定義されたUIE_TEST_MENUとUIR_TEST_MENUを使用しています。

#define UIR_TEST_MENU "/Game/00PRJ/UI/Test/WBP_TestMenu.WBP_TestMenu_C" //!< テスト用のボタン
#define UIE_TEST_MENU "TestMenu" //登録名

UIDef.hはUIの表示順番に関する定義です。

//---------------------------------------------------
///ウィジェットの描画順番 
/// 値が大きい程、後に描画される
//---------------------------------------------------
enum {
    ZO_TOPFADE = 101,
    ZO_MENU = 100
};

UserWidget->AddToViewport(ZO_MENU);のようにつかいます。

OnActionメソッド

OnActionメソッドはOnClickedイベント等から呼び出されて必要な処理を行います。

ATestMenu.h/cpp

ATestMenu.h

//=======================================================================
///  @file TestMenu.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) 
//=======================================================================
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "UI/WidgetBase.h"
#include "TestMenu.generated.h"

UCLASS(Blueprintable, BlueprintType)
class ATestMenu : public AWidgetBase
{
    GENERATED_BODY()
public: 
    static ATestMenu* Create(UObject* Obj);
public: 
    virtual bool OnAction(FString Action, int32 Param0, int32 Param1);
};

ATestMenu.cpp

//=======================================================================
///  @file TestMenu.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 "TestMenu.h"
#include "Runtime/Engine/Classes/Kismet/GameplayStatics.h"
#include "Res/ResDef.h"
#include "App/UI/Fade/WgFade.h"
#include "GameInstance/sub/GInstSubInstanceMng.h"
#include "UI/UIDef.h"

#pragma optimize("", off) 

//=====================================================
//! メニューの作成
//=====================================================
ATestMenu* ATestMenu::Create(UObject* Obj) {

    ATestMenu* Wg =  Cast<ATestMenu>(UGInstSubInstanceMng::Get()->GetWidget(UIE_TEST_MENU, false));
    if (!Wg) {

        Wg = Obj->GetWorld()->SpawnActor<ATestMenu>(ATestMenu::StaticClass());
        UGInstSubInstanceMng::Get()->SetWidget(UIE_TEST_MENU, Wg);

        // ウィジェットの読み込み
        {
            FString path = UIR_TEST_MENU;
            TSubclassOf<class UUserWidget> WidgetClass;
            WidgetClass = TSoftClassPtr<UUserWidget>(FSoftObjectPath(*path)).LoadSynchronous();
            UUserWidget* UserWidget = CreateWidget<UUserWidget>(Obj->GetWorld(), WidgetClass);
            UserWidget->AddToViewport(ZO_MENU);
        }
    }
    return Wg;
}

//=====================================================
//! OnAction
//=====================================================
bool ATestMenu::OnAction(FString Action, int32 Param0, int32 Param1) {
    UE_LOG(LogTemp, Log, TEXT("ATestMenu:%s"), *Action);
    GEngine->AddOnScreenDebugMessage(-1, 5, FColor::Orange, FString::Printf(TEXT("ATestMenu:%s"), *Action));

    if (Action == "OnClicked") {
        //-------------------------------------------
        //OnClickedを処理する
        //-------------------------------------------
        return true;
    }
    return false;
}
prev/next







digitalize
  始めました。