3.4.2版本一个奇怪的问题

  • Creator 版本: 3.4.2
  • 目标平台: 浏览器
  • 之前哪个版本是正常的: 3.3.1
  • 重现方式:
    1,选中非第一个toggle,然后点击屏幕任意位置退出。
    image
    2,再次进入界面时,选中刚才退出时的toggle,checkMark图片无法显示。
    image

经过排查,有已下几个要点:
1,该面板退出隐藏时,会有一个渐变消失的过程。即tween设置了root节点的opacity从255->0。再次显示时,会将root节点的opacity再从0->255。如果去掉渐变退出和渐变进入,则一切正常。
2,只有选择的toggle跟再次进入时显示的toggle不一致才会出现这个问题。即:退出时选择的是第一个,再次进入时显示第一个toggle正常。退出时选择第三个toggle,进入时也选择第三个正常。
3,出现该问题后,反复切换toggle,有问题的checkMark也都不会正常显示了

提炼起来情况就是这样,假设有2个node,一个fatherNode,带有一个UIOpacity组件,,一个childNode,带有Sprite组件,fatherNode把opacity置为0了,childNode也就不显示了,但是sprite的color的alpha还是255。但是如果fatherNode的opacity置为255时,childNode的active是false,这个时候childNode也仍然是不可见的(是不是对active=false的子节点没有操作?),后续再将childNode的active设置为true时,受前期某个遗漏操作,导致仍然是不可见的?

PS:我不知道原因是什么,经过测试,如果此时,我在childNode上增加一个UIOpacity组件,然后将opacity设置为255,该子节点就可以正常显示了。

哪里有问题呢?

up up up

方便提供个简单的复现 demo 不,没复现;

实际项目中的出现的,很难剥离出来,要搞demo的话,就要自己完全重新搞一遍了。

看描述像把父节点的opacity设为0时会级联把子节点的opacity也设为0,当把父节点的opacity从0改为255时,由于此时子节点的active为false便没有把子节点的opacity恢复为255, 导致子节点active再次改为true时opacity仍是0从而看不见。

嗯,逻辑上很像这样,父节点上的确有UIOpacity这个组件,但是子节点是没有UIOpacity这个组件,只有Sprite组件。我断点看了,sprite的color是完全正常的。alpha=255, 所以不清楚这种情况下引擎是如何处理UIOpacity和Sprite的透明度关系的。

目前临时解决方案是:手工加一行代码,在子节点上增加一个UIOpacity,设置opacity为255,立马显示正确了(Ugly Code)

PS:
一个node看不见(显示有问题),无非有以下几个可能性:
1,active = false;
2,所在layer 不在相机的可视范围内
3,position不对,是显示状态,但不在可视范围内。
4,透明度为0。分2种可能,UIOpacity.opacity = 0, sprite.a = 0

刚复现了,已建立相关 issue,感谢反馈!

好的, :+1: :+1: :+1:
方便的话,可以给大家普及一下原因。



可以合并这两个 pr 试试