UI系统制作流程
* [一、准备UI预制](#一-准备ui预制)
* [二、控制脚本](#二-控制脚本)
* [三、UI系统的对象池](#三-ui系统的对象池)
* [三、配入UI表](#三-配入ui表)
* [四、窗口的显示或关闭](#四-窗口的显示或关闭)
一、准备UI预制
先准备好效果图和资源图集
- 1.新建空场景,在目录下建好资源图集
- 2.找到 LoginUI.prefab , 施入场景后,Unpack prefab completed完全解除关联
- 3.清空根结点的Animator组件和Reference Collector组件,并改名, 以 #Name#UI 的方式
- 4.清空Panel下所有内容,让结构保持为Bg, Panel两个一级子结点
- *5.复制Bg结点,放入美术做好的效果图
- 5.根据UGUI规则完成预制制作
- 6.根结点添加Reference Collector Group组件
- 7.完成后交由特效师添加动画
- 8.将资源放入Addressable Groups的UI组里,右键使用Simplify Addressable Name, 将名字简化
二、控制脚本
1.创建: 在Hotfix 建立文件夹,名字以功能命名,建立Compoents文件夹,新建控制脚本,命名以 UI#Name#Window的方式,如LoginUI,脚本名应为UILoginWindow.cs
2.类的规则以 UIClickWindow.cs为参考。
3.必须有的构造,以指明加载需要的预制名
public UIClickWindow():base() |
4.必须重写有如下函数:
/// <summary> |
- 可选的函数
/// <summary> |
三、UI系统的对象池
1.命名池子模板对象的key于头部,如:
private const string TaskItemTemplate = "UICarnivalWindow_TaskItemTemplate"; |
2.添加对象为模板,让底层创建一个以模板为基的池子
AddTemplate(NormalCardItemTemplate, normalItemObj); |
3.获取: 仅获取一个对象
GetTemplateInstance(string name, Transform parent, bool isActive) |
传入1.定义的模板名字,父对象,是否隐藏就决定获取出来后是否立即隐藏。
4.定义对应模板对象的控制类
- 必须继承UIBaseComponent类
- 继承覆写函数:
///初始化函数,每次设置预制时都将会自动调用一次 |
5.获取: 获取一个带对象控制器的类对象(将同时生成一个对象放在类的Root)
GetTemplateComponent<T>(string name, Transform parent, bool isActive) where T : UIBaseComponent |
传入1.定义的模板名字,父对象,是否隐藏就决定获取出来后是否立即隐藏。
6.回收
- 回收预制:
FreeTemplateInstance(NormalCardItemTemplate);
- 回收预制管理类,不会回收预制:
FreeTemplateComponent(NormalCardItemTemplate);
所以一般两个需要成对调用,如:
FreeTemplateInstance(NormalCardItemTemplate); |
7.销毁池子
- 使用UIBaseWindow自带函数销毁单个模板的池子
/// 移除模板 |
Window在销毁时将调用DestroyAllTemplates() 先回收所有的预制,再清空池子。因此一般不需要在逻辑里手动移除池子.
三、配入UI表
1.找到资源表 fgame_ui_config.elsx 按表内的说明配置UI的参数
2.导表
四、窗口的显示或关闭
- 使用UIManager提供的函数显示或关闭一个Window,如:
//同步函数显示一个Window |