判断parent肯定是不行的,可能是深层的结构,可能当前parent有,但某一层parent还没add进场景。
有这个需求是因为坑王spine,spine设置动画的时候,如果不在场景中可渲染的状态,则设个设置直接被return不会有效果。
所以应该如何方便判断一个node是否已经位于场景中可渲染的状态。
判断parent肯定是不行的,可能是深层的结构,可能当前parent有,但某一层parent还没add进场景。
有这个需求是因为坑王spine,spine设置动画的时候,如果不在场景中可渲染的状态,则设个设置直接被return不会有效果。
所以应该如何方便判断一个node是否已经位于场景中可渲染的状态。
isVaild ?
isVaild貌似只能判断是否已被销毁
node.activeInHierarchy
牛哦,哥们
另外咨询个问题,如果我希望监听node被activeInHierarchy变成true呢?有没有系统的语法?这样我就可以托管spine,确保设置anim可以成功了。
我找到了,Node.EventType.ACTIVE_IN_HIERARCHY_CHANGED,感谢回复 
在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);