BlueprintCallable,使C++中的函数在蓝图中能被调用,新建C++类CustomActor继承AActor,并分别声明public、protected、private方法:
![](https://i-blog.csdnimg.cn/blog_migrate/280ca50d4e6bc688f35ce0b394e9a735.png)
拖拽一个CustomActor到Map中,打开关卡蓝图,可以到无法在蓝图中调出C++中的方法:
![](https://i-blog.csdnimg.cn/blog_migrate/90f53d6fb2fa26c708b1ca74797aafb8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e2828e2e5fe4de0843bbf4c9f0e5f874.png)
![](https://i-blog.csdnimg.cn/blog_migrate/35d8cb76834daa7d9cba93851380bf8d.png)
我们为这三个方法添加BlueprintCallable标记:
![](https://i-blog.csdnimg.cn/blog_migrate/afce87aed1312a72c6a6af59a04a40ef.png)
然后在蓝图中调用:
![](https://i-blog.csdnimg.cn/blog_migrate/67a9920f7888ce9d134010bfcb27b0cd.png)
可以发现,只要添加了BlueprintCallable标记,不管是private、protected还是public的函数,统统能在蓝图中调用!
静态成员函数在蓝图中不需要通过实例对象就能调用。在C++中声明Custom的静态函数CustomActorStaticMethod,并添加BlueprintCallable标记:
![](https://i-blog.csdnimg.cn/blog_migrate/a53f8e2a65f8413a1e519b9d18926c9f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ea3889a160ac7b968d2f95271c5bf9bf.png)
![](https://i-blog.csdnimg.cn/blog_migrate/72df39a0c6cd1aff6178bd3bff16cb73.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5487d16d03ed7df0cf3e72081426fcaf.png)
可以看到,不需要CustomActor的实例就能在蓝图中调用它的静态函数。
函数的普通参数、引用参数、常量引用参数、指针参数在蓝图表现形式。给CustomActorMethod方法添加int、int&、const int&、AActor*参数,并在蓝图中调用:
![](https://i-blog.csdnimg.cn/blog_migrate/bbf643d2773ee5eb6435a2eefe4951f3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5069f41ba6ab7b8db4a2f5fae206181e.png)
可以看到,普通参数作为输入引脚,可以在引脚中自定义参数值;引用参数会变成返回值引脚;常引用参数也是输入引脚,不过必须通过另一个变量传入:
![](https://i-blog.csdnimg.cn/blog_migrate/2f91ed175146cb41407df48150262de5.png)
指针参数也是一个输入引脚。
Category,可以给函数添加在蓝图中的分类。给CustomActorMethod添加标记:Catagory="One|Two|Three":
![](https://i-blog.csdnimg.cn/blog_migrate/ff54c1161c43c1fa2cf8404b1855db22.png)
![](https://i-blog.csdnimg.cn/blog_migrate/67298a290513876099888ece067fb0a5.png)
可以看到,通过"|"来划分层级结构,实现给函数分类。
BlueprintImplementableEvent,使函数仅在蓝图中定义。给CustomActorMethod添加BlueprintImplementableEvent标记:
![](https://i-blog.csdnimg.cn/blog_migrate/256f3745fc42b072cc88b95b124128b5.png)
新建一个蓝图类继承CustomActor:
![](https://i-blog.csdnimg.cn/blog_migrate/a00a53056b25ce3b0e4ec5f23a12d420.png)
在蓝图中查找CustomActorMethod:
![](https://i-blog.csdnimg.cn/blog_migrate/f3ac04abb491fe2ad1e043a32ea303e6.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4732e4b58403f21d3376325fa9ecd112.png)
可以发现通过这个标记,能以事件的形式在蓝图中定义函数要执行的逻辑。当函数有返回值时,蓝图中可override重写这个函数:
![](https://i-blog.csdnimg.cn/blog_migrate/0fd103ecf9f1db22a9075b160f5a2680.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d36d279934b2037bebc02a5b4fe335b7.png)
而且BlueprintImplementableEvent标记的函数不能在C++中定义,否则编译会报错。
BlueprintNativeEvent,这个标记功能和BlueprintImplementableEvent基本上一样,不过它的函数需要在C++中定义,蓝图类可以选择不重写:
![](https://i-blog.csdnimg.cn/blog_migrate/18b38a99334cefc4d6e49e914bd520df.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c7e42501bd7537dc9252737f4d2d7620.png)
需要注意的是,C++中定义函数时,需要额外声明并定义"函数名_Implementation"函数,这个函数的实现就是调用原函数时执行的逻辑。
BlueprintPure,函数作为纯函数使用,不需要流程引脚,一定要有返回值:
![](https://i-blog.csdnimg.cn/blog_migrate/65297a85d74831b9652b3e179847c652.png)
![](https://i-blog.csdnimg.cn/blog_migrate/abd07290ba3ccf97f4e490d64b34308d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a220695a0820d8f0c60687c330ccdc26.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ee84a5cc269aa637f582844c140ee8b5.png)
const函数拥有返回值时在蓝图中的形式和纯函数相似:
![](https://i-blog.csdnimg.cn/blog_migrate/494339071ccb85f060dc9331405a545f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4c9119f81bbb3d6a12c545be8e43d398.png)
没有返回值的时候还是需要连接流程引脚的:
![](https://i-blog.csdnimg.cn/blog_migrate/1788653e4fc5de60336544a6801d0923.png)
![](https://i-blog.csdnimg.cn/blog_migrate/482bd3903ad01b936243f39c9c6c1167.png)
meta DisplayNsame,自定义当前函数在蓝图中的名称:
![](https://i-blog.csdnimg.cn/blog_migrate/2ae9762060d740bd5ea4d455f34680dd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2685815e075b421b4671d89ce8242361.png)
这样在蓝图中通过调用"测试函数"就能执行该函数。