UE4使用UMG接口操作界面


原文鏈接:http://gad.qq.com/article/detail/7181131

本文首發騰訊GAD開發者平台,未經允許,不得轉載


UE4的藍圖之強大讓人欲罷不能,但是實際在項目的開發中,C++與藍圖都需要結合使用,單獨選擇一樣開發都不是特別科學,這里我就來研究了一下C++使用UMG接口來操作界面,我的目的非常簡單,用C++來創建界面,並在創建成功的時候,告訴界面打印出相關信息。

1.創建一個C++的空模板工程,命名UMGProject,用VS打開工程文件,找到UMGProject.Build.cs,在PublicDependencyModuleNames后面添加UMG模塊,並取消PrivateDependencyModuleNames的注釋,並編譯工程。
using UnrealBuildTool;
public class UMGProject : ModuleRules
{
	public UMGProject(TargetInfo Target)
	{
		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore","UMG" });

		PrivateDependencyModuleNames.AddRange(new string[] {  });

		// Uncomment if you are using Slate UI
		 PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
		
		// Uncomment if you are using online features
		// PrivateDependencyModuleNames.Add("OnlineSubsystem");

		// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
	}
}

2.回到UE4的工程中,在Content下創建一個Blueprint的文件夾,在Blueprint下右鍵空白處點擊選擇User Interface/Wiget Blueprint,命名BP_UI
3.雙擊打開BP_UI,在中間添加一個Text控件,並設置為顯眼一點的紅色,並設置它的IsVariable為true,后面再創建函數的時候才方便使用。
4.並且我在BP_UI里面創建一個函數接口,在右上角點擊Graph,添加一個Functions,命令為ShowMessage,功能就是用Text顯示傳送過來的信息。

5.在C++ Classes下面創建一個新的Class,繼承自PlayerController,命名為UMGPlayerController,用VS打開后,我們需要在UMGPlayerController.h文件中的UCLASS里面添加Abstract和Blueprintable,UCLASS表示類修飾符,里面的參數是類具體的表述。
Abstract 類修飾符將類聲明為“抽象基類”,這樣會阻止用戶在虛幻編輯器中向這個世界中添加這個類的Actor,或者在游戲過程中創建這個類的實例,而 Blueprintable 指定該類為創建藍圖的可接受基類。除非被繼承,否則默認值為NotBlueprintable。它由子類繼承。
同時在這個類中,我們還會用到一個函數修飾符,BlueprintImplementableEvent,表示 此函數可以在藍圖或關卡藍圖圖表內進行重載。 這里就是用於C++與藍圖的交互接口,同時這個函數不用在cpp中再去實現它,完成后編譯。
#include "GameFramework/PlayerController.h"
#include "UMGPlayerController.generated.h"
/**
 * 
 */
UCLASS(Abstract, Blueprintable)
class UMGPROJECT_API AUMGPlayerController : public APlayerController
{
	GENERATED_BODY()
public:
		/**此函數可以在藍圖或關卡藍圖圖表內進行重載*/
		UFUNCTION(BlueprintImplementableEvent, Category = "UMG")
		void PrintMessage(const FString &Message);
};

6.在ue4中,Content/Blueprint下創建一個新的藍圖繼承自上面所寫的UMGPlayerController,命名為BP_UMGController。
7.我們再打開C++下面的UMGProjectGameMode,詳細解釋,都寫在了注釋中,主要在C++的頂上要添加UMG.h的頭文件,在UMG.h包括了UMG整個模塊的所有頭文件,所以我們只添加它一個就可以了,在完成后,編譯一下。
頭文件:
#pragma once
#include "UMG.h"
#include "GameFramework/GameMode.h"
#include "UMGProjectGameMode.generated.h"
/**
 * 
 */
UCLASS()
class UMGPROJECT_API AUMGProjectGameMode : public AGameMode
{
	GENERATED_BODY()
public:
	AUMGProjectGameMode();
	~AUMGProjectGameMode();

	virtual void BeginPlay() override;
	//獲取菜單
	UFUNCTION(BlueprintCallable, Category = "UMG")
	UUserWidget* GetCountWidget();

protected:
	//菜單
	UPROPERTY()
	UUserWidget* CountWidget;
	//創建菜單
	void CreateCountWidget();
};

源文件:

#include "UMGProject.h"
#include "UMGProjectGameMode.h"
#include "UMGPlayerController.h"

AUMGProjectGameMode::AUMGProjectGameMode()
{
	//通過路徑找到藍圖,並將藍圖控制器的類設置給PlayerControllerClass  
	static ConstructorHelpers::FClassFinder<AUMGPlayerController> UMGControllerClassFinder(TEXT("/Game/Blueprint/BP_UMGController"));
	PlayerControllerClass = UMGControllerClassFinder.Class;

	CreateCountWidget();
}
AUMGProjectGameMode::~AUMGProjectGameMode()
{
}

void AUMGProjectGameMode::BeginPlay()
{
	Super::BeginPlay();
	//獲取PlayerController並調用開始所寫的PrintMessage函數
	Cast<AUMGPlayerController>(GetWorld()->GetFirstPlayerController())->PrintMessage(TEXT("開始游戲~~~"));
}

UUserWidget* AUMGProjectGameMode::GetCountWidget()
{
	//返回計數界面
	return CountWidget;
}

void AUMGProjectGameMode::CreateCountWidget()
{
	//通過路徑找到藍圖
	static ConstructorHelpers::FClassFinder<UUserWidget> UMGClassFinder(TEXT("/Game/Blueprint/BP_UI"));
	//通過藍圖的類,創建菜單
	CountWidget = CreateWidget<UUserWidget>(GetWorld(), UMGClassFinder.Class);
	//添加到視圖中
	if (CountWidget != nullptr)
		CountWidget->AddToViewport();
}

8.再打開ue4的BP_UMGController,點擊Functions的Override,就會看到我們所寫的PrintMessage
然后點擊PrintMessage鏈接以下藍圖,就是在調用PrintMessage的時候,我們再去調用UI的ShowMessage,將傳來的Message顯示出來。
9.編譯運行,運行順序差不多就是在GameMode的構造函數里面設置PlayerController,然后通過路徑找到並創建我們的BP_UI,然后再在BeginPlay里面輸出文字信息。
感覺繞了一大圈,做了一個特別小的功能,不過這里主要也是為了表現C++使用UMG的接口,和C++調用藍圖的函數,在實際開發中C++與藍圖的交互是相當重要的。


免責聲明!

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



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