通过继承Unreal中的接口可以使不同的类有某种共同特性,这里记录一下接口的使用方式。Unreal中的接口分为两种:C++接口和蓝图接口,C++接口可在蓝图中使用;蓝图中的接口不能直接在C++中使用,这里探究一下他们的关系:
1.C++的接口在C++中使用:
新建C++类,继承UnrealInterface:
![](https://img-blog.csdnimg.cn/img_convert/7770f74dfafbf0c0979cbb198627c096.png)
接口中可以声明虚函数或者纯虚函数:
![](https://img-blog.csdnimg.cn/img_convert/978cec0babecffab291b87df4a7990e9.png)
赋值为0即为纯虚函数,子类必须实现纯虚函数:
![](https://img-blog.csdnimg.cn/img_convert/1da3d68d879b4a0a4c70ac1e39c75019.png)
![](https://img-blog.csdnimg.cn/img_convert/426fc11cfcd9ff6943c38c7dbcf5ca2d.png)
![](https://img-blog.csdnimg.cn/img_convert/0a5b4f1542f212e01a418c53da9b3b8a.png)
非纯虚函数可以在父类中实现,子类自由选择是否重写:
![](https://img-blog.csdnimg.cn/img_convert/d34991004efb2f03f0c20342161dfa3a.png)
调用:
![](https://img-blog.csdnimg.cn/img_convert/7329f34778b18326b9b9510659138391.png)
![](https://img-blog.csdnimg.cn/img_convert/7e7b4fd9c4ecb7fe604d698c80c94e80.png)
2.蓝图中使用蓝图接口:
新建蓝图接口,继承BlueprintInterface:
![](https://img-blog.csdnimg.cn/img_convert/68eeef7e611a7fa4fa44564c32d32bc1.png)
声明接口函数TestInterface:
![](https://img-blog.csdnimg.cn/img_convert/60ae0d8a7cfe7830a7fea7157eba3281.png)
在蓝图Actor中添加蓝图接口TestBlueprintInterface:
![](https://img-blog.csdnimg.cn/img_convert/cf6b4d3667e65f1754042f75f7a3c4bb.png)
actor蓝图自动从接口中生成事件,可以在此事件中编写要执行的逻辑:
![](https://img-blog.csdnimg.cn/img_convert/f68f500acc08b59f5d5e2e13018cbd26.png)
![](https://img-blog.csdnimg.cn/img_convert/f97a7d248d466dfb04390e95e70e5c9a.png)
3.在蓝图中使用C++接口,需要给接口函数添加BlueprintImplementableEvent或者BlueprintNativeEvent和BlueprintCallable标记:
![](https://img-blog.csdnimg.cn/img_convert/7470649cedb34a9979a2bbe43b84e8b6.png)
当C++Actor继承此接口,然后蓝图Actor继承C++Actor时,接口位于继承接口面板中:
![](https://img-blog.csdnimg.cn/img_convert/cdab94dd28f7b45473b94b9fb50ee350.png)
此时可以选择是否重写父类中的BlueprintNativeEvent。
当蓝图actor直接实现C++接口时,接口位于ImplementedInterface面板中,并需要重写接口函数:
![](https://img-blog.csdnimg.cn/img_convert/9d51a632b9e51b76d4ba544e1b1f898d.png)
![](https://img-blog.csdnimg.cn/img_convert/4dbf6187230e0ac3022f2c43cf835b17.png)
注意,蓝图类通过上面这种方式的接口实现,无法在C++中直接调用,只能判断当前类是否实现了此接口,而不能转换接口类型成功:
![](https://img-blog.csdnimg.cn/img_convert/1b2ea1b348a524bfb4d3f58cbbf0c1c2.png)
![](https://img-blog.csdnimg.cn/img_convert/69da2b3fed85fe994835244839337db4.png)
纯蓝图类实现的接口在C++中只能通过GetClass()->ImplementsInterface(U接口类:StaticClass)查询,而不能转换接口类型成功,也就是上面红框内不会执行;而C++或继承C++类实现接口的类如CustomActor可以转换成功。注意,C++调用给蓝图用的函数,要通过Excute_函数名调用。