Creator3.73中2D对象的排序基本无解! 如何解决!

2D 渲染节点排序

2D 渲染节点可分为在 Canvas 下的节点和不在 Canvas 下的节点两种:

  • 在 Canvas 下的节点可参考下文 UI 节点排序 部分的内容。
  • 不在 Canvas 下的节点,用户可选择通过 自定义材质 来开启深度检测实现和 3D 物体的遮挡显示,开启后会按照物体的 Z 轴坐标进行遮挡渲染(可参考范例 2d-rendering-in-3d )。

这是官方使用手册上给出的话,引擎组的一帮人不知道成天在想些啥!
一般来说,2D游戏中大多都是使用2D对象Sprite,然后Creator有一个硬性要求2D对象(也包括Sprite)必须要在Canvas节点下,真的一万啥要出来了
Canvas 下的节点只能按照UI 节点排序(也就是节点树),真的又要来一万个啥!!!!
那么非UI对象,如果要动态排序,该如何整!

之前Cocos2DX中有的 setZOreder和setGlobalZOrder怎么不好好继承下! 真的是越做越烂,只能这样说!

大佬,你看看是说的这个内容吗?

setSiblingIndex 作用有限 不够灵活!

看看引擎中setSiblingIndex的源码,真的不知道说什么了!!!!!
/**
* @en Set the sibling index of the current node in its parent’s children array.
* @zh 设置当前节点在父节点的 children 数组中的位置。
*/
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);
}
this._parent._updateSiblingIndex();
if (this._onSiblingIndexChanged) {
this._onSiblingIndexChanged(index);
}
this._eventProcessor.onUpdatingSiblingIndex();
}
}

/**
 * @deprecated since v3.5.0, this is an engine private interface that will be removed in the future.
 */
public _updateSiblingIndex () {
    for (let i = 0; i < this._children.length; ++i) {
        this._children[i]._siblingIndex = i;
    }

    this.emit(NodeEventType.SIBLING_ORDER_CHANGED);
}

如果我想让某一对象永远置顶,只能希望后面不再添加新的节点! 这是什么逻辑?

我试了下,在3.73的版本里面 我所有的节点都是动态生成的 无论怎么设置或者改变节点添加的顺序,排序就是达不到想要的样子(正确的顺序)。 是不是还有什么骚操作没有执行!

1赞

是的, 雀食不能实现预设排序… 话说现在有啥办法没有?

是这个么? Cocos Store

UITransform 组件下 有个 priority ,
虽然被弃用,但是有效

public SortByPositon()

{

    if(this.node.activeInHierarchy&&this.node.children.length>1)

    {

        let backNode = this.node.children.sort((a, b) => b.position.y - a.position.y);

        for(let i=0;i<backNode.length;i++)

        {

            backNode[i].setSiblingIndex(i);

        }

    }

}

https://forum.cocos.org/t/topic/139158/63?u=1226085293

priority 已经在原生无效了

原来如此,那需要换个解决方案了,重新排序吧

今天还碰到了一个更加操蛋的问题 我使用推荐的setSiblingIndex方法 在浏览器中预览排序是OK的 可是打成原生 妈的排序又不对了 同样的代码,居然出现不一样的结果 这也是绝了!

不一样的 原生走的jsb.node c++ 实现,web 端是 node.ts

引擎组使用setSiblingIndex 对节点进行顺序的调整 而不使用之前的ZOrder方案 可能是想提升性能,却导致功能上不完整性,我觉得是个得不偿失的做法!

就算使用ZOrder方案,也可以做个标识,在节点有变动的情况下直接使用插入排序,和 setSiblingIndex相比消耗多不了多少,但是功能性却是完备的!

希望引擎组可以考虑这一块,重新设计一下!

不用想了,我之前说了很多次,没有一次回复修改,每次都说为了提升性能

引擎组这是为自己的偷懒找了个冠冕堂皇的理由!
还真是应了那句话:便宜没好货!