• Unity3D 搭建优雅的UI框架


    这篇文章是博主早年写的,当初年少不懂事,竟然取这个标题,那时候的我完全没能力写好UI框架。

    现在楼主已经转行去当厨师了,各位看官非常抱歉了,浪费你们时间点进来。

    为什么要使用UI框架?直接使用NGUI或UGUI一拖一拉直接搭载出界面不就行了?

    我相信很多小白,包括我在刚学习Unity3D UI的时候都这样想过。

    我的第一款款Unity2D游戏《山地赛车》,使用的就是NGUI搭载界面。

    弱联网手游一般都没什么复杂的界面,我也是很轻松花一天就把界面搭载好了,看起来好挺好看的,还花了不少时间做动态效果。

    界面搭载好后,开始开发游戏内容,这下问题开始来了:

    1.如何实现界面间的沟通?例如点击返回按钮,返回上一个界面,点击背包系统,弹出背包。

    2.如何实现界面与游戏数据的沟通?例如点击排行榜,能列出最新的排名,点击购买车辆,能扣钱并买入新的车辆。

    一开始我的做法(我相信也是大部分新手最喜欢的做法)就是为每个要触发功能的UI添加一个脚本,然后添加一个public gameobject,

    然后拖入触发UI时要控制的object。在脚本的OnClick等函数里实现逻辑功能。

    这样做是挺容易。很快我也花了半天时间拖来拖去,把UI要关联的各种物件绑定好。

    但是接下来的各种问题让我非常头疼:

    1.随着游戏系统的复杂,UI控件越来越多,各个UI直接的通讯,以及UI与GameObject之间的通讯形成一张复杂的蜘蛛网,

    拖着拖着,有时候我都忘了哪个对象跟哪个对象关联了。如果是别人要看我的程序,我估计他找半天都找不到UI逻辑的入口。

    2.耦合性非常严重,如果要改变需求,更改某个UI或者更改某个游戏对象,那么你需要再手动全部与该对象关联的物件重新更改一次。

    3.作为强迫症的我,最受不了程序代码的混乱。这种组织方式十分“不优雅”,看着很乱。

    鉴于以上各种情况,我开始寻找一种新的,科学的,高效的UI管理方式,

    最开始想到的就是大名鼎鼎的MVC模式,我想过用它来管理我的UI,不过由于我对MVC模式不是很熟悉,尝试了下,效果并不是很好。

    在网上搜到几个不错的UI框架,都写得很不错,各位可以参考参考:

    1.Unity-UI-Framework的设计与实现 By:王选易 Github

    2.简单、强大的TTUIFramework By:chiuan 游戏蛮牛 (这位的设计思路是参考上面那位作者的)

    3.【设计和开发一套自动化UI框架】 By:NPC燕 游戏蛮牛

    他们的设计思路都很清晰,做出来的效果也都很强大,都是些游戏界的大牛,但是都有点复杂。

    作为一名菜鸟,我当然要设计出只有菜鸟能看得懂的东西啦。

    好了,废话不多说,以下是我设计的两个主要方向:

    1.设计一套用于管理UI的框架,各个UI的生成,销毁,切换,都是通过这个Manager单例来实现。各个UI间不直接联系。

    2.所有UI都基于一个UIBase基类,每个UI的预设对应一个UIBase子类脚本,UI的基本逻辑在该类中实现,例如:_MenuView.prefab 对应 _MenuView.cs

    3.重新实现Unity3D的消息通讯,原有SendMessage效率较低,利用订阅-发布(即观察者模式)重新设计一套通讯中心,所有UI间的通讯,

    以及UI和游戏层的通讯,皆间接通过MessageCenter来管理。实现解耦。

    4.以栈发方式管理UI,每次打开一个新的UI,都将它堆入栈,关闭时出栈。这个栈是一个特殊的栈,例如它可以实现,某个不在栈顶的UI,可以“TOP”到栈顶。

    未完待续。。。

  • 相关阅读:
    使用git pull文件时和本地文件冲突怎么办?
    Git回滚代码到某个commit
    PHP如何在页面中原样输出HTML代码
    git 创建本地分支、提交到远程分支
    php mysqli扩展之预处理
    htmlspecialchars() 函数过滤XSS的问题
    PHP json_encode里面经常用到的 JSON_UNESCAPED_UNICODE和JSON_UNESCAPED_SLASHES
    javascript学习笔记——Array
    javascript学习笔记——Object
    javascript的底层实现学习总结
  • 原文地址:https://www.cnblogs.com/jeason1997/p/4854606.html
Copyright © 2020-2023  润新知