UE4中UMG與C++交互 頁面文本修改


在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++的類

 

運行一下就會發現,頁面文本已經修改成我們設置的文本了。

后續會加入一些點擊的事件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM