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();
|