如何向C++调用的Blueprint函数传递参数
UE C++调用蓝图函数的参数填充实现方案
你要填充FuncParam的参数,本质是拿到每个参数对应属性在参数内存块中的地址,把你要传递的值写入对应地址即可,以下是具体实现:
核心填充代码
替换//FillParam here处的逻辑为如下内容即可,示例假设你需要调用的蓝图函数有两个参数:int32 数值参数、FString 字符串参数:
// 获得当前参数在FuncParam内存块中的实际地址 void* ParamAddress = Prop->ContainerPtrToValuePtr<void>(FuncParam.GetStructMemory()); // 按参数名匹配赋值,也可按参数顺序判断,按名匹配稳定性更高 if (Prop->GetFName() == FName("数值参数")) { // 写入int32类型的参数值,示例值为2048 *static_cast<int32*>(ParamAddress) = 2048; } else if (Prop->GetFName() == FName("字符串参数")) { // 写入FString类型的参数值,示例值为"测试参数" *static_cast<FString*>(ParamAddress) = TEXT("测试参数"); }
常见参数类型的赋值示例
不同类型的参数只需修改强转的目标类型即可,常见类型的赋值写法参考:
- bool类型:
*static_cast<bool*>(ParamAddress) = true; - float类型:
*static_cast<float*>(ParamAddress) = 3.1415f; - UObject派生类(比如AActor、UUserWidget):
*static_cast<AActor*>(ParamAddress) = 你要传递的Actor指针; - FVector类型:
*static_cast<FVector*>(ParamAddress) = FVector(100,200,300);
注意事项
- 参数名必须和蓝图函数中定义的参数名完全一致,大小写敏感,否则会匹配失败
- C++传递的类型必须和蓝图参数类型严格对应,类型不匹配会触发内存错误或者值异常
- 如果是蓝图的输出参数(Out标记)或者引用参数,调用完
ProcessEvent之后还可以从ParamAddress中读回蓝图修改后的结果 - 如果你需要封装通用的调用工具,可以提前把要传递的参数按名或者按顺序存入容器,遍历的时候逐个匹配赋值即可
内容的提问来源于stack exchange,提问作者VansFannel
相关产品推荐
相关产品推荐

