[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张图片


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

第三种(功能强大):

源码分析:

1.提供对view类型的枚举

 public enum UIType
    {
        Normal,
        Fixed,
        PopUp,
        None,      //独立的窗口
    }

    public enum UIMode
    {
        DoNothing,
        HideOther,     // 关闭其他界面
        NeedBack,      // 点击返回按钮关闭当前,不关闭其他界面(需要调整好层级关系)
        NoNeedBack,    // 关闭TopBar,关闭其他界面,不加入backSequence队列
    }

    public enum UICollider
    {
        None,      // 显示该界面不包含碰撞背景
        Normal,    // 碰撞透明背景
        WithBg,    // 碰撞非透明背景
    }

UIType的实际作用是对view进行分类(源码中出现PopUp效果是使用了动画文件):

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);
            }

[UnityUI]使用UI框架_第2张图片


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) { }


virtual void Refresh():当调用ShowPage时就会执行

//Show UI Refresh Eachtime.
        public virtual void Refresh() { }


virtual void Active():当调用ShowPage时就会执行,执行顺序在Refresh前

//Active this UI
        public virtual void Active()
        {
            this.gameObject.SetActive(true);
            isActived = true;
        }


virtual void Hide():当调用ClosePage时就会执行

//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)

你可能感兴趣的:(unity,UI框架)