
我自己来回答吧!欢迎各位继续完善。

/**
* 保留特定的挂点节点。
* @param skeleton - 要操作的 Spine Skeleton 组件。
* @param attachmentsToKeep - 要保留的挂点名称数组。
*/
public static preserveSpecificAttachments(skeleton: sp.Skeleton, attachmentsToKeep: string | string[]): cc.Node[] {
if (typeof attachmentsToKeep === 'string') {
attachmentsToKeep = [attachmentsToKeep];
}
let attachUtil = skeleton["attachUtil"];
let retainedNodes: cc.Node[] = [];
if (!skeleton || !attachUtil) {
console.error("Spine 组件或 attachUtil 不可用");
return retainedNodes;
}
// 动态生成所有挂点
attachUtil.generateAllAttachedNodes();
// 获取所有生成的挂点节点数组
let attachedNodeArray = attachUtil._attachedNodeArray;
// 删除除了特定挂点之外的所有节点
attachedNodeArray.forEach((node: cc.Node) => {
// 获取不含'ATTACHED_NODE:'前缀的节点名称
let nodeName = node.name.replace('ATTACHED_NODE:', '');
// 如果节点名称不在保留列表中,则销毁该节点
if (attachmentsToKeep.includes(nodeName)) {
node.parent = skeleton.node;
retainedNodes.push(node);
} else {
node.destroy();
}
})
// 不可删除,必须保留。具体原因自测
// let attachedRootNode = sk.attachUtil._attachedRootNode
// attachedRootNode.destroy();
return retainedNodes;
}