UGUI系列博文,可通过导航帖查看
最近自己写了一套简单的UI框架,基本思想是基于mvc的,但是由于是给比较小型的项目设计的框架,整体解耦并不十分彻底,这样降低了调试难度,整体复杂度也相对较低,算是按自己的理解做了取舍。
AUIRoot:是根节点抽象类,负责所有系统的初始化
IUIManager:是UI组件的管理类,提供UI界面显示,返回等统一接口
IUIDataHandlerManager :是数据处理器管理类,提供对数据处理器的缓存,添加,移除等接口
IUILayerManager :是UI层级管理类,根据UI预设的层级划分,系统自动设置UI的父物体,利用unity的自然层级管理UI的显示层级
IUIEffectManager :是UI动效管理类,架构内的动效类与UI系统完全解耦,此类负责管理UI动效的播放,提供UI物体Active状态及对象初始化状态的回调接口
AUIPathManager :UI路径管理接口,类似与配置文件,需要手动在类的字典UIPathDic里配置路径
####2)其他接口
AUIBase :UI基类,定义了处理UI的状态切换及回调事件等接口
AUIEffect :UI动效基类,定义了UI动效切换的接口及回调事件
IData :数据基类,用标记类为数据类
DataHandler :数据处理器接口,定义数据初始化,数据更新接口,此类进行数据的操作
UI状态枚举
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mG9OgytF-1577879706134)(https://i.loli.net/2018/05/27/5b0aa498e8a67.jpg)]
NOTINIT:是一个UI的默认状态,也就是UI对象还未生成出来的状态
INIT:是UI对象生成出来时,第一个执行的状态,初始化完成会自动执行SHOW状态,类似unity的Awake只执行一次
SHOW:是当UI显示时执行的函数
HIDE:UI隐藏时执行的函数
------1)UIRoot会自动初始化所有系统,其中UILayerManager会自动生成层级父物体
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NoYUUBgp-1577879706136)(https://i.loli.net/2018/05/27/5b0aa70515420.jpg)]
用这种方式来给UI分层
------2)通过UIManager来控制UI的状态切换,在调用UIManager的show方法时,会自动调用UIlayerManger来设置UI的层级,并生成对象到对应的父物体下
------3)通过事件绑定的方式,若是对象上有动效脚本就会自动执行,没有就正常执行逻辑,动效部分代码是完全和UI逻辑分离的,就算删除动效部分的代码,完全不影响UI系统的执行
------4)所有的UI类要继承UIBase类,所有的UI类只处理UI的显示,每一个UI类都有对应的数据类和数据处理类
需要自定义UI的ID枚举,如
实际在框架内部,我是使用的string来存放ID,所以这里有两种方式:
------1.像图中这样,定义枚举来定义ID,在使用UIManager的show方法时,传进去即可
------2.定义一个类,在类中定义ID的静态只读字符串
-----(1)继承UIDataHandlerManager类,实现自定义数据处理器管理类,需要实现RegisterHandler方法,如:
需要在RegisterHandler方法内如图中的方式,初始化自定义的数据处理器类,并缓存到字典内
-----(2)继承AUIPathManager类,实现自定义路径管理类,需要实现InitPathDic方法,如:
图中value的字符串是路径,测试代码的预制体直接放到了Resources下,所以这里直接赋值的预制体名称
有两种应用方式:
-----------1.EUiId枚举直接定义成预制体名称,这样就不需要自己配置字符串了,但是这样预制体在Resources下必须都放到一个文件夹下,不能分类存放
-----------2.如图中这样,分别配置每个预制体的路径,可以在Resources下分类存放
-----(3)继承UIRoot类,实现自定义UI节点类,需要继承两个方法
-----------1.继承Start方法,如
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FQrPip1u-1577879706144)(https://i.loli.net/2018/05/27/5b0ab6162e29b.jpg)]
实现启动主界面的业务逻辑
------------2.继承InitUISystem方法,初始化需要自定义的系统,如
------1.需要根据UI的自身的需要选择继承基类,如主界面之类的这种全屏界面,一般是继承BasicUI类,像浮框这种界面,一般继承OverlayUI类,还有需要显示在这之上的UI就可以继承TopUI类
这些自定义类需要实现类的Init方法,并在Init方法中初始化调用InitUI方法来初始化UI数据,如:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eUaqPupQ-1577879706146)(https://i.loli.net/2018/05/27/5b0ab434d6c9c.jpg)]
需要赋值这个界面的ID还有自定义数据处理类的ID
------2.每个类需要定义它自己的UI数据类和数据处理器
每个数据处理器的NAME需要唯一,需要自己在创建类时定义,如
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gBNtO5Qa-1577879706147)(https://i.loli.net/2018/05/27/5b0ab4ce55460.jpg)]
数据的初始化是在InitData方法中,如
例子中就这样简单写,实际应该是从本地或者云端获取数据
继承AUIEffect类实现自定义UI动效类,这个类需要继承两个方法
------1.Enter方法,在UI显示的时候执行,所以在这个方法里定义UI显示时的动效
------2.Exit方法,在UI隐藏的时候执行,所以在这个方法里定义UI隐藏时的动效
使用时需要把预制体需要的UI动效类挂载到UI预制体上即可,或者也可以自己写一个类进行管理,动态挂载
以上便是本人自己花了几天时间,写的UI框架,比较简单,希望路过的大牛能花点点时间,给与指证。
GitHub地址:https://github.com/BlueMonk1107/BlueUIFrame
我会在我的公众号上推送新的博文,也可以帮大家解答问题
微信公众号 Andy and Unity 搜索名称或扫描二维码
希望我们能共同成长,共同进步