UE5.6开启GlobalInvalidation后在修改Visibility同帧修改ChildOrder会导致射线漏更新

遇到问题的方法是:FSlateInvalidationRoot::ProcessPreUpdate()。

其中父节点为ChildOrderDirty,子节点为VisibilityDirty时,父节点的ChildOrder更新时会把子节点从WidgetsNeedingPreUpdate列表中移除,从而导致子节点错过了射线更新逻辑。

<br/>

[Image Removed]

重现步骤
首先需要控制台开启全局无效,而后以PIE(Viewport模式下全局无效不会生效)运行游戏即可复现。

在一个userwidget调用addtoviewport方法后立刻隐藏另一个已经在viewport上的userwidget会发现这个隐藏的userwidget仍然处于射线可响应情况。

看了下可能是5.5改动后导致的,目前还原回5.4的官方代码能解决,希望能推出一个官方修正。

您好,理论上Viewport下应该只有一个User Widget,您是指您Add了多个User Widget到Viewport下,然后隐藏之前添加的,对吗?

这个应该是我们目前的UMG机制导致的,我们设计上只考虑同事只有一个User Widget会add to viewport,所以当有两个User Widget加入viewport,就相当于有两个根window了。你们必须要这样吗?

好的 我去反馈下。据我所知,可能是我们开发团队并没有意识到这个问题,因为FN里都是一个UserWidget加入Viewport的。因此,他们可能就没有考虑多个User Widget加入Viewport的情况,我去反馈下。感谢提出问题!

是的 一个蓝图界面先addtoviewport,另一个蓝图界面后addtoviewport的同时隐藏上一个就能稳定复现

倒也不是必须,只是原来版本一直是好的,而且并没有看到官方对AddToViewport多个有任何的警告,所以感觉更像是Bug了。如果明确不推荐这种用法建议后续追加一些Warning之类的。