前言

UI一般是入门程序员首先接触到的内容,除了业务的开发,还有很多值得研究的地方。

例如共用的组件设计,渲染的效果(如各种文字效果,在UI上显示模型和特效),性能上的优化(如虚拟的滚动列表,UI的动静分离,图集等),还有UI的管理。

这篇文章就来实现一个简单的UI管理器,主要的类就是管理类和窗口类。

框架功能

  • 打开单例UI
  • 加载
  • 层级管理
  • 显隐管理
  • UI生命周期管理(初始化,打开后,轮询更新,关闭后,销毁)

类图

管理类

管理类是外部调用的入口,打开和关闭窗口,管理UI的层级以及显示隐藏状态。

打开窗口以后,实例化一个对应的类,调用其加载方法

窗口加载完成或者窗口关闭以后回调到管理类中,遍历窗口列表重新设置其深度值,根据是否有全屏窗口,把比全屏窗口以下的窗口都设置为隐藏。

窗口类

窗口类定义了窗口的特性,如是否全屏,所在层级等,按项目需求添加特性。

窗口类中需要复写其生命周期函数,在合适的时机做合适的事情。

一般在初始化时,初始化组件,打开后,显示内容,关闭或者销毁时,做清理。

另外一个值得注意的时,当UI被隐藏的时候,不是使用SetActive(false),因为这样会引起UI的网格重构,可以把UI移动到一个渲染不到的layer下,或者直接移出相机以外。

打开UI

打开UI时的流程如下

功能拓展

这里只是实现了基础的功能,实际项目中还有许多功能可能用得上,但只需在这基础上拓展即可。

  • 支持面板中的嵌套Prefab:可以在UIWindow给再写一个父类。
  • 打开关闭动画支持:涉及到生命周期的调用实际,需要等待动画完成以后再调用打开关闭方法。
  • 增加缓存:关闭UI时不立即销毁,而且先缓存起来,真正销毁的时机,可以是达到一定的缓存值,或者是存活时机,按实际需要写。
  • 增加通用的遮罩管理。
  • 增加多实例的窗口打开,一个窗口可以多开。

总结

UI管理器基本的功能,以及拓展的功能介绍完了。

实现这些功能不难,但是想要优雅把这些功能都组织起来,让调用简单,代码阅读清晰,也是一门艺术。

参考

UniFramework/UniFramework/UniWindow at main · gmhevinci/UniFramework