基于UGUI的简易UI框架实现

在Unity项目中,我们可以通过添加scrip和绑定按钮的方式,方便的实现UI的加载,跳转,关闭等功能。但是如果没有统一的管理,随着页面的增加,跳转的逻辑会复杂化,代码间的耦合性也会增加。为了方便管理和扩展,可以在UI系统中引入框架统一管理。

我们先对框架做一个简单的规划:

UIRoot,UIManager和BaseClass是框架的核心。UIRoot实现了引导框架,UIManager管理和保存所有页面的信息和生命周期,BaseClass则定义了页面的基本行为和特征,由于是组件,所有应该继承自MonoBehaviour。实际的UI页面都应该继承自BaseClass。用stack保存页面,可以方便的让页面按打开时的层次顺序来回退。配置文件则允许用户自行修改,以制作自己需要的Prefab。

实现

1.UIManager的实现

为了确保管理者的唯一性,UIManager应当实现一个单例模式:

对页面生命周期的管理,应当和出栈和入栈放在一起,所有要实现对应的两个方法:

UIManager核心的功能,页面的实例化、获取以及保存应当实现:

那么,到这里,框架的核心功能已经完成了。我们可以看到,它现在可以从预制物进行实例化,然后可以用字典保存页面的实例,也可以对页面进行出栈入栈,同时执行页面的生命周期函数。

2.BaseClass

BaceClass应当定义一些虚方法,供子类重写,如果有必要,也可以定义成一个纯抽象类。对于需要有默认行为的情况,应该在BaceClass中实现。这里规定了常见的一些方法和状态:初始化,页面切入,页面暂停,页面恢复,已经页面切出。

3.UIRoot

UIRoot应当是GUI或者是整个游戏的引导者。在这里,最初的UI随着UIRoot的实例化开始加载。如果有更加复杂的引导内容,也应该写在这个文件中。

4.配置

用json保存prefab对应的路径,框架直接解析这个文件来获取prefab。

5.实际的页面实现

其实页面实现的过程就是制作prefab的过程。在你添加好各种组件后,最后为它们加上一个继承自BaseClass的script。在这个脚本中实现页面各个状态时候的具体行为:

6.总结

到此,一个简单的框架就实现了。看起来不是很复杂,但是实现的过程其实坑很多。第一,一定要注意unity的生命周期函数,比如awake在实例化后立即执行start的调用则晚于实例化后立即调用自定义方法。如果在start中初始化,那么自定义方法可能就会出现空引用的问题。第二,就是注意页面的同一性。在调用页面上方法的时候,如果前后使用了不同的实例,也容易引起不容易排查的问题。

發表留言

使用 WordPress.com 設計專業網站
立即開始使用