虚幻学习笔记15—C++和UI(一)

一、前言

在C++可以直接创建按钮、滚轮等UI,并且可以直接绑定并处理响应事件。在创建C++代码后还是需要通过蓝图来显示到应用中,总体来说还是不如直接用蓝图来的方便。

本文使用的虚幻引擎为5.2.1。

二、实现

2.1、创建UUserWidgetl类型的C++类

声明两个按钮并创建两个按钮的点击事件处理方法,头文件代码如下,这里只是声明了两个按钮并没有实际创建按钮,需要在后续的蓝图UI中进行绑定。

cpp 复制代码
#pragma once

#include "CoreMinimal.h"
#include "Components/Button.h"
#include "Blueprint/UserWidget.h"
#include "MyUserWidget.generated.h"

/**
 *
 */
UCLASS()
class CHAPTER2_API UMyUserWidget : public UUserWidget
{
	GENERATED_BODY()

public:

	//这里设定的"buttonStart"按钮名称后面创建蓝图类UI中按钮的名称和这个一样
	UPROPERTY(meta = (BindWidget))
	UButton* ButtonStart;
	UPROPERTY(meta = (BindWidget))
	UButton* ButtonQuit;

public:

	virtual bool Initialize()override;

public:

	UFUNCTION()
	void BtnClick_Start();
	UFUNCTION()
	void BtnClick_Quit();
};

注:在代码里声明两个按钮,其必须在后续的蓝图类中体现,包括名字也要一样,否则会编译错误,甚至编辑器直接崩。

在初始化函数里将按钮的点击进行绑定,同时编写按钮点击事件处理函数的信息,代码如下:

cpp 复制代码
bool UMyUserWidget::Initialize()
{
	if (!Super::Initialize())
	{
		return false;
	}

	ButtonStart->OnClicked.AddDynamic(this, &UMyUserWidget::BtnClick_Start);
	ButtonQuit->OnClicked.AddDynamic(this, &UMyUserWidget::BtnClick_Quit);

	return true;
}

void UMyUserWidget::BtnClick_Start()
{
	GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Green, TEXT("Button Start"));
}

void UMyUserWidget::BtnClick_Quit()
{
	GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("Button Quit"));
}

2.2、创建UI蓝图

这一步和之前直接创建C++的蓝图类不同,如图2.2.1所示,如果点击创建该类的蓝图类的话只会创建了一个蓝图类,它并没有真正的UI元素。
图2.2.1

我们需要的是单独创建一个控件蓝图,然后在其父类设置时选择2.1创建的类。

在选择父类时需要先创建2.1中生命的两个类,并且一定要名称一致,如图2.2.2所示,按钮或其他控件可以创建多个,但是这两个类型必须有而且名字必须一样,否则在绑定父类时直接导致编
图2.2.2

辑器崩溃,如图2.2.3所示为没有"ButtonStart"按钮的情况下设置父类后直接导致编辑器崩溃


图2.2.3

崩的信息也是提示C++代码中没有这个按钮,然后进行了绑定。当再次打开编辑器的并尝试打开蓝图的情况下,会提示无法打开,或者打开后蓝图的父类回复默认的"用户控件"。并且再在父类中选择时已经找不到之前2.1创建的类了,同时C++类文件中也没有这个类了。需要重新编译C++代码才会再出现

2.3、添加到场景中

这一步和在蓝图中创建UI并添加到视口的逻辑是一样的,需要在PlayController或者其他的系统管理类中创建2.2中创建的蓝图类,并添加到视口,代码如下,创建的TEXT路径即为2.2中蓝图

cpp 复制代码
#include "Blueprint/UserWidget.h"//需要添加的头文件

void AMyPlayerController1::BeginPlay()
{
	Super::BeginPlay();
	//这里的参数NULL和表示只是加载到场景中,不会加载到这个类下面
	UClass* WidgetCalss = LoadClass<UUserWidget>(NULL, TEXT("/Script/UMGEditor.WidgetBlueprint'/Game/BluePrint/UMG_Widget.UMG_Widget_C'"));
	UUserWidget* MyWidgetClass = nullptr;
	MyWidgetClass = CreateWidget<UUserWidget>(GetWorld(), WidgetCalss);
	MyWidgetClass->AddToViewport();

}

类的"复制引用"后的路径,同时需要再后面添加"_C"的后缀。

三、总结

3.1、创建C++的按钮变量名称一定要在后续蓝图控件中创建,类型和名称都要一致,否则会编译报错,甚至编辑器崩。

相关推荐
lqqjuly2 小时前
特殊的“Undefined Reference xxx“编译错误
c语言·c++
冰红茶兑滴水3 小时前
云备份项目--工具类编写
linux·c++
刘好念3 小时前
[OpenGL]使用 Compute Shader 实现矩阵点乘
c++·计算机图形学·opengl·glsl
酒鬼猿4 小时前
C++进阶(二)--面向对象--继承
java·开发语言·c++
姚先生974 小时前
LeetCode 209. 长度最小的子数组 (C++实现)
c++·算法·leetcode
小王爱吃月亮糖5 小时前
QT开发【常用控件1】-Layouts & Spacers
开发语言·前端·c++·qt·visual studio
aworkholic5 小时前
opencv sdk for java中提示无stiching模块接口的问题
java·c++·opencv·jni·opencv4android·stiching
程序员老冯头5 小时前
第十六章 C++ 字符串
开发语言·c++
Xenia2235 小时前
复习篇~第二章程序设计基础
c++·算法
想睡觉 . 我也想睡觉 .5 小时前
【C++算法】1.【模板】前缀和
开发语言·c++·算法