蓝图里做了许多功能 现在项目要在c++里用 于是要从c++调用蓝图里的函数 步骤:
- 创建c++ Actor类 ACppcallBase
- 在ACppcallBase里声明要用函数(只做声明,不在cpp里写定义) 用BlueprintImplementableEvent修饰,比如
UFUNCTION(BlueprintImplementableEvent, Category = "AAA")
void RainSpawnEvt(float Density = 50.0, float Radius = 1000.0);
如果是c++有实现函数体 在蓝图里想要重载 就要用BlueprintImplementableEvent 然后还要加上一行RainSpawnNativeEvt_Implementation的声明(格式是XXX_Implementation) 然后在cpp里写上RainSpawnNativeEvt_Implementation的实现代码 同样的 RainSpawnNativeEvt不要在cpp里写定义
这么做的话 如果蓝图里没有重载RainSpawnNativeEvt 则调用RainSpawnNativeEvt_Implementation 否则调用蓝图里的RainSpawnEvt
UFUNCTION(BlueprintNativeEvent, Category = "AAA")
void RainSpawnNativeEvt(float Density = 50.0, float Radius = 1000.0);
void RainSpawnNativeEvt_Implementation(float Density = 50.0, float Radius = 1000.0);
- 创建继承自ACppcallBase的蓝图类cppcall 打开编辑界面 编译一下蓝图 增加覆盖函数RainSpawnEvt或者RainSpawnNativeEvt 如果找不到 编译一下蓝图再试试
此时会新增一个事件 接下来往后面连线 做自己想做的事
- 蓝图做好以后 编译蓝图 切换到c++这边 目前看到的有两种调用方法 本人只是简单试了一下 没有深入研究
- 网上看的比较多的是发命令 函数名RainSpawnEvt + 参数 但是参数只能字符串来搞 不知道还能怎么用 有知道的留个言 感谢
FString cmd = FString::Printf(TEXT("RainSpawnEvt 50 1000"));
FOutputDeviceDebug device;
CallFunctionByNameWithArguments(*cmd, device, NULL, true);
- 直接调用 不知道有什么弊端没有
float fDensity = 10.0;
RainSpawnEvt(fDensity, 1000);
这样就实现了c++调用蓝图函数
后记:
整个流程还是有很多限制 比如c++类要从Actor继承 还要搞一个从这个c++类继承的蓝图类
如果要调用其他蓝图类的函数 找到了一个老哥写的 测试过确实可用 这种更加灵活一点
https://blog.csdn.net/qq_35014708/article/details/84569831
参考:
https://blog.csdn.net/u011326794/article/details/75047201
https://www.jianshu.com/p/aee9823e0826
https://blog.csdn.net/qq173681019/article/details/86767313?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase