3.6 UITransform的priority属性不能用了,新的方案是什么?

你好,目前建议使用 setSiblingIndex 来调整节点树的顺序。

这个 setSiblingIndex 真心不好用。尤其是大世界地图。官方还是要引起重视啊

如果彻底取消 priority 而没有替代接口,那我宁愿不升级

今天又遇到了这个问题,3.3 升级到 3.6.1,priority 原生失效了,只剩下 setSiblingIndex ,真的是ex,没有替换的接口就直接让之前的接口失效,不要说 setSiblingIndex 是替换接口,功能完全不一致,还要自己写额外的逻辑去使用 setSiblingIndex

原生确实失效了 :sleepy:。有解决方案吗?

我直接这样搞,每次都是负优化
去掉 cc,为了剔除代码(现在还没有这个功能)
删除 zIndex 却把替代 priority 接口标注为废弃,然后让你用比 priority 更难用且功能完全不一致的 setSiblingIndex 接口,真的搞不懂设计接口的人

cc.Node.prototype['__priority'] = 0;
Object.defineProperty(cc.UITransform.prototype, 'priority', {
    get: function (this: cc.UITransform) {
        return this.node['__priority'];
    },
    set: function (this: cc.UITransform, valueN_: number) {
        if (!this.isValid) {
            return;
        }
        this.node['__priority'] = valueN_;
        if (!this.node.parent) {
            return;
        }
        let priorityAs = [...this.node.parent.children].sort((va, vb) => va['__priority'] - vb['__priority']);
        priorityAs.forEach((v, kN) => {
            v.setSiblingIndex(kN);
        });
    }
});
2赞

好的。谢谢。我试试看 :smiley:

Mark!!

index不是常用接口,统一优化了也没啥影响

这只是你不常用而已,你可以去投个票,两个接口只能存在一个的情况下,看看多少人支持zIndex,又有多少人支持 setSiblingIndex

官方这样设计,应该是有特殊优化

是的,特殊负优化

应该是在使用这个函数的时候有特殊处理以提高运算和渲染效率

很可能是借鉴了其他引擎的内核

我的节点排序使用的是自己的排序,用的timsort

2dx性能比creator高,为什么这么多人用creator?按照你这想法,全用2dx去算了

引擎取消zIndex,是因为zIndex导致频繁sort排序。

出个无排序的简单方案:
setZIndex(node: Node, zIndex: number) {
(node as any).zIndex = zIndex;
let bFindMe = false;
const parent = node.parent;
if (!parent) return;
const children = node.parent.children;
for (let i = children.length - 1; i >= 0; --i) {
const child = children[i];
if (node == child) {
bFindMe = true;
} else {
const chIndex = (child as any).zIndex || 0;
if (zIndex >= chIndex) {
node.setSiblingIndex(bFindMe ? i + 1 : i);
break;
}
}
}
}

去掉了zIndex,要用它的人还不是要自己实现一个可能比之前原本zIndex性能更低的接口,不用的人自然也不用,所以为什么要去掉呢?如果仅仅是为了这个接口性能低给去掉,那么引擎直接一大堆的接口直接没了

我只能说不做游戏的人做引擎,就如同下面这张图

1赞

setSiblingIndex是子节点排序,这个和zindex这个统一节点排序已经不是一个功能了。针对子节点排序,还可以在渲染层面进行优化。如果要把zindex改为setSiblingIndex,需要获取节点序列,反向解序列就比较麻烦了。但是重新开发会更加方便快捷