setSiblingIndex 改变 index 时节点闪烁

  • Creator 版本: 3.8.3

  • 目标平台: chrome 浏览器

  • 编辑器操作系统: windows

问题:屏幕从上到下刷新出很多怪物节点,每个节点都是一个spine动画。怪物移动速度不一样,所以需要排序前后关系,现在的实现是:对怪物节点的父节点下所有的怪物按 y 坐标排序,排序后设置 setSiblingIndex ,在没有新节点加入的情况下表现正常。当有新节点加入,由于新节点的y值大,所以需要setSiblingIndex 靠前,比如设置为0,这样之前的所有节点setSiblingIndex 都会递增,由于siblingindex的改变,导致原本y相近的节点不停闪烁。
各位大佬,请问有什么方案可以解决吗?

提个不成熟的小建议,不再按照简单的y坐标排序,而是通过y轴和怪物进入该坐标的顺序来排序。假设y轴的范围是1-2000,怪兽的数量上限是1000,那第一个进入y坐标1的怪兽zindex值为1+1000,第二个为1+1000-1,第三个为1+1000-2,维护这个减少的值,当减到1000时遍历该y轴上所有怪兽重置zindex,对于离开该y轴的怪兽不再参与该y轴的排序。

你可以在lateupdate里面对所有的角色经行一次排序,不直接调用setSiblingIndex 试试

感谢回答,因为怪物有不同速度,不同时刻前后关系会发生动态变化,所以一次排序现在没法子用哈

我觉得楼上的方案没有问题,每一帧都进行一次排序,没毛病

感谢回答!由于怪物速度不一样,后入的怪物有可能会在下一时刻会跑到先出怪物前面。现在是通过 setSiblingIndex 这个接口设置的。一旦有一个新的怪物节点加到父节点里,children会发生变化,新加入的节点如果想显示在别的怪物节点下面,就得设置 setSiblingIndex 靠前。那么其他节点的index就会+1。这个时候设置就会闪烁。

嗯,不直接调用setSiblingIndex,lateUpdate 每帧都排序,结果是一样的哈,还是闪烁。

速度不一样,但是不会出现反复超越的情况吧,你现在的情况是同样的速度下,同一Y轴后到达的和先到达层级一样,同层级后面的覆盖前面的,然后前面的有移动到下一个Y坐标,导致反复覆盖的情况。用我那个方案可以避免这种情况

可以看看你说的闪烁时怎么闪烁吗?

已经解决啦,感谢回答。问题是在父节点中加入子节点时,子节点原先的渲染顺序改变了,导致加入那帧层级关系错乱了。然后update更新index的时候,再设置回去。这就会出现闪烁的问题。

但是一帧只会绘制一次,多次排序是没有意义的。

最后怎么修改的?

新节点默认index改成setSiblingIndex(parent_node.children.length + 1)就可以了