如何方便地判断一个node是否在场景上?

判断parent肯定是不行的,可能是深层的结构,可能当前parent有,但某一层parent还没add进场景。

有这个需求是因为坑王spine,spine设置动画的时候,如果不在场景中可渲染的状态,则设个设置直接被return不会有效果。

所以应该如何方便判断一个node是否已经位于场景中可渲染的状态。

isVaild ?

isVaild貌似只能判断是否已被销毁

node.activeInHierarchy

牛哦,哥们
另外咨询个问题,如果我希望监听node被activeInHierarchy变成true呢?有没有系统的语法?这样我就可以托管spine,确保设置anim可以成功了。

我找到了,Node.EventType.ACTIVE_IN_HIERARCHY_CHANGED,感谢回复 :heart:

1赞

在cocoscreator3.7.4中,感觉似乎不能监听父级节点的active变化.
RxJS封装了一下,下面的代码可以完成所需功能,也就是把所有的父节点连同自己也订阅一下,然后every成一个布尔值,打包后发出。

/**
 * 绑定node的其它内置事件
 * @param node 
 * @param nodeEventType 
 * @returns 
 */
export function BindNodeEvent(node: Node, nodeEventType: NodeEventType) {
    if (!isValid(node)) { warn('BindNodeEvent, node is null'); return EMPTY; }
    return new Observable<Node>(observer => {
        const callback = (param: Node) => observer.next(param);
        node.on(nodeEventType, callback);
        callback(node); // 绑定的同时,认为该事件发生了一次
        return () => {
            if (isValid(node)) {
                node.off(nodeEventType, callback);
            }
        }
    });
}

export function BindNodeActiveInHierarchy(node: Node) {
    if (!isValid(node)) { warn('BindNodeEvent, node is null'); return EMPTY; }
    let nodes = [];
    let _node = node;
    do {
        nodes.push(_node);
        _node = _node.parent;
    } while (_node != null);
    return MergeWithTimer(nodes.map(node => BindNodeEvent(node, NodeEventType.ACTIVE_IN_HIERARCHY_CHANGED))).pipe(map(_ => nodes.every(_ => _.activeInHierarchy)));
}

使用:

            BindNodeActiveInHierarchy(this.node).subscribe(_ => {
                // _ 为布尔值,其值等同于 this.node.activeInHierarchy
            }).addTo(this.node);