| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 | import { Constructor, director, error, find, instantiate, Node, Prefab, resources, Scene } from "cc";import { UIBase, UIType } from "../Game/GameFrameWork/UIBase";class UIManager {    static instance: UIManager = null;    private _uis: Map<string, UIBase> = new Map();    private _uiNodes: Map<string, Node> = new Map();    private _prefabs: Map<string, Prefab> = new Map();        //获取UI    getUI<T extends UIBase>(name: string | Constructor<T>): T {        if (typeof (name) === "string") {            return <T>this._uis.get(name);        }        //遍历所有的value组成的数组        for (const ui of Array.from(this._uis.values())) {            if (ui instanceof name) {                return <T>ui;            }        }        return null;    }    //打开页面 全屏 弹窗 挂件    async openUI(preName: string, type: UIType = UIType.PAGE) {        let ui = this._uis.get(preName);        if (ui) {            //把ui显示出来            ui.show();            return;        }        //是否在节点容器当中        let node = this._uiNodes.get(preName);        if (node) {            node.active = true;            return;        }        //node 不存在的情况下 加载出来        //先判断一下预制体是否下载过        let prefab = this._prefabs.get(preName);        if (!prefab) {            prefab = await this._loadUI("UI/" + preName);            this._prefabs.set(preName, prefab)        }        //查找ui根节点        node = instantiate(prefab);        let root = find("Canvas/UIRoot");        if(!root){            //如果场景当中没有 就加载预制体 创建一个            const rootPre: Prefab = await this._loadUI("UI/UIRoot")            root = instantiate(rootPre);            root.parent = find("Canvas");        }        node.parent = root.children[type];        //处理逻辑        ui = node.getComponent(UIBase);        if (ui) {            //对ui进行多态处理            ui.init();            ui.UIName = preName;            this._uis.set(preName, ui);            return;        }        this._uiNodes.set(preName, node);        // resources.load("UI/" + preName, Prefab, (err: Error, asset: Prefab)=>{        //     const node = instantiate(asset);        //     node.parent = find("Canvas/UIRoot").children[type];        //     //处理逻辑        //     const ui = node.getComponent(UIBase);        //     //对UI进行多态处理        // })    }    async openScene(sceneName: string, uiName?: string){        await this._loadScene(sceneName);        uiName && this.openUI(uiName);    }    private _loadScene(sceneName: string){        new Promise((revolve, reject)=>{            director.loadScene(sceneName,(err: Error, scene: Scene)=>{                if(err){                    error("加载" + sceneName + "场景错误!");                    reject(err);                }                else{                    revolve(scene);                }            })        })    }    //加载UI预制体    private _loadUI(path: string): Promise<Prefab> {        return new Promise((revole, reject) => {            resources.load(path, Prefab, (err: Error, asset: Prefab) => {                if (err) {                    reject(err);                } else {                    revole(asset);                }            })        })    }    //关闭UI    closeUI(uibase: string | UIBase, clear: boolean = true){        let ui: UIBase;        if(typeof(uibase) === "string"){            ui = this._uis.get(uibase);            if(ui){                ui.hide(clear);                clear && this._uis.delete(uibase);            }            return;        }            uibase.hide(clear);        clear && this._uis.delete(uibase.UIName);        return;        // for(const u of Array.from(this._uis.values())){        //     if(uiName === u){        //         u.hide(clear);        //         return;        //     }        // }    }    //UI之间的消息互通    sendMsg(msg: string,ui: string|UIBase, ...args){        let m: UIBase;        if(typeof(ui) === "string"){            m = this.getUI(ui);        }        else{            m = ui;        }        //判断如果找到的UI模块是个空 什么也不做        if(!m){            return;        }        //m 是个对象 找m中有没有 名字叫做msg的函数        //对象都是键值对 访问键对应的值        const func = m[msg];        if(func && typeof(func) === "function"){            func.apply(m, [...args]);            return;        }    }}export const UIMgr: UIManager = UIManager.instance = new UIManager();
 |