Tencent / puerts

PUER(普洱) Typescript. Let's write your game in UE or Unity with TypeScript.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[UE] Bug: MIxin的类被原生蓝图继承类调用的问题

lzj10 opened this issue · comments

前置阅读 | Pre-reading

Puer的版本 | Puer Version

6f50d33

UE的版本 | UE Version

5.4

发生在哪个平台 | Platform

Editor(win)

错误信息 | Error Message

通过原生蓝图调用父类被mixin的函数,mixin的ReceiveBeginPlay无法调用到,但是普通函数可以正常调用

问题重现 | Bug reproduce

  1. 有蓝图类TestActor ,mixin到ts类TestActor

image
image
image

2.有蓝图类TestActor_Child继承自TestActor ,并且在蓝图中重写了ReceiveBeginPlay和TestFunction并调用父类方法TestFunction2

image
image
image

3.创建 TestActor_Child,并调用TestFunction,发现通过调用父类函数,TestFunction和TestFunction2均可以调用到,但是父类的ReceiveBeginPlay无法调用到

image

你试试先加载了子类,然后再mixin父类?

我多测试了几次 ,感觉跟编辑器启动的加载顺序有关 ,跟代码里的类加载顺序关系不大,多重启几次编辑器有的时候调用父类就可以生效,但是调用生效的时候不关闭编辑器,PIE第二次会卡死。

多次重启工程,有时候调用父类生效了,但是再次PIE直接卡死
image
image
卡死的时候应该是调用到父类ReceiveBeginPlay的时候,父类子类的ReceiveBeginPlay都没有打印出来 ,testfunction都执行成功
image

追踪到是在蓝图执行的时候死循环了
image
image

感觉第二次PIE启动的时候子类ReceieveBeginPlay的SuperStruct和父类的ReceieveBeginPlay的UFunction对象地址不同,TestFunction是一致的
2ce91b3ea94b9193e90adff2bab5b1e
211e14dee1003e760b259acfa7bef64

我没重现调用不到的情况。
倒是卡死是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的话,仍然根据加载顺序不一样会出现不触发的可能。然后通过文档约束下。