当前位置: 首页 > news >正文

Unity MyFramework 用法说明(四):使用 UGUIGenerator 自动生成 UI 代码

上一篇手动创建并打开了第一个热更界面。这一篇使用UGUIGenerator自动生成成员变量、节点绑定、点击事件和界面注册代码。

项目地址:

https://github.com/ZHOURUIH/MyFramework

一、本篇目标

创建一个简单的主界面:

UIMain ├── TitleText ├── StartButton └── CloseButton

通过生成器自动完成:

生成 UIMain.cs 生成成员变量 生成节点绑定 生成按钮点击事件 注册热更界面

二、创建 UI Prefab

创建UIMain.prefab,并保证 Prefab 名称、根节点名称和脚本类名一致:

Prefab:UIMain.prefab 根节点:UIMain 脚本类:UIMain

各节点需要的 UGUI 组件如下:

节点UGUI 组件生成类型
UIMainCanvasUGUIGeneratorLayoutScript
TitleTextTextmyUGUIText
StartButtonImagemyUGUIImageSimple
CloseButtonImagemyUGUIImageSimple

按钮节点不需要添加原生Button组件。

myUGUIImageSimple配合registeColliderImage,可以提供悬停变暗、按下时轻微位移等按钮反馈。

三、配置 UGUIGenerator

在 Prefab 编辑模式下打开UIMain,给根节点添加:

UGUIGenerator

然后把三个节点加入成员列表:

TitleText -> myUGUIText StartButton -> myUGUIImageSimple CloseButton -> myUGUIImageSimple

StartButtonCloseButton勾选:

注册点击事件 生成点击回调

界面基类使用:

LayoutScript

配置完成后,点击:

生成代码

四、生成的界面代码

生成结果大致如下:

using Obfuz; // auto generate member start [ObfuzIgnore(ObfuzScope.TypeName)] public class UIMain : LayoutScript { protected myUGUIText mTitleText; protected myUGUIImageSimple mStartButton; protected myUGUIImageSimple mCloseButton; // auto generate member end public UIMain() { // auto generate constructor start // auto generate constructor end } public override void assignWindow() { // auto generate assignWindow start newObject(out mTitleText, "TitleText"); newObject(out mStartButton, "StartButton"); newObject(out mCloseButton, "CloseButton"); // auto generate assignWindow end } public override void init() { base.init(); // auto generate init start mStartButton.registeColliderImage(onStartButtonClick); mCloseButton.registeColliderImage(onCloseButtonClick); // auto generate init end } public override void onGameState() { base.onGameState(); mTitleText.setText("Hello MyFramework"); } //--------------------------------------------------------------------------------------------------------------------------- protected void onStartButtonClick() { // 开始游戏 } protected void onCloseButtonClick() { close(); } }

生成器只会更新auto generate标记之间的内容。

业务逻辑应该写在自动生成区域外,避免重新生成时被覆盖。

五、普通点击节点怎么配置

如果节点只需要接收点击事件,不需要按钮的悬停和按下效果,可以使用:

myUGUIObject

并通过下面的方法注册:

mNode.registeCollider(onNodeClick);

如果需要按钮视觉反馈,则使用:

myUGUIImageSimple

并注册:

mButton.registeColliderImage(onButtonClick);

本例中的两个按钮需要交互反馈,所以使用myUGUIImageSimple

六、自动注册界面

生成器会自动更新热更界面注册文件:

Assets/Scripts/HotFix/UI/LayoutRegisterHotFix.cs

生成的注册代码类似:

public class LayoutRegisterHotFix { public static void registeAll() { // auto generate start registeLayout<UIMain>((script) => { mUIMain = script; }); // auto generate end } }

同时还会生成对应的全局引用:

public static UIMain mUIMain;

不需要再手动维护注册代码。

七、在 SceneProcedure 中打开界面

界面生成并注册完成后,在对应流程中加载:

public class MainSceneLoading : SceneProcedure { protected override void onInit(SceneProcedure lastProcedure) { base.onInit(lastProcedure); LT.LOAD<UIMain>(); } protected override void onExit(SceneProcedure nextProcedure) { base.onExit(nextProcedure); LT.HIDE<UIMain>(); } }

界面操作需要通过LT调用:

LT.LOAD<UIMain>(); // 加载并显示 LT.SHOW<UIMain>(); // 显示已加载界面 LT.HIDE<UIMain>(); // 隐藏但保留实例 LT.UNLOAD<UIMain>(); // 卸载并释放

直接写LOAD<UIMain>(),在没有额外静态导入时会编译报错。

八、推荐开发流程

创建新界面时,按照下面的顺序操作:

1. 创建 UI Prefab 2. 添加需要的 UGUI 组件 3. 给根节点添加 UGUIGenerator 4. 配置成员类型和点击事件 5. 点击生成代码 6. 补充界面业务逻辑 7. 在 SceneProcedure 中使用 LT.LOAD<T>() 打开

UGUIGenerator负责生成重复代码,LayoutScript负责界面内部逻辑,SceneProcedure负责决定界面什么时候打开和关闭。

http://www.jsqmd.com/news/1180399/

相关文章:

  • 2026 大连合扬黄金回收,无套路无扣费,大盘价直收 - 奢侈品交易观察员
  • 亲身探访成都劳力士官方售后服务中心|官方地址与客服热线(2026年7月最新) - 劳力士官方服务中心
  • C++ STL 算法竞赛模板实战:5类容器与10个高频函数性能对比
  • 编译原理实战:从正则表达式到 DFA 转换,5步实现词法分析器核心
  • AI生成PBR贴图:提升3D建模效率的关键技术
  • 破解资质代办行业乱象 融景集团以本地化精耕模式重塑粤地服务新标准 - 广东科技观察
  • 2026大模型全栈开发:从LangChain到RAG Agent实战指南
  • QNX 微内核与Linux宏内核:3个关键差异及对嵌入式系统设计的影响
  • Reset Windows Update Tool模块化架构深度解析与实现机制
  • Flutter---Button
  • STM32与TS2007FC的嵌入式音频系统设计与优化
  • 5分钟免费永久激活Windows和Office:KMS智能激活终极指南
  • Java项目目录全景详解:从骨架到血肉 / 通过目录结构快速理解项目 / 良好目录结构本身就是一份高质量的“技术文档” / 目录本身就是一份“代码地图”
  • ARIMA模型实战:从理论到Python实现的完整预测流程
  • AMD Ryzen SMU调试工具实战指南:硬件工程师级精准调校完整方案
  • Service Mesh 多集群联邦:跨集群流量路由与证书信任链
  • 2026成都包包回收防坑指南:保值款瑕疵压价怎么避? - 奢品小当家
  • QueryExcel:多Excel文件批量查询的终极解决方案
  • 新技术落地|南昌大学附属三三四医院正式开展斯坦福(SAINT)神经调控疗法 - 资讯焦点
  • 2026昭通卫生间漏水维修哪家靠谱?免砸砖、外墙、地下室、屋顶渗漏处理(7月) - 防水企业百科
  • Unity 2D拖尾效果实战:Trail Renderer与2D光照系统兼容性解决方案
  • MongoDB 6.0+ 批量删除性能对比:deleteMany vs bulkWrite vs remove 的 3 种方案实测
  • 2026上海浦东新区手表回收实地探店测评!正规门店优选攻略 - 全国二奢机构参考
  • wayca-scheduler-bench:从MMTests到高性能调度器测试框架的进化之路
  • 《仲夏夜惊魂》:阳光下的心理恐怖与4K视听美学解析
  • [论文学习]可信LLM智能体综述:威胁与对策
  • 庖丁解牛:从零开始手把手搭建U-Net语义分割模型
  • 昆明高原家电老化快怎么修?2026年五华盘龙实测 - 简单到家
  • 2026北京家装打孔水据切割混凝土切割公司TOP5实测排行 - LYL仔仔
  • 2026 卡地亚腕表官方维修收费明细全解析,7 月售后保养定价规则与费用拆解手册 - 卡地亚中国服务中心