背景
很多时候,我们不想在蓝图类中写过于复杂的逻辑,希望能够在C++中处理复杂逻辑,但是有一些情况需要使用蓝图来做一些事,比如绘制菜单,用C++绘制菜单可能比较麻烦。那有没有一种方法可以在蓝图中创建菜单,然后在C++中访问这个菜单蓝图中的变量,然后处理复杂逻辑呢?答案是:有!!!
步骤
第一步
创建菜单 WBP_HallMenu
为了测试方便,这里就创建一个Button好了。
第二步
创建一个菜单逻辑代理的C++类:HallMenuHandler。
HallMenuHandler.h
#pragma once
#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "Components/Button.h"
#include "HallMenuHandler.generated.h"
/**
*
*/
UCLASS(BlueprintType, Blueprintable)
class TEST_API UHallMenuHandler : public UObject
{
GENERATED_BODY()
private:
UPROPERTY()
class UButton* TestButton;
public:
UFUNCTION(BlueprintCallable)
void SetTestButton(UButton* InButton);
private:
UFUNCTION()
void OnTestButtonClicked();
};
HallMenuHandler.cpp
#include "UI/HallMenu/HallMenuHandler.h"
void UHallMenuHandler::SetTestButton(UButton* InButton)
{
if (TestButton != nullptr)
{
return;
}
TestButton = InButton;
UE_LOG(LogTemp, Warning, TEXT("[UHallMenuHandler::SetTestButton] TestButton"));
if (TestButton != nullptr)
{
TestButton->OnClicked.AddDynamic(this, &UHallMenuHandler::OnTestButtonClicked);
}
}
void UHallMenuHandler::OnTestButtonClicked()
{
UE_LOG(LogTemp, Warning, TEXT("[UHallMenuHandler::OnTestButtonClicked] TestButton"));
//TestButton->SetVisibility(ESlateVisibility::Collapsed);
}
第三步
在菜单蓝图类中初始化HallMenuHandler类,并设置变量