【转载】UE4 C++ 与蓝图深度交互

1,458 阅读2分钟

原文链接:UE4 C++ 与蓝图深度交互 | 关山月

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

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

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

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

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

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

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

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

3. C++ 调用纯蓝图方法

 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);

4. C++ 获取蓝图 UserWidget 内部控件

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

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

5. C++ 获取蓝图属性,及向蓝图属性赋值

获取蓝图属性

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

设置蓝图属性

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