背景
在一个Unity项目中或多或少需要一些UI,如设置页面,登录页面等,当页面过多时,使用一个通用的UI框架来进行针对性开发会大大减少造轮子的过程。 以下即为参考之前做过的一些项目整理出来的一个易于实现且扩展性比较强的UI界面管理的简易框架的实现思路。
思路概述
将所有的UI界面统一继承一个基类,在基类中实现UI的显示隐藏等UI通用功能,然后定义一个管理类将所有的界面信息放入字典中进行统一管理。重写系统的监听方法,实现对按钮的等UI的监听,并开放一个接口来给需要监听的UI来调用添加监听与相应委托事件。
具体实现代码及其思路梳理
UI路径信息
将所有的UI提前制作好预制体保存在相应路径中,建立一个UIPathData类来封装UI的路径和信息。在类中用一个字典来保存路径和名称,另设几个基本变量来保存当前UI的状态。
1 |
|
在类的构造方法中设置界面加载所需的参数如界面资源名称、所在层级、父节点锚点类型等。
1 |
|
然后在类中实现一些静态方法方便对字典的查询
1 |
|
经过以上步骤我们便有了一个保存有UI的路径等信息的字典,并且通过实例化即可将UI加入字典来进行管理。所以在类中创建一个新的类,在类中将所有的UI进行实例化便可直接获得保存有所有UI的字典。当有新的UI需要加入项目时也只需要在此进行实例化即可。
1 |
|
UI的基类
对于每个UI预制体的逻辑,我们先创建一个UI基类BaseUI。在该类中用一个字典来存放当前UI界面用到的所有物体。
1 |
|
每个UI都需要显示、隐藏、销毁及初始化的功能,于是把它们添加进基类并定义为虚方法
1 |
|
添加获取所有子物体的初始化方法UIinit(),将它和Init方法在Awake()方法中调用,这样当UI资源被实例化后都能获取到所有的子物体并存入字典,接着将执行每个UI界面各自的初始化方法。
1 |
|
因为只有基类直接继承了MonoBehaver,所以在基类中将系统方法根据需要定义成虚方法,方便子类重写
1 |
|
界面的基类
再写一个界面基类BasePanel来继承BaseUI,所有界面的UI逻辑脚本都将继承该基类。在这里重载基类的显示隐藏与销毁方法,在界面初始化时获取或添加CanvasGroup组件,用来控制界面显示与隐藏。
1 |
|
在该类中实现显示、隐藏与销毁的方法
1 |
|
UI的加载管理
用单例模式定义一个UI加载管理类,在类中定义两个字典用于保存所有UI及其对应预制体资源,用以对所有的UI界面进行管理
1 |
|
在类中实现界面的打开,定义一个委托,当界面打开后需要执行回调函数时将作为参数传入加载UI的方法。 在加载UI时先去查找字典中是否存在该UI的记录,如果能查得到但资源丢失则直接清除记录,资源存在则直接打开。 当不存在资源时则调用资源管理层的方法来加载UI资源(这里示例调用了系统接口加载Resource文件夹里的预制体)。
1 |
|
关闭界面的方法:
1 |
|
界面的打开与关闭
当需要关闭某个界面时只需要在界面基类的关闭界面方法添加对该静态方法的调用
1 |
|
对于管理类中打开界面方法的调用可以新建一个类来作为所有界面打开的入口
1 |
|
UI事件的监听
对于UI事件的监听,先定义一个事件触发器,该类继承EventTrigger,在类中定义所需要监听的事件的委托,然后重写EventTrigger里相应的方法
1 |
|
然后在该类中定义一个方法来添加监听即可
1 |
|
当需要的时候使用以下形式给UI组件添加委托
1 |
|
说明
1.该框架需要将需要加载的UI界面提前制作成预制体的形式进行存储,然后每个界面的逻辑可在各自的UI上挂载各自的逻辑脚本 2.该模板只是一个初步整理的简易框架,可能描述会有不清晰,框架结构不完善考虑不周到等问题,后续会不断完善优化。