From 366e5fbfb030bde8cd155cd90d47467a99764a96 Mon Sep 17 00:00:00 2001 From: gongxh Date: Tue, 22 Jul 2025 17:08:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=BF=A1=E6=81=AF=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E6=B3=A8=E5=86=8C(=E7=94=A8=E6=9D=A5=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E4=BB=A3=E7=A0=81=E5=9C=A8bundle=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E6=83=85=E5=86=B5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cocos/CocosUIModule.ts | 2 ++ src/ui/ComponentExtendHelper.ts | 17 +++++++++++++++++ src/ui/UIDecorator.ts | 15 +++++++++++++++ src/ui/WindowManager.ts | 13 +++++++++++++ 4 files changed, 47 insertions(+) diff --git a/src/cocos/CocosUIModule.ts b/src/cocos/CocosUIModule.ts index ae675c8..db121b9 100644 --- a/src/cocos/CocosUIModule.ts +++ b/src/cocos/CocosUIModule.ts @@ -8,6 +8,7 @@ import { _decorator } from "cc"; import { GRoot } from "fairygui-cc"; import { ModuleBase } from "../module/ModuleBase"; import { debug } from "../tool/log"; +import { _uidecorator } from "../ui/UIDecorator"; import { WindowManager } from "../ui/WindowManager"; import { WindowResPool } from "../ui/WindowResPool"; import { CocosWindowContainer } from "./CocosWindowContainer"; @@ -35,6 +36,7 @@ export class CocosUIModule extends ModuleBase { this.node.destroyAllChildren(); /** 注册窗口信息 */ WindowManager.registerUI(); + _uidecorator.setRegisterFinish(); this.onInit(); } diff --git a/src/ui/ComponentExtendHelper.ts b/src/ui/ComponentExtendHelper.ts index dd4f0de..b0e3f8c 100644 --- a/src/ui/ComponentExtendHelper.ts +++ b/src/ui/ComponentExtendHelper.ts @@ -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 diff --git a/src/ui/UIDecorator.ts b/src/ui/UIDecorator.ts index f0f734a..2cf4938 100644 --- a/src/ui/UIDecorator.ts +++ b/src/ui/UIDecorator.ts @@ -5,6 +5,8 @@ */ import { ObjectHelper } from "../tool/helper/ObjectHelper"; +import { ComponentExtendHelper } from "./ComponentExtendHelper"; +import { WindowManager } from "./WindowManager"; export namespace _uidecorator { /** @internal */ const UIPropMeta = "__uipropmeta__" @@ -76,6 +78,8 @@ export namespace _uidecorator { bundle: bundle || "", }, }); + // 首次引擎注册完成后 动态注册窗口 + _registerFinish && WindowManager.dynamicRegisterWindow(ctor, groupName, pkgName, name, bundle || ""); }; } @@ -119,6 +123,8 @@ export namespace _uidecorator { name: name, } }); + // 首次引擎注册完成后 动态注册自定义组件 + _registerFinish && ComponentExtendHelper.dynamicRegister(ctor, pkg, name); }; } @@ -162,6 +168,8 @@ export namespace _uidecorator { bundle: bundle || "", } }); + // 首次引擎注册完成后 动态注册窗口header + _registerFinish && WindowManager.dynamicRegisterHeader(ctor, pkg, name, bundle || ""); }; } @@ -210,6 +218,13 @@ export namespace _uidecorator { // debug("方法装饰器:", target.constructor, name, descriptor); ObjectHelper.getObjectProp(target.constructor, UICBMeta)[name] = descriptor.value; } + + let _registerFinish: boolean = false; + + /** 首次UI注册完成 */ + export function setRegisterFinish(): void { + _registerFinish = true; + } } let _global = globalThis || window || global; diff --git a/src/ui/WindowManager.ts b/src/ui/WindowManager.ts index bca6c9b..8469093 100644 --- a/src/ui/WindowManager.ts +++ b/src/ui/WindowManager.ts @@ -208,6 +208,7 @@ export class WindowManager { * 注册所有UI窗口类到资源池中。 (框架内部使用) * 该方法遍历所有通过_uidecorator.getWindowMaps()获取的窗口映射, * 并将每个窗口的资源名称、构造函数、分组和包信息添加到资源池中。 + * @internal */ public static registerUI(): void { // 窗口注册 @@ -225,6 +226,18 @@ export class WindowManager { 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 要添加的窗口组