由于某些原因,在开发过程中会将一些功能写在蓝图中,那么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, ¶ms, nullptr, func->Children);
func->Invoke(obj, frame, ¶ms + 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
啊,虚幻真美妙