由于从v3.0开始zIndex接口因为性能问题已经被移除,调整节点树的顺序需要使用setSiblingIndex替换。但是在2d游戏中zIndex的使用还是有一定的需求的,可以少用,但是不能完全没有。以下是个人的扩展zIndex属性的方案
import { isValid, Node } from 'cc';
declare module 'cc' {
interface Node {
/** 节点的渲染顺序 */
zIndex: number,
}
}
Object.defineProperty(Node.prototype, 'zIndex', {
set(zIndex: number) {
if (this.zIndex === zIndex || !isValid(this)) {
return
}
this._zIndex = zIndex;
let self = this as Node;
if (self.parent) {
const children = self.parent.children;
let siblingIndex = binarySearch(children, zIndex);
self.setSiblingIndex(siblingIndex);
}
},
get(): number {
return this._zIndex || 0;
},
configurable: true,
});
function binarySearch(children: Node[], zIndex: number): number {
let left = 0;
let right = children.length - 1;
while (left <= right) {
let mid = Math.floor((left + right) / 2);
if (children[mid].zIndex < zIndex) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return left;
}