Bootstrap

UE C++ 调用蓝图定义的函数或事件

由于某些原因,在开发过程中会将一些功能写在蓝图中,那么C++中怎么获取蓝图中定义的函数呢

注意:不是在c++声明后使用宏标记,再去蓝图上事先!(这能叫蓝图函数吗?本身就是c声明的)

1. 调用蓝图函数或事件

ProcessEvent(Function,&Params)

传入UFunction*类和参数(无则是nullptr)

获取UFunction*:
// 静态加载蓝图资产
	UClass* PClass = LoadClass<UUserWidget>(nullptr, TEXT("/Game/UI/WG_TSET.WG_TEST_C"));
	if (PClass)
	{
		// 创建蓝图类的实例
		UObject* BlueprintInstance = NewObject<UObject>(GetTransientPackage(), PClass);
	}
        if (BlueprintInstance)
        {
            // 找到蓝图函数
            UFunction* Function = PClass->FindFunctionByName(FunctionName);

            if (Function)
            {
            	PClass->ProcessEvent(Function, nullptr);
            }
参数传入:

多参和返回值:

struct FRef
{
    FString var1 = "这是FString参数",
	int32 var2 = 12311111;
    bool ReturnValue;
}FuncParams;

PClass->ProcessEvent(Function, &FuncParams);
return FuncParams.ReturnValue;

单参无返回值:

int32 var1 = 12311111;
// 反射执行函数
PClass->ProcessEvent(Function, &var1);

2. 调用蓝图函数或事件

UObject->Invoke()

// 注意Invoke()博主只成功过无参调用,有参调用会奔溃

参考源:

Invoke()

FFrame frame(nullptr, func, &params, nullptr, func->Children);

func->Invoke(obj, frame, &params + func->ReturnValueOffset);

根据标题1中的代码,我们再进行修改:

带参数:
// (实例UObj, UFunction ,传入的参数)
FFrame Frame = FFrame(BlueprintInstance, Function, &var1);
Function->Invoke(BlueprintInstance, Frame, &var1 + Function->ReturnValueOffset);

其中var1是传入的参数,当需要多参和返回值时,需要使用结构体进行包装,再进行引用传入

无参数:
// 当无参传入时可使用
uint8* Buffer = static_cast<uint8*>(FMemory_Alloca(Function->ParmsSize));
FFrame Frame = FFrame(BlueprintInstance, Function, Buffer);
Function->Invoke(BlueprintInstance, Frame, Buffer);

!注意事件无返回值

题外话:

LoadClass虽然返回的是Uobject,但是C++中获取到蓝图创建的类是继承自UBlueprintGeneratedClass的哦

而Widget则是继承自UBlueprintGeneratedClass的UWidgetBlueprintGeneratedClass

啊,虚幻真美妙