[UnityUI]使用UI框架

现在,网上流传着三种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自带的动画系统,动画也是可以绑定事件的。一个普通的动画控制器基本就是这样了(状态机):

[UnityUI]使用UI框架


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

第三种(功能强大):

源码分析:

1.提供对view类型的枚举

  1. public enum UIType  
  2.    {  
  3.        Normal,  
  4.        Fixed,  
  5.        PopUp,  
  6.        None,      //独立的窗口  
  7.    }  
  8.   
  9.    public enum UIMode  
  10.    {  
  11.        DoNothing,  
  12.        HideOther,     // 关闭其他界面  
  13.        NeedBack,      // 点击返回按钮关闭当前,不关闭其他界面(需要调整好层级关系)  
  14.        NoNeedBack,    // 关闭TopBar,关闭其他界面,不加入backSequence队列  
  15.    }  
  16.   
  17.    public enum UICollider  
  18.    {  
  19.        None,      // 显示该界面不包含碰撞背景  
  20.        Normal,    // 碰撞透明背景  
  21.        WithBg,    // 碰撞非透明背景  
  22.    }  

UIType的实际作用是对view进行分类(源码中出现PopUp效果是使用了动画文件):
  1. if (type == UIType.Fixed)  
  2.             {  
  3.                 ui.transform.SetParent(TTUIRoot.Instance.fixedRoot);  
  4.             }  
  5.             else if (type == UIType.Normal)  
  6.             {  
  7.                 ui.transform.SetParent(TTUIRoot.Instance.normalRoot);  
  8.             }  
  9.             else if (type == UIType.PopUp)  
  10.             {  
  11.                 ui.transform.SetParent(TTUIRoot.Instance.popupRoot);  
  12.             }  

[UnityUI]使用UI框架


UIMode中重要的就是HideOther和NeedBack,HideOther会隐藏其他的界面,但是不会隐藏当前的界面,而NeedBack隐藏当前的界面,不隐藏其他的界面。

UICollider由于源码并没有对这个进行处理,所以暂时不起作用。


2.TTUIPage的一些重要方法

打开页面:ShowPage<T>();

关闭页面:ClosePage();   对当前页面调用Hide方法


3.TTUIPage的生命周期

virtual void Awake():实例化页面时会执行1次

  1. //When Instance UI Ony Once.  
  2.         public virtual void Awake(GameObject go) { }  


virtual void Refresh():当调用ShowPage时就会执行
  1. //Show UI Refresh Eachtime.  
  2.         public virtual void Refresh() { }  


virtual void Active():当调用ShowPage时就会执行,执行顺序在Refresh前
  1. //Active this UI  
  2.         public virtual void Active()  
  3.         {  
  4.             this.gameObject.SetActive(true);  
  5.             isActived = true;  
  6.         }  


virtual void Hide():当调用ClosePage时就会执行
  1. //Only Deactive UI wont clear Data.  
  2.         public virtual void Hide()  
  3.         {  
  4.             this.gameObject.SetActive(false);  
  5.             isActived = false;  
  6.             //set this page's data null when hide.  
  7.             this.m_data = null;  
  8.         }  


分析:

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)