美文网首页
CocosCreator3.x中,获得Node和其使用的Spri

CocosCreator3.x中,获得Node和其使用的Spri

作者: 全新的饭 | 来源:发表于2023-08-21 10:18 被阅读0次

说明

对于给定的几个节点,找到他们及其所有子孙节点的Sprite组件中配置的SpriteFrame。
对上述所有SpriteFrame进行分类:

  1. 若该图片被超过1个节点使用(使用的意思是其被配置为该节点或其某个子孙节点的Sprite的SpriteFrame),则将其加入列表:通用图片
  2. 否则,将其与对应的节点相关联:最终生成各节点与一组图片的对应关系

将上述分类结果以json形式显示出来。

使用方式

  1. 将代码作为任一Node的组件后,将该Node放入场景中。
  2. 将要处理的若干Node全部拖入该组件的Node列表字段中。
  3. 运行游戏后,按空格键,可以在日志中看到输出的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);
    }
}

相关文章

网友评论

      本文标题:CocosCreator3.x中,获得Node和其使用的Spri

      本文链接:https://www.haomeiwen.com/subject/nqgemdtx.html