【UE4】接口函数的蓝图节点

您所在的位置:网站首页 ue4接口传递自身 【UE4】接口函数的蓝图节点

【UE4】接口函数的蓝图节点

2023-12-31 18:34| 来源: 网络整理| 查看: 265

今天在蓝图中调用自定义的接口函数时,注意到接口在蓝图中的节点样式有两种,如上图

能直接看到的区别就是,它们的Target不同,暂且叫左边的为对象版本,右边的为接口版本

 

鼠标放在对象版本的函数上。可以到提示:

消息。如果目标未实现必要的接口,将什么也不做

此时我用自定义的一个类去实现这个接口,新建一个MyPlayerController蓝图继承自PlayerController,再新建一个MyPlayerController_Child蓝图继承MyPlayerController。

在GameModeBase中设置PlayerControllerClass。

然后在其他地方GetPlayerController,调用TestFunction。

此时对象版本的函数可以直接连上,但接口版本的连不上。

简单画一下UML图

这就不难理解为什么GetPlayerController之后无法调用接口了。

因为对象版本的目标是UObject及其子类,由于C++的多态(蓝图也有类似特性),会调用当前Target实现的TestFunction,但也由于UObject并不可能全部继承这个接口,因此如果Target没继承接口,这个调用将无任何作用。

比如下图,GetPlayerpawn(),获得的Pawn或其子类继承自UObject,但Pawn没实现接口,因此这将什么也不做,执行下一个节点。

 

而接口版本就有点意思了

细心点的话,会发现搜索函数,有三个版本!此时又多出来一个MyPlayerController的版本

所有实现了接口的类都会有一个“特化”版本的蓝图节点,但经过我几次测试发现这个与接口版本的没啥区别,它们的Target类型是一样的,调用结果也一样,只要能连线,始终会执行Target本身的接口实现。

总结以下这三个版本的区别:

1.     Target不同(调用的对象不同)。

对象版本的对象是UObject对象引用,因此可能会调用失败(有些UObject子类并不实现接口,正如鼠标放在上面的提示)。

接口版本的Target是所有实现这个接口的目标,只要这个类实现了接口,就可以连接Target,可以调用这个接口函数,如果Target未实现接口,将在编译时报错。

特化版本的Target,与接口版本的区别不大,不建议使用。

2.     执行效果不同

对象版本有可能执行失败,如果函数有返回值,执行失败的时候,返回的参数都是空值或默认值,比如接口函数返回一个Actor对象,就有可能出现返回的对象是空对象的问题,因此需要谨慎使用返回值。

接口版本的会直接调用当前Target的接口实现,只要能连接Target,就一定可以执行这个接口函数。

接口就是为了避免两个类之间过渡的直接调用,充当一个中间人,转发消息来实现封装,因此尽量少用特化版本的节点,如果调用过多将失去接口的意义。

推荐优先使用对象版本,这也是匹配Target范围最广的一个,同时需要注意其返回值的有效性。

UE4的接口在蓝图中的调用大致就这些,我只分析了一下表象,更深层的原理期待大佬们的评论!!!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3