UE4 C++与蓝图深度交互

关山月

· 数字孪生,C++

1.C++声明函数,蓝图实现该函数,C++调用

  首先,在C++类中声明一个方法,使用BlueprintImplementableEvent标识该方法为蓝图实现事件;

/*此函数可以在蓝图或关卡蓝图图表内进行重载*/ UFUNCTION(BlueprintImplementableEvent, Category="SplineMesh") void PrintMessage(const FString &Message)

  其次,新建一个蓝图继承此类,并重载PrintMessage函数

broken image

2.C++声明函数,并添加默认实现,蓝图可实现,可不实现,如未实现,则使用C++默认实现方法

//C++实现默认版本,蓝图可override实现  UFUNCTION(BlueprintNativeEvent, Category="NativeEvent")  void FuncNativeBPEvent();

C++实现该函数时,函数名称要加上“_Implementation”,如下:

void FuncNativeBPEvent_Implementation() {       // 函数具体实现  }

 C++ 可以通过命令行的方式调用蓝图实现的方法并传递参数,当然,前提是你能够获取到拥有这个方法的对象(DCRLabelWidget);下面例子中,我们调用DCRLabelWidget对象的名为SetName的方法,并传入参数“0011”.

#include "Misc/OutputDeviceDebug.h"  FString FieldName = TEXT("0011");  FString cmd = TEXT("SetName ")+ FieldName; FOutputDeviceDebug device; DCRLabelWidget->CallFunctionByNameWithArguments(*cmd, device, NULL, true);

  假设UI_Label为我们蓝图创建的UserWidget,内部有一个名为Btn_OnClick的Button组件,可以通过如下方式,找到这个Button对象,并给该button绑定点击事件。

// UserWidget绑定2D screen模式下的点击事件 if (UButton* ButtonOnClick = Cast(UI_Label->GetWidgetFromName(TEXT("Btn_OnClick"))))//Button_OnClick {     FScriptDelegate ButtonOnClickDelegate;                  ButtonOnClickDelegate.BindUFunction(this, "LabelOnClickCallBack");     ButtonOnClick->OnClicked.Add(ButtonOnClickDelegate); }

// 从DCRLabelWidget读取Float类型属性PX for (TFieldIterator StrProperty(DCRLabelWidget->GetClass()); StrProperty; ++StrProperty)     {             if (StrProperty->GetName().Contains(TEXT("PX")))        {            AbsoluteSizeX = StrProperty->GetPropertyValue_InContainer(DCRLabelWidget);            break;              }   }

 // DCRLabelWidget 为要设置属性的UserWidget对象,这里以float类型属性为例 for (TFieldIterator StrProperty(DCRLabelWidget->GetClass()); StrProperty; ++StrProperty) {           // 属性名称为SizeX       if (StrProperty->GetName().Contains(TEXT("SizeX")))        {       StrProperty->SetPropertyValue_InContainer(DCRLabelWidget, AbsoluteSizeX);        break;       } }