曾经做过俯视视角游戏,以及弹幕游戏,只要根据物体到底部的距离随时更新zIndex,即可解决物体的层级问题。
但是在后来直到现在,现在在我所了解的范围内似乎只有setSiblingIndex这个方法,但是看过源码后,这里有两个问题,一个是setSiblingIndex执行结果的值必须是[0,length)的范围,二是这个方法的执行效率让我很有疑惑。
现在的版本3.8.x如何高效的实时更新物体的渲染顺序呢?
曾经做过俯视视角游戏,以及弹幕游戏,只要根据物体到底部的距离随时更新zIndex,即可解决物体的层级问题。
但是在后来直到现在,现在在我所了解的范围内似乎只有setSiblingIndex这个方法,但是看过源码后,这里有两个问题,一个是setSiblingIndex执行结果的值必须是[0,length)的范围,二是这个方法的执行效率让我很有疑惑。
现在的版本3.8.x如何高效的实时更新物体的渲染顺序呢?
this.node.children.sort((a: Node, b: Node) => { return (b.position.y - a.position.y); });
如果只是2d层面的, 有一个高效方法, 可以hook掉 director.root._batcher.walk 函中, ta的代码原理就是递归一层一层节点渲染, 那麽只要有一个component为节点赋一个顺序值, 然后在walk函数根据顺序值处理递归顺序便可以控制渲染顺序了。
源码位置(cc 3.8.7) resources/3d/engine/cocos/2d/renderer/batcher-2d.ts 943行
if (children.length > 0 && !node._static) {
for (let i = 0; i < children.length; ++i) {
const child = children[i];
this.walk(child, level);
}
}
只要改掉这里的递归方法即可, 你可以实现一个componet, 当某节点存在让component时, ta的子节点开始自定义的 递归处理
很多时间,情况比这个复杂得多,比如boss权重跟小兵权重.小boss跟大Boss.