在UE4中,有兩種方式創建ui,一種是使用slate的方式,一種是UMG,UMG是slate的封裝,是一個可視化的ui編輯器。slate則是純c++方式(之前實驗過一次slate創建頁面,代碼相當麻煩),所以准備采用UMG做幾個頁面。
在.Build.cs文件中將以下行:
PublicDependencyModuleNames.AddRange(
new
string
[] {
"Core"
,
"CoreUObject"
,
"Engine"
,
"InputCore"
});
修改為:
PublicDependencyModuleNames.AddRange(
new
string
[] {
"Core"
,
"CoreUObject"
,
"Engine"
,
"InputCore"
,
"UMG"
,
"Slate"
,
"SlateCore"
});
修改完成后,打開和你項目同名的頭文件然后添加以下包含:
#include "Runtime/UMG/Public/UMG.h" #include "Runtime/UMG/Public/UMGStyle.h" #include "Runtime/UMG/Public/Blueprint/UserWidget.h" #include "Runtime/UMG/Public/Slate/SObjectWidget.h" #include "Runtime/UMG/Public/IUMGModule.h"
創建一個HUD 的C++類
命名為SlAiMenuHUD。
首先創建個UI文件夾,在UI下創建一個藍圖控件,名字叫做SlAiMenuHUDWidget(網上一個大佬的視頻教程素材,https://didi.ke.qq.com/)。
然后在頁面中拖拽幾個控件
注意下對齊方式,比如背景圖,填充方式即可。
我們現在試着通過C++控制頁面的文本。文本的名稱叫做TxtMenuTitle。
然后創建一個C++類,繼承自UserWidget,名字與頁面名字一樣即可。
在SlAiMenuHUDWidget.h文件中:
// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "Blueprint/UserWidget.h" #include "SlAiMenuHUDWidget.generated.h" /** * */ UCLASS() class SLAICOURSE_API USlAiMenuHUDWidget : public UUserWidget { GENERATED_BODY() public: virtual bool Initialize () override; //頁面控件 class UTextBlock* TxtMenuTitle; };
在.cpp中:通過GetWidgetFromName獲取頁面控件。NSLOCTEXT處理本地化語言。
#include "SlAiMenuHUDWidget.h" #include "Engine/Engine.h" #include "TextBlock.h" bool USlAiMenuHUDWidget::Initialize () { Super::Initialize (); TxtMenuTitle = Cast<UTextBlock> ( GetWidgetFromName ( "TxtMenuTitle" ) ); if (TxtMenuTitle != nullptr) { TxtMenuTitle->SetText ( NSLOCTEXT ( "SlAiMenu" ,"Menu" ,"Menu" ) ); } return true; }
然后把widget添加到HUD中
SlAiMenuHUD.h代碼為:
// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/HUD.h" #include "SlAiMenuHUD.generated.h" /** * */ UCLASS() class SLAICOURSE_API ASlAiMenuHUD : public AHUD { GENERATED_BODY() public: ASlAiMenuHUD(); class USlAiMenuHUDWidget* MenuHUDWidget; TSubclassOf<class UUserWidget> MenuHUDWidgetClass; };
SlAiMenuHUD.cpp代碼為
// Fill out your copyright notice in the Description page of Project Settings. #include "SlAiMenuHUD.h" #include "SlAiMenuHUDWidget.h" #include "UObject/ConstructorHelpers.h" ASlAiMenuHUD::ASlAiMenuHUD () { if (GEngine && GEngine->GameViewport) { // 找到藍圖類,可以在編譯器中點擊SlAiMenuHUDWidget文件,然后按下ctrl+c即可獲取該路徑名,注意,需要加_C static ConstructorHelpers::FClassFinder<UUserWidget> MenuHUDWidgetBP ( TEXT ( "WidgetBlueprint'/Game/UI/SlAiMenuHUDWidget.SlAiMenuHUDWidget_C'" ) ); if (MenuHUDWidgetBP.Succeeded ()) { MenuHUDWidgetClass = MenuHUDWidgetBP.Class; // 得到class } MenuHUDWidget = CreateWidget<USlAiMenuHUDWidget>(GetWorld()->GetGameInstance(),MenuHUDWidgetClass ); if (MenuHUDWidget != nullptr) { MenuHUDWidget->AddToViewport (); } } }
然后將gamemode的HUD設置為該HUD
HUDClass = ASlAiMenuHUD::StaticClass();
把頁面的父類設置成C++的類
運行一下就會發現,頁面文本已經修改成我們設置的文本了。
后續會加入一些點擊的事件。