一、环境说明,UE5.4 + vs2022 + win11
二、UE5.4中内容浏览器找不到C++类文件夹说明
在ue5中默认不显示C++类的文件夹,可以通过正常添加C++文件使文件夹显示在内容管理其中,点击工具->新建C++类->选择你需要创建的类(当你创建的C++类的父类时空时不会再内容管理器中显示C++类文件夹)->创建该类->编译,回到内容浏览器后可以看到C++类文件夹已经出来了,没看见可以查看是否在设置中将C++类的勾选是否打上对号
三、创建类
在创建类时选择创建以UserWidget为父类的C++文件,同时可以看见在C++类文件夹中出现一个C++类的图片,图片的名字是创建的类的名字(我将userwidget放在了HUD文件中)
对C++类单机右键选择创建基于类的蓝图类,将创建的蓝图类放到自己想放的文件夹中
双击控件蓝图进入蓝图编辑界面在蓝图中放入一个画布画板,在画板中放入一个button,button的名字是buttonclicked,点击上方的编译按钮,点击保存,关闭当前界面
进入VS项目,可以通过工具->打开VS项目快速进入
在xxx.h文件中代码如下
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "MyUserWidget.generated.h"
/**
*
*/
UCLASS()
class UELEARNING_API UMyUserWidget : public UUserWidget
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
void MenuSetUp();
protected:
virtual bool Initialize() override;
public:
UPROPERTY(meta = (BindWidget))
class UButton* buttonclicked;
private:
UFUNCTION()
void MyTestPrint();
};
其中UFUNCTION(BlueprintCallable)声明了该函数可以在蓝图中可以被执行,UFUNCTION()可以使MyTestPrint()函数被调用去掉宏函数不会被执行
UPROPERTY(meta = (BindWidget))声明了下面的buttonclicked和界面中的按钮绑定,按钮的名字和变量的名字保持一样
xxx.cpp代码如下
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyUserWidget.h"
#include "Components/Button.h"
void UMyUserWidget::MenuSetUp()
{
AddToViewport();/* 将小部件添加到视口 */
SetVisibility(ESlateVisibility::Visible);/* 设置可见性 */
bIsFocusable = true;/* 设置聚焦模式 */
UWorld* World = GetWorld();
if (World)
{
APlayerController* PlayerController = World->GetFirstPlayerController();
if (PlayerController)
{
FInputModeUIOnly InputModeData;
InputModeData.SetWidgetToFocus(TakeWidget());/* 设置只关注与小部件 */
InputModeData.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock);/* 设置鼠标光标锁定 */
PlayerController->SetInputMode(InputModeData);//设置模式集中于界面
PlayerController->SetShowMouseCursor(true);/* 看到光标 */
}
}
}
bool UMyUserWidget::Initialize()
{
if (!Super::Initialize())
{
return false;
}
if (buttonclicked)
{
buttonclicked->OnClicked.AddDynamic(this, &UMyUserWidget::MyTestPrint);//绑定回调函数
}
return true;
}
void UMyUserWidget::MyTestPrint()
{
GEngine->AddOnScreenDebugMessage(
-1,
15.f,
FColor::Yellow,
FString::Printf(TEXT("this is my button clickedfunction"))
);
}
最后打开管卡蓝图
在 event beginplay中通过箭头调用函数createwidget,在class中选择创建的界面蓝图的名字,再通过箭头调用类中的menusetup函数,点击编译,保存。
最终效果 在点击clicked按钮后界面左上角会出现打印的话