Widgetと画面遷移
ボタン(WBP_TestMenu)の作成
エディタを使ってボタンを一つ配置します。
ブループリントの編集
変数WidgetBaseを追加します。
コンストラクタでの処理
- コンストラクタでWidgetBaseに参照先をセットします。(GInstSubInstanceMngから取得)
- キーには"TestMenu"を使います。
クリックイベントの処理
OnClickedイベントが発生したら、WidgetBaseの"OnAction"を呼び出します。
パラメータActionにはOnClickedを指定します。
Widgetアクター (ATestMenu)の実装
widgetアクター (ATestMenu)はAWidgetBaseを継承したクラスです。
CreateとOnActionメソッドを実装しています。
OnClickedイベントはOnActionを呼び出して行います。
Createメソッド
Createメソッドは以下の処理を行います。
- ATestMenuの作成
- ATestMenuの登録
- ボタン(WBP_TestMenu)の作成
また、ResDef.hで定義されたUIE_TEST_MENUとUIR_TEST_MENUを使用しています。
- 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;
}