使用sort对节点进行排序在原生不奏效

image
我尝试这样改变节点层级,结果tween执行了sort未执行
image
然后我又尝试了这样改变节点层级,可以执行了,所以是我的写法有问题吗,这两种方式在web都是可以执行的
附上demoassets.rar (27.2 KB)

你这样在原生平台可以正常执行吗

写在tween的call里面试试

补一句 layout.children = children(排序后的) 试下

setSiblingIndex对这种2d场景中所有物体,动态按y来排序性能应该不太好,每次set都有一次查找、删除、插入。实际来说,游戏有所有的y坐标信息,一次排序,和一次赋值就可以了。所以这个场景还是建议用被标记弃用的UITransform的priority属性来设置。

//每次设置都有:2-3倍的数组长度相关的操作
public setSiblingIndex (index: number) {
        if (!this._parent) {
            return;
        }
        if (this._parent._objFlags & Deactivating) {
            errorID(3821);
            return;
        }
        const siblings = this._parent._children;
        index = index !== -1 ? index : siblings.length - 1;
        const oldIndex = siblings.indexOf(this);
        if (index !== oldIndex) {
            siblings.splice(oldIndex, 1);
            if (index < siblings.length) {
                siblings.splice(index, 0, this);
            } else {
                siblings.push(this);
            }

所以又又又回到了这里…
UITransform 组件参考 · Cocos Creator

需要注意的是,不能直接将 siblingIndex 属性等同于 priority (已废弃)属性来理解使用,它们的意义是不同的,改变 siblingIndex 属性需要理解并清楚其代表的是在父节点下的位置,且在节点树变化时会发生变化,并且只能通过 setSiblingIndex 方法来修改 siblingIndex 属性。

考虑到节点快捷排序的需求,我们会在之后的版本中提供更方便快捷的接口供用户排列节点使用。

原生不生效的问题,要定制一下源码

实时操作,js传原生性能巨耗

这个已经对于一次排序,只有一次js传原生。那还会有比现在priority更好的实现吗?(其实不太明白为什么priority会被标记弃用,如果只是表达不清楚,改个名字变成类似sortPriority的就可以了。。。)

2赞

原来如此,大佬威武,不过我已经用2.x开始项目了,直接改zindex就好了

在web生效的

下面的可以,sort不行

试过了,不行

被弃用原因

2赞

巧的是,昨天是deadline,使用的是UITransform的priority进行排序,结果原生不生效,最后在父节点统一重新排序,逐个进行setSiblingIndex最后成功。

不生效的问题是因为原生用的children和js用的children不是同一个对象,需要额外操作接口同步一次

不是吧那意思是一套代码不通用??

一开始是通用的,直接口号: 抹平平台差异,一套代码发布多平台,后来开始原生化后,这个口号就是个笑话,
同为开发者,我个人认为不可能完全抹平差异,但是至少在有差异的接口给点提示吧
原生化后还有很多坑等着踩呢

你可以先调用 children.sort(…) 排序,然后判断 if (sys.isNative) 用排序后的 children 循环调用 child.setSiblingIndex(index)

忘了说,web环境下 最好再调用一次 parent._updateSiblingIndex()

你这个回答和我上面的图非常贴切,只从开发者角度考虑问题,而没想过用户做一个通过y坐标改变渲染顺序的游戏以及用户做一些窗口层级管理的都要去重新实现以前的 zIndex 功能

如果所有接口都照这样搞迟早要完