支持信息动态注册(用来兼容代码在bundle中的情况)

This commit is contained in:
gongxh
2025-07-22 17:08:02 +08:00
parent 5d48c7d913
commit 366e5fbfb0
4 changed files with 47 additions and 0 deletions

View File

@@ -8,6 +8,7 @@ import { _decorator } from "cc";
import { GRoot } from "fairygui-cc"; import { GRoot } from "fairygui-cc";
import { ModuleBase } from "../module/ModuleBase"; import { ModuleBase } from "../module/ModuleBase";
import { debug } from "../tool/log"; import { debug } from "../tool/log";
import { _uidecorator } from "../ui/UIDecorator";
import { WindowManager } from "../ui/WindowManager"; import { WindowManager } from "../ui/WindowManager";
import { WindowResPool } from "../ui/WindowResPool"; import { WindowResPool } from "../ui/WindowResPool";
import { CocosWindowContainer } from "./CocosWindowContainer"; import { CocosWindowContainer } from "./CocosWindowContainer";
@@ -35,6 +36,7 @@ export class CocosUIModule extends ModuleBase {
this.node.destroyAllChildren(); this.node.destroyAllChildren();
/** 注册窗口信息 */ /** 注册窗口信息 */
WindowManager.registerUI(); WindowManager.registerUI();
_uidecorator.setRegisterFinish();
this.onInit(); this.onInit();
} }

View File

@@ -25,6 +25,23 @@ export class ComponentExtendHelper {
} }
} }
/**
* 动态注册自定义组件
* @param ctor 组件构造函数
* @param pkg 包名
* @param name 组件名
*/
public static dynamicRegister(ctor: any, pkg: string, name: string): void {
const componentKey = `${pkg}/${name}`;
if (this._registeredComponents.has(componentKey)) {
debug(`自定义组件已注册,跳过 组件名:${name} 包名:${pkg}`);
return;
}
debug(`自定义组件注册 组件名:${name} 包名:${pkg}`);
this.registerComponent(ctor, pkg, name);
this._registeredComponents.add(componentKey);
}
/** /**
* 注册自定义组件信息 * 注册自定义组件信息
* @param info * @param info

View File

@@ -5,6 +5,8 @@
*/ */
import { ObjectHelper } from "../tool/helper/ObjectHelper"; import { ObjectHelper } from "../tool/helper/ObjectHelper";
import { ComponentExtendHelper } from "./ComponentExtendHelper";
import { WindowManager } from "./WindowManager";
export namespace _uidecorator { export namespace _uidecorator {
/** @internal */ /** @internal */
const UIPropMeta = "__uipropmeta__" const UIPropMeta = "__uipropmeta__"
@@ -76,6 +78,8 @@ export namespace _uidecorator {
bundle: bundle || "", bundle: bundle || "",
}, },
}); });
// 首次引擎注册完成后 动态注册窗口
_registerFinish && WindowManager.dynamicRegisterWindow(ctor, groupName, pkgName, name, bundle || "");
}; };
} }
@@ -119,6 +123,8 @@ export namespace _uidecorator {
name: name, name: name,
} }
}); });
// 首次引擎注册完成后 动态注册自定义组件
_registerFinish && ComponentExtendHelper.dynamicRegister(ctor, pkg, name);
}; };
} }
@@ -162,6 +168,8 @@ export namespace _uidecorator {
bundle: bundle || "", bundle: bundle || "",
} }
}); });
// 首次引擎注册完成后 动态注册窗口header
_registerFinish && WindowManager.dynamicRegisterHeader(ctor, pkg, name, bundle || "");
}; };
} }
@@ -210,6 +218,13 @@ export namespace _uidecorator {
// debug("方法装饰器:", target.constructor, name, descriptor); // debug("方法装饰器:", target.constructor, name, descriptor);
ObjectHelper.getObjectProp(target.constructor, UICBMeta)[name] = descriptor.value; ObjectHelper.getObjectProp(target.constructor, UICBMeta)[name] = descriptor.value;
} }
let _registerFinish: boolean = false;
/** 首次UI注册完成 */
export function setRegisterFinish(): void {
_registerFinish = true;
}
} }
let _global = globalThis || window || global; let _global = globalThis || window || global;

View File

@@ -208,6 +208,7 @@ export class WindowManager {
* 注册所有UI窗口类到资源池中。 (框架内部使用) * 注册所有UI窗口类到资源池中。 (框架内部使用)
* 该方法遍历所有通过_uidecorator.getWindowMaps()获取的窗口映射, * 该方法遍历所有通过_uidecorator.getWindowMaps()获取的窗口映射,
* 并将每个窗口的资源名称、构造函数、分组和包信息添加到资源池中。 * 并将每个窗口的资源名称、构造函数、分组和包信息添加到资源池中。
* @internal
*/ */
public static registerUI(): void { public static registerUI(): void {
// 窗口注册 // 窗口注册
@@ -225,6 +226,18 @@ export class WindowManager {
ComponentExtendHelper.register(); ComponentExtendHelper.register();
} }
/** 动态注册窗口到资源池中 */
public static dynamicRegisterWindow(ctor: any, group: string, pkg: string, name: string, bundle: string): void {
debug(`窗口注册 窗口名:${name} 包名:${pkg} 组名:${group}`);
this._resPool.add(ctor, group, pkg, name, bundle);
}
/** 动态注册窗口header到资源池中 */
public static dynamicRegisterHeader(ctor: any, pkg: string, name: string, bundle: string): void {
debug(`header注册 header名:${name} 包名:${pkg}`);
this._resPool.addHeader(ctor, pkg, name, bundle);
}
/** /**
* 向窗口管理器添加一个窗口组 如果窗口组名称已存在,则抛出错误. (内部方法) * 向窗口管理器添加一个窗口组 如果窗口组名称已存在,则抛出错误. (内部方法)
* @param group 要添加的窗口组 * @param group 要添加的窗口组