现在,网上流传着三种unity的UI框架:
1.
教程:http://blog.csdn.net/Fredomyan/article/details/46879203
github地址:https://github.com/tinyantstudio/UIFrameWork
2.
教程:http://www.cnblogs.com/neverdie/p/unity_ui_framework.html
github地址:https://github.com/MrNerverDie/Unity-UI-Framework
3.
教程:http://www.manew.com/thread-42929-1-1.html
github地址:https://github.com/chiuan/TTUIFramework
其中第一个是用ngui的,后面两个是用ugui的,所以这里只简单地介绍后面两种。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
第二种(简单上手,源码简洁易懂):
脚本:
UIType:提供view的路径和名字
BaseView:提供事件回调函数,OnEnter,OnExit,OnPause,OnResume
BaseContext:持有UIType的引用
AnimateView:继承BaseView,持有Animator的引用
UIManager:持有一个<UIType, GameObject>的字典,其中GameObject即view,可以获取、实例化和摧毁view
ContextManager:持有一个Stack,控制view之间的切换
对每一个view的预制体,提供一个对应的BaseView和BaseContext。对于view中的子view,例如登录界面的登录按钮,可以通过拖拽父view的脚本,响应点击事件
动画:
使用unity自带的动画系统,动画也是可以绑定事件的。一个普通的动画控制器基本就是这样了(状态机):
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
第三种(功能强大):
源码分析:
1.提供对view类型的枚举
public enum UIType { Normal, Fixed, PopUp, None, //独立的窗口 } public enum UIMode { DoNothing, HideOther, // 关闭其他界面 NeedBack, // 点击返回按钮关闭当前,不关闭其他界面(需要调整好层级关系) NoNeedBack, // 关闭TopBar,关闭其他界面,不加入backSequence队列 } public enum UICollider { None, // 显示该界面不包含碰撞背景 Normal, // 碰撞透明背景 WithBg, // 碰撞非透明背景 }
if (type == UIType.Fixed) { ui.transform.SetParent(TTUIRoot.Instance.fixedRoot); } else if (type == UIType.Normal) { ui.transform.SetParent(TTUIRoot.Instance.normalRoot); } else if (type == UIType.PopUp) { ui.transform.SetParent(TTUIRoot.Instance.popupRoot); }
UIMode中重要的就是HideOther和NeedBack,HideOther会隐藏其他的界面,但是不会隐藏当前的界面,而NeedBack隐藏当前的界面,不隐藏其他的界面。
UICollider由于源码并没有对这个进行处理,所以暂时不起作用。
2.TTUIPage的一些重要方法
打开页面:ShowPage<T>();
关闭页面:ClosePage(); 对当前页面调用Hide方法
3.TTUIPage的生命周期
virtual void Awake():实例化页面时会执行1次
//When Instance UI Ony Once. public virtual void Awake(GameObject go) { }
//Show UI Refresh Eachtime. public virtual void Refresh() { }
//Active this UI public virtual void Active() { this.gameObject.SetActive(true); isActived = true; }
//Only Deactive UI wont clear Data. public virtual void Hide() { this.gameObject.SetActive(false); isActived = false; //set this page's data null when hide. this.m_data = null; }
分析:
0.TTUIPage不一定指的是一个页面,一个屏幕也不一定只存在一个TTUIPage。凡是view的预制体,都可以为它编写一个TTUIPage。
1.对每一个view的预制体写一个TTUIPage(无需挂在预制体上,TTUIPage本身就持有一个GameObject的引用,打开页面后预制体就会存储在这个引用中),写一个构造函数(函数要包含预制体的路径),并按照需求重写TTUIPage生命周期的4种方法。
2.当调用ShowPage<T>();打开页面时,如果是初次打开(即实例化),会使用Resources.Load进行实例化,并依次调用Awake、Active、Refresh方法;如果不是初次打开,则依次调用Active、Refresh方法。
3.TTUIRoot和TTUIPage都无需挂上给物体。
后来发现这个框架还是很不完善,这里修正了一些问题,上传一下:
http://pan.baidu.com/s/1mgGT55A
(要确保场景存在Canvas)