说明
对于给定的几个节点,找到他们及其所有子孙节点的Sprite组件中配置的SpriteFrame。
对上述所有SpriteFrame进行分类:
- 若该图片被超过1个节点使用(使用的意思是其被配置为该节点或其某个子孙节点的Sprite的SpriteFrame),则将其加入列表:通用图片
- 否则,将其与对应的节点相关联:最终生成各节点与一组图片的对应关系
将上述分类结果以json形式显示出来。
使用方式
- 将代码作为任一Node的组件后,将该Node放入场景中。
- 将要处理的若干Node全部拖入该组件的Node列表字段中。
- 运行游戏后,按空格键,可以在日志中看到输出的json。
具体代码
Fan_GetNodeUseSprites.ts
import { _decorator, Component, Node, input, Input, EventKeyboard, KeyCode, Sprite, SpringJoint2D, Asset, assetManager, SpriteFrame } from 'cc';
import { JSB } from 'cc/env';
const { ccclass, property } = _decorator;
@ccclass('Fan_GetNodeUseSprites')
export class Fan_GetNodeUseSprites extends Component {
@property({ type: [Node], displayName: "目标node", visible: true })
private _targetNodes: Node[] = [];
start() {
this.init();
}
onDestroy() {
this.myDestroy();
}
private init(): void {
input.on(Input.EventType.KEY_DOWN, this.onClickKey, this);
}
private myDestroy(): void {
input.off(Input.EventType.KEY_DOWN, this.onClickKey, this);
}
private onClickKey(eventKeyboard: EventKeyboard): void {
if (eventKeyboard.keyCode == KeyCode.SPACE) {
this.doSth();
}
}
private doSth(): void {
// 生成字典:node名称-图片名称列表(不重复)
let nodeAndSpritesMap: Map<string, string[]> = new Map();
for (let n of this._targetNodes) {
let spriteNames: string[] = [];
let sprites = n.getComponentsInChildren(Sprite);
for (let s of sprites) {
if (s.spriteFrame != null && spriteNames.indexOf(s.spriteFrame.name) < 0) {
spriteNames.push(s.spriteFrame.name);
}
}
nodeAndSpritesMap.set(n.name, spriteNames);
}
// 生成字典:图片名称-node名称列表
let spriteNameAndNodeNamesMap: Map<string, string[]> = new Map();
nodeAndSpritesMap.forEach((value, key) => {
for (let spriteName of value) {
if (!spriteNameAndNodeNamesMap.has(spriteName)) {
spriteNameAndNodeNamesMap.set(spriteName, []);
}
spriteNameAndNodeNamesMap.get(spriteName).push(key);
}
});
const commonMinCnt = 2;
let commonSpritesList: string[] = [];
let specialSpritesMap: Map<string, string[]> = new Map();
// 依次处理各图片(分类)
// 若node名称列表长度大于1,则加入common列表
// 否则加入字典:node名称-图片名称列表
spriteNameAndNodeNamesMap.forEach((value, key) => {
if (spriteNameAndNodeNamesMap.get(key).length >= commonMinCnt) {
commonSpritesList.push(key);
}
else {
for (let nodeName of value) {
if (!specialSpritesMap.has(nodeName)) {
specialSpritesMap.set(nodeName, []);
}
specialSpritesMap.get(nodeName).push(key);
}
}
});
let specialSpritesMapJsonObject = {};
specialSpritesMap.forEach((value, key) => {
specialSpritesMapJsonObject[key] = value;
});
// 输出:做成json,输出为1个字符串
// 1. common图片列表
// 2. 字典:其余图片对应node(node名称-图片名称列表)
let outputData =
{
'通用图片:': commonSpritesList,
'Panel及其使用的非通用图片:': specialSpritesMapJsonObject
};
let outputJsonData = JSON.stringify(outputData);
console.info(outputJsonData);
}
}
网友评论