mirror of
				https://github.com/Gongxh0901/kunpolibrary
				synced 2025-10-31 03:15:45 +00:00 
			
		
		
		
	feat: 支持UI包从指定的Asset Bundle中加载
- 现在可以为每个FairyGUI包配置其所在的Asset Bundle名称。 - WindowManager和WindowResPool已更新,以处理从不同bundle加载UI包的逻辑。 - 这使得UI资源可以不打包在中,方便进行更灵活的资源管理和分包加载。
This commit is contained in:
		| @@ -7,6 +7,10 @@ | |||||||
| interface IPackageConfig { | interface IPackageConfig { | ||||||
|     /** UI所在resources中的路径 */ |     /** UI所在resources中的路径 */ | ||||||
|     uiPath: string; |     uiPath: string; | ||||||
|  |  | ||||||
|  |     /** 如果UI不在 resources 中,则需要配置 所在bundle下的路径名*/ | ||||||
|  |     bundlePaths?: { [bundleName: string]: string }; | ||||||
|  |  | ||||||
|     /**  |     /**  | ||||||
|      * 手动管理资源的包 |      * 手动管理资源的包 | ||||||
|      * 1. 用于基础UI包, 提供一些最基础的组件,所有其他包都可能引用其中的内容 |      * 1. 用于基础UI包, 提供一些最基础的组件,所有其他包都可能引用其中的内容 | ||||||
|   | |||||||
| @@ -40,6 +40,8 @@ export namespace _uidecorator { | |||||||
|             pkg: string; |             pkg: string; | ||||||
|             /** 窗口名 */ |             /** 窗口名 */ | ||||||
|             name: string; |             name: string; | ||||||
|  |             /** 窗口bundle名 */ | ||||||
|  |             bundle: string; | ||||||
|         }; |         }; | ||||||
|     } |     } | ||||||
|     /** 用来存储窗口注册信息 @internal */ |     /** 用来存储窗口注册信息 @internal */ | ||||||
| @@ -56,7 +58,7 @@ export namespace _uidecorator { | |||||||
|      * @param {string} pkgName fgui包名 |      * @param {string} pkgName fgui包名 | ||||||
|      * @param {string} name 窗口名 (与fgui中的组件名一一对应) |      * @param {string} name 窗口名 (与fgui中的组件名一一对应) | ||||||
|      */ |      */ | ||||||
|     export function uiclass(groupName: string, pkgName: string, name: string): Function { |     export function uiclass(groupName: string, pkgName: string, name: string, bundle?: string): Function { | ||||||
|         /** target 类的构造函数 */ |         /** target 类的构造函数 */ | ||||||
|         return function (ctor: any): void { |         return function (ctor: any): void { | ||||||
|             // debug(`uiclass >${JSON.stringify(res)}<`); |             // debug(`uiclass >${JSON.stringify(res)}<`); | ||||||
| @@ -71,6 +73,7 @@ export namespace _uidecorator { | |||||||
|                     group: groupName, |                     group: groupName, | ||||||
|                     pkg: pkgName, |                     pkg: pkgName, | ||||||
|                     name: name, |                     name: name, | ||||||
|  |                     bundle: bundle || "", | ||||||
|                 }, |                 }, | ||||||
|             }); |             }); | ||||||
|         }; |         }; | ||||||
| @@ -127,6 +130,8 @@ export namespace _uidecorator { | |||||||
|             pkg: string; |             pkg: string; | ||||||
|             /** 组件名 */ |             /** 组件名 */ | ||||||
|             name: string; |             name: string; | ||||||
|  |             /** headerbundle名 */ | ||||||
|  |             bundle: string; | ||||||
|         }; |         }; | ||||||
|     } |     } | ||||||
|     /** 用来存储组件注册信息 @internal */ |     /** 用来存储组件注册信息 @internal */ | ||||||
| @@ -142,7 +147,7 @@ export namespace _uidecorator { | |||||||
|      * @param {string} pkg 包名 |      * @param {string} pkg 包名 | ||||||
|      * @param {string} name 组件名 |      * @param {string} name 组件名 | ||||||
|      */ |      */ | ||||||
|     export function uiheader(pkg: string, name: string): Function { |     export function uiheader(pkg: string, name: string, bundle?: string): Function { | ||||||
|         return function (ctor: any): void { |         return function (ctor: any): void { | ||||||
|             // log(`pkg:【${pkg}】 uiheader prop >${JSON.stringify(ctor[UIPropMeta] || {})}<`); |             // log(`pkg:【${pkg}】 uiheader prop >${JSON.stringify(ctor[UIPropMeta] || {})}<`); | ||||||
|             uiheaderMap.set(ctor, { |             uiheaderMap.set(ctor, { | ||||||
| @@ -154,6 +159,7 @@ export namespace _uidecorator { | |||||||
|                 res: { |                 res: { | ||||||
|                     pkg: pkg, |                     pkg: pkg, | ||||||
|                     name: name, |                     name: name, | ||||||
|  |                     bundle: bundle || "", | ||||||
|                 } |                 } | ||||||
|             }); |             }); | ||||||
|         }; |         }; | ||||||
|   | |||||||
| @@ -213,13 +213,13 @@ export class WindowManager { | |||||||
|         // 窗口注册 |         // 窗口注册 | ||||||
|         for (const { ctor, res } of _uidecorator.getWindowMaps().values()) { |         for (const { ctor, res } of _uidecorator.getWindowMaps().values()) { | ||||||
|             debug(`窗口注册  窗口名:${res.name} 包名:${res.pkg} 组名:${res.group}`); |             debug(`窗口注册  窗口名:${res.name} 包名:${res.pkg} 组名:${res.group}`); | ||||||
|             this._resPool.add(ctor, res.group, res.pkg, res.name); |             this._resPool.add(ctor, res.group, res.pkg, res.name, res.bundle); | ||||||
|  |  | ||||||
|         } |         } | ||||||
|         // 窗口header注册 |         // 窗口header注册 | ||||||
|         for (const { ctor, res } of _uidecorator.getHeaderMaps().values()) { |         for (const { ctor, res } of _uidecorator.getHeaderMaps().values()) { | ||||||
|             debug(`header注册  header名:${res.name} 包名:${res.pkg}`); |             debug(`header注册  header名:${res.name} 包名:${res.pkg}`); | ||||||
|             this._resPool.addHeader(ctor, res.pkg, res.name); |             this._resPool.addHeader(ctor, res.pkg, res.name, res.bundle); | ||||||
|         } |         } | ||||||
|         // 组件注册 |         // 组件注册 | ||||||
|         ComponentExtendHelper.register(); |         ComponentExtendHelper.register(); | ||||||
|   | |||||||
| @@ -4,6 +4,7 @@ | |||||||
|  * @Description:  |  * @Description:  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
|  | import { assetManager, resources } from "cc"; | ||||||
| import { UIObjectFactory, UIPackage } from "fairygui-cc"; | import { UIObjectFactory, UIPackage } from "fairygui-cc"; | ||||||
| import { warn } from "../kunpocc"; | import { warn } from "../kunpocc"; | ||||||
| import { IPackageConfigRes } from "./IPackageConfig"; | import { IPackageConfigRes } from "./IPackageConfig"; | ||||||
| @@ -17,11 +18,17 @@ export interface WindowInfo { | |||||||
|     pkg: string; |     pkg: string; | ||||||
|     /** 窗口名 */ |     /** 窗口名 */ | ||||||
|     name: string; |     name: string; | ||||||
|  |     /** bundle名 */ | ||||||
|  |     bundle: string; | ||||||
| } | } | ||||||
|  |  | ||||||
| export interface HeaderInfo { | export interface HeaderInfo { | ||||||
|  |     /** 类的构造函数 */ | ||||||
|     ctor: any; |     ctor: any; | ||||||
|  |     /** fgui包名 */ | ||||||
|     pkg: string; |     pkg: string; | ||||||
|  |     /** bundle名 */ | ||||||
|  |     bundle: string; | ||||||
| } | } | ||||||
|  |  | ||||||
| /** @internal */ | /** @internal */ | ||||||
| @@ -30,6 +37,8 @@ export class WindowResPool { | |||||||
|     protected _windowInfos: Map<string, WindowInfo> = new Map<string, any>(); |     protected _windowInfos: Map<string, WindowInfo> = new Map<string, any>(); | ||||||
|     /** 窗口header信息池 @internal */ |     /** 窗口header信息池 @internal */ | ||||||
|     protected _headerInfos: Map<string, HeaderInfo> = new Map<string, any>(); |     protected _headerInfos: Map<string, HeaderInfo> = new Map<string, any>(); | ||||||
|  |     /** UI包所在的bundle名 */ | ||||||
|  |     private _pkgBundles: Map<string, string> = new Map<string, string>(); | ||||||
|  |  | ||||||
|     /** 是否设置过配置内容 @internal */ |     /** 是否设置过配置内容 @internal */ | ||||||
|     private _isInit: boolean = false; |     private _isInit: boolean = false; | ||||||
| @@ -37,8 +46,12 @@ export class WindowResPool { | |||||||
|     private _windowPkgs: Map<string, string[]> = new Map(); |     private _windowPkgs: Map<string, string[]> = new Map(); | ||||||
|     /** 包的引用计数 @internal */ |     /** 包的引用计数 @internal */ | ||||||
|     private _pkgRefs: { [pkg: string]: number } = {}; |     private _pkgRefs: { [pkg: string]: number } = {}; | ||||||
|  |  | ||||||
|     /** UI包路径 @internal */ |     /** UI包路径 @internal */ | ||||||
|     private _uipath: string = ""; |     // private _uipath: string = ""; | ||||||
|  |     /** UI包在bundle中的路径 @internal */ | ||||||
|  |     private _uiPaths: { [bundle: string]: string } = {}; | ||||||
|  |  | ||||||
|     /** 手动管理的包 @internal */ |     /** 手动管理的包 @internal */ | ||||||
|     private _manualPackages: Set<string> = new Set(); |     private _manualPackages: Set<string> = new Set(); | ||||||
|     /** 立即释放的包 @internal */ |     /** 立即释放的包 @internal */ | ||||||
| @@ -58,7 +71,7 @@ export class WindowResPool { | |||||||
|      * 注册窗口信息 |      * 注册窗口信息 | ||||||
|      * @param info  |      * @param info  | ||||||
|      */ |      */ | ||||||
|     public add(ctor: any, group: string, pkg: string, name: string): void { |     public add(ctor: any, group: string, pkg: string, name: string, bundle: string): void { | ||||||
|         if (this.has(name)) { |         if (this.has(name)) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| @@ -66,8 +79,10 @@ export class WindowResPool { | |||||||
|             ctor: ctor, |             ctor: ctor, | ||||||
|             group: group, |             group: group, | ||||||
|             pkg: pkg, |             pkg: pkg, | ||||||
|             name: name |             name: name, | ||||||
|  |             bundle: bundle | ||||||
|         }); |         }); | ||||||
|  |         this._pkgBundles.set(pkg, bundle || "resources"); | ||||||
|         this.addWindowPkg(name, pkg); |         this.addWindowPkg(name, pkg); | ||||||
|         // 窗口组件扩展 |         // 窗口组件扩展 | ||||||
|         UIObjectFactory.setExtension(`ui://${pkg}/${name}`, ctor); |         UIObjectFactory.setExtension(`ui://${pkg}/${name}`, ctor); | ||||||
| @@ -88,14 +103,16 @@ export class WindowResPool { | |||||||
|      * 注册窗口header信息 |      * 注册窗口header信息 | ||||||
|      * @param info  |      * @param info  | ||||||
|      */ |      */ | ||||||
|     public addHeader(ctor: any, pkg: string, name: string): void { |     public addHeader(ctor: any, pkg: string, name: string, bundle: string): void { | ||||||
|         if (this.hasHeader(name)) { |         if (this.hasHeader(name)) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         this._headerInfos.set(name, { |         this._headerInfos.set(name, { | ||||||
|             ctor: ctor, |             ctor: ctor, | ||||||
|             pkg: pkg |             pkg: pkg, | ||||||
|  |             bundle: bundle | ||||||
|         }); |         }); | ||||||
|  |         this._pkgBundles.set(pkg, bundle || "resources"); | ||||||
|         // 窗口header扩展 |         // 窗口header扩展 | ||||||
|         UIObjectFactory.setExtension(`ui://${pkg}/${name}`, ctor); |         UIObjectFactory.setExtension(`ui://${pkg}/${name}`, ctor); | ||||||
|     } |     } | ||||||
| @@ -124,10 +141,13 @@ export class WindowResPool { | |||||||
|         this._hideWaitWindow = res?.hideWaitWindow; |         this._hideWaitWindow = res?.hideWaitWindow; | ||||||
|         this._fail = res?.fail; |         this._fail = res?.fail; | ||||||
|  |  | ||||||
|         this._uipath = res.config?.uiPath || ""; |         this._uiPaths = res.config?.bundlePaths || {}; | ||||||
|         // 如果uipath不以/结尾 则添加/ |         this._uiPaths["resources"] = res.config?.uiPath || ""; | ||||||
|         if (this._uipath != "" && !this._uipath.endsWith("/")) { |  | ||||||
|             this._uipath += "/"; |         for (const bundle in this._uiPaths) { | ||||||
|  |             if (this._uiPaths[bundle] != "" && !this._uiPaths[bundle].endsWith("/")) { | ||||||
|  |                 this._uiPaths[bundle] += "/"; | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         this._manualPackages = new Set(res.config.manualPackages || []); |         this._manualPackages = new Set(res.config.manualPackages || []); | ||||||
| @@ -249,7 +269,12 @@ export class WindowResPool { | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         for (const pkg of needLoadPkgs) { |         for (const pkg of needLoadPkgs) { | ||||||
|             UIPackage.loadPackage(this._uipath + pkg, (err: any) => { |             let bundleName = this.getPkgBundle(pkg); | ||||||
|  |             let bundle = bundleName === "resources" ? resources : assetManager.getBundle(bundleName); | ||||||
|  |             if (!bundle) { | ||||||
|  |                 throw new Error(`UI包【${pkg}】所在的bundle【${bundleName}】未加载`); | ||||||
|  |             } | ||||||
|  |             UIPackage.loadPackage(bundle, this.getPkgPath(pkg), (err: any) => { | ||||||
|                 total--; |                 total--; | ||||||
|                 err ? failPkgs.push(pkg) : successPkgs.push(pkg); |                 err ? failPkgs.push(pkg) : successPkgs.push(pkg); | ||||||
|                 if (total > 0) { |                 if (total > 0) { | ||||||
| @@ -264,6 +289,17 @@ export class WindowResPool { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** 获取UI包所在的bundle名 */ | ||||||
|  |     private getPkgBundle(pkg: string): string { | ||||||
|  |         return this._pkgBundles.get(pkg) || "resources"; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** 获取UI包在bundle中的路径 */ | ||||||
|  |     private getPkgPath(pkg: string): string { | ||||||
|  |         let bundle = this._pkgBundles.get(pkg); | ||||||
|  |         return this._uiPaths[bundle] + pkg; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /** 获取窗口对应的包名列表 */ |     /** 获取窗口对应的包名列表 */ | ||||||
|     private getWindowPkgs(windowName: string): string[] { |     private getWindowPkgs(windowName: string): string[] { | ||||||
|         if (this._windowPkgs.has(windowName)) { |         if (this._windowPkgs.has(windowName)) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user