[UE] Bug: MIxin的类被原生蓝图继承类调用的问题
lzj10 opened this issue · comments
前置阅读 | Pre-reading
Puer的版本 | Puer Version
UE的版本 | UE Version
5.4
发生在哪个平台 | Platform
Editor(win)
错误信息 | Error Message
通过原生蓝图调用父类被mixin的函数,mixin的ReceiveBeginPlay无法调用到,但是普通函数可以正常调用
问题重现 | Bug reproduce
- 有蓝图类TestActor ,mixin到ts类TestActor
2.有蓝图类TestActor_Child继承自TestActor ,并且在蓝图中重写了ReceiveBeginPlay和TestFunction并调用父类方法TestFunction2
3.创建 TestActor_Child,并调用TestFunction,发现通过调用父类函数,TestFunction和TestFunction2均可以调用到,但是父类的ReceiveBeginPlay无法调用到
你试试先加载了子类,然后再mixin父类?
我多测试了几次 ,感觉跟编辑器启动的加载顺序有关 ,跟代码里的类加载顺序关系不大,多重启几次编辑器有的时候调用父类就可以生效,但是调用生效的时候不关闭编辑器,PIE第二次会卡死。
我没重现调用不到的情况。
倒是卡死是100%重现的。
卡死的原因倒是找到了:你给的demo,TestActor没有BeginPlay,你先mixin TestActor会导致TestActor添加BeginPlay,然后加载TestActor_Child会产生对TestActor添加BeginPlay的引用,然后停止播放后,被mixin的类都有一个restore行为,会把添加的方法删除,于是TestActor_Child引用了一个已经被删除的UFunction实例。
暂时的规避方法:你手动在TestActor添加一个空的BeginPlay重载。
你如果先加载了子类然后再mixin,子类调用基类将触发不了TestActor没有BeginPlay。因为对基类的调用已经定向到Actor那了。这应该是你偶尔不触发的原因。
收到 感谢~
我把卡死解决掉。不过如果TestActor没有BeginPlay的话,仍然根据加载顺序不一样会出现不触发的可能。然后通过文档约束下。