六、蓝图访问C++函数/事件(UFUNCTION)
一.蓝图中的函数/事件
1.函数
①带有输入输出引脚的普通函数



②Pure函数(无输入输出引脚)


2.事件

二.C++创建 蓝图可访问的函数/事件
C++将函数公开给蓝图访问的方式与公开变量的原理是一样的,公开变量使用的是UPROPERTY宏,公开函数也需要一个宏,名为UFUNCTION宏.该宏同样结合大量的说明符来使函数在蓝图中具有不同的功能,特性等
为了方便测试还是沿用的Cpp_Actor的C++类
①BlueprintCallable(蓝图可调用)
BlueprintCallable 蓝图可调用,C++函数可以在蓝图中被调用
这是以个有输入输出引脚的函数(一个返回值的函数)

多个返回值的函数

②BlueprintPure(蓝图纯函数) ,纯函数必须有返回值!!!
这是一个有多个返回值的纯函数(没输入输出引脚的)



首先理解蓝图中Beginplayer函数:



解析:
由上图可知,蓝图中的Beginplay事件其实就是C++中的ReceiveBeginPlay函数.该函数的UFUNCTION宏中有一个名为BlueprintImplementableEvent的说明符,该说明符字面意思为:"蓝图可实现事件":
即C++中声明与调用函数(不需要在cpp中定义函数),蓝图中定义函数.下面进行测试

③BlueprintImplementableEvent(蓝图可实现事件)
C++中声明且调用函数(不定义函数),蓝图中定义函数(Functions中进行override),红色无流入引脚的形式存在

a.函数无形参
.h文件
.cpp文件

b.函数有形参



c.上述ab函数都是无返回值的情况,下面这个是有返回值的情况
.h文件
.cpp文件

有无返回值的区别:无返回值以事件形式存在,有返回值以函数形式存在
③BlueprintNativeEvent(蓝图原生事件)
a.C++中声明函数,C++和蓝图中都可以定义函数(C++必须实现),如果蓝图不定义,会执行C++中的定义,如果蓝图和C++都定义,蓝图则会覆盖C++定义,只执行蓝图定义.
(2)C++函数声明,需要额外声明一个名为:函数名+_Implementation的返回值和参数列表都一致的函数.
(3)BlueprintNativeEvent需要配合BlueprintCallable一起使用,否则蓝图中不可调用
(4)与BlueprintImplementableEvent 一样,有返回值的在蓝图以函数形式存在,无返回值的在蓝图中以事件形式存在.
a.无返回值
.h文件
.cpp文件
(1)蓝图中不定义函数

(2)蓝图中定义函数




备注:解决这个bug是对自己写的代码足够自信,声明函数没有返回值,为啥就有返回值了呢?所以确实bug,解决bug

(3)既能实现C++定义的函数,又能实现蓝图定义的函数


b.有返回值
.h文件
.cpp文件
(1)蓝图中不定义函数

(2)蓝图中定义函数

(3)既能实现C++定义的函数,又能实现蓝图定义的函数
