Unity 客户端框架(六):UI框架

http://blog.csdn.net/lovethrain/article/details/52134167


引自百度:编写UI框架意义

  • 打开,关闭,层级,页面跳转等管理问题集中化,将外部切换等逻辑交给UIManager处理
  • 功能逻辑分散化,每个页面维护自身逻辑,依托于框架便于多人协同开发,不用关心跳转和显示关闭细节
  • 通用性框架能够做到简单的代码复用和"项目经验"沉淀


这个UI框架不区别于NGUI与UGUI,通用

[csharp]  view plain  copy
  1. public abstract class BaseUI : MonoBehaviour  
  2.     {  
  3.         #region 缓存  
  4.   
  5.         private Transform _CachedTransform;  
  6.         public Transform cachedTransform  
  7.         {  
  8.             get  
  9.             {  
  10.                 if(!_CachedTransform)  
  11.                 {  
  12.                     _CachedTransform = this.transform;  
  13.                 }  
  14.                 return _CachedTransform;  
  15.             }  
  16.         }  
  17.   
  18.         private GameObject _CachedGameobject;  
  19.         public GameObject cachedGameobject  
  20.         {  
  21.             get  
  22.             {  
  23.                 if (!_CachedGameobject)  
  24.                 {  
  25.                     _CachedGameobject = this.gameObject;  
  26.                 }  
  27.                 return _CachedGameobject;  
  28.             }  
  29.         }  
  30.  
  31.         #endregion  
  32.  
  33.         #region Type && State  
  34.   
  35.         protected EnumObjectState state = EnumObjectState.None;  
  36.   
  37.         public event StateChangedEvent StateChanged;  
  38.   
  39.         public EnumObjectState State  
  40.         {  
  41.             get  
  42.             {  
  43.                 return this.state;  
  44.             }  
  45.             set  
  46.             {  
  47.                 if(value != state)  
  48.                 {  
  49.                     EnumObjectState oldState = value;  
  50.                     state = value;  
  51.                     if (null != StateChanged)  
  52.                         StateChanged(this, state, oldState);  
  53.                 }  
  54.             }  
  55.         }  
  56.   
  57.         public abstract EnumUIType GetUIType();  
  58.  
  59.         #endregion  
  60.   
  61.         public virtual void SetDepthToTop() { }  
  62.   
  63.         void Start()  
  64.         {  
  65.             OnStart();  
  66.         }  
  67.   
  68.         void Awake()  
  69.         {  
  70.             this.State = EnumObjectState.Initial;  
  71.             OnAwake();  
  72.         }  
  73.   
  74.         void Update()  
  75.         {  
  76.             if (EnumObjectState.Ready == State)  
  77.                 OnUpdate(Time.deltaTime);  
  78.         }  
  79.   
  80.         public void Release()  
  81.         {  
  82.             this.State = EnumObjectState.Closing;  
  83.             //GameObject.Destroy(cachedGameobject);  
  84.             ObjPool.Instance.OnReturnObj(cachedGameobject);  
  85.             OnRelease();  
  86.         }  
  87.   
  88.         protected virtual void OnStart()  
  89.         {  
  90.   
  91.         }  
  92.   
  93.         protected virtual void OnAwake()  
  94.         {  
  95.             this.State = EnumObjectState.Loading;  
  96.             this.OnPlayOpenUIAudio();  
  97.         }  
  98.   
  99.         protected virtual void OnUpdate(float dletaTime)  
  100.         {  
  101.   
  102.         }  
  103.   
  104.         protected virtual void OnRelease()  
  105.         {  
  106.             this.OnPlayCloseUIAudio();  
  107.         }  
  108.   
  109.         protected virtual void OnPlayOpenUIAudio()  
  110.         {  
  111.   
  112.         }  
  113.   
  114.         protected virtual void OnPlayCloseUIAudio()  
  115.         {  
  116.   
  117.         }  
  118.   
  119.         protected virtual void SetUI(params object[] uiParams)  
  120.         {  
  121.             this.State = EnumObjectState.Loading;  
  122.         }  
  123.   
  124.         protected virtual void OnLoadData()  
  125.         {  
  126.   
  127.         }  
  128.   
  129.         public void SetUIWhenOpening(params object[] uiParams)  
  130.         {  
  131.             SetUI(uiParams);  
  132.             CoroutineInstance.Instance.StartCoroutine(AsyncOnLoadData());  
  133.         }  
  134.   
  135.         private IEnumerator AsyncOnLoadData()  
  136.         {  
  137.             yield return new WaitForSeconds(0);  
  138.             if(this.State == EnumObjectState.Loading)  
  139.             {  
  140.                 this.OnLoadData();  
  141.                 this.State = EnumObjectState.Ready;  
  142.             }  
  143.         }  
  144.   
  145.   
  146.     }  

[csharp]  view plain  copy
  1. public class UIManager : Singleton<UIManager>  
  2.    {  
  3.  
  4.        #region UIInfoData  
  5.   
  6.        class UIInfoData  
  7.        {  
  8.            public EnumUIType UIType { getprivate set; }  
  9.   
  10.            public Type ScriptType { getprivate set; }  
  11.   
  12.            public string Path { getprivate set; }  
  13.   
  14.            public object[] UIParams { getprivate set; }  
  15.   
  16.            public UIInfoData(EnumUIType _uiType, string _path, params object[] _uiParams)  
  17.            {  
  18.                this.UIType = _uiType;  
  19.                this.Path = _path;  
  20.                this.UIParams = _uiParams;  
  21.                this.ScriptType = UIPathDefines.GetUIScriptByType(this.UIType);  
  22.            }  
  23.        }  
  24.  
  25.        #endregion  
  26.   
  27.        private Dictionary<EnumUIType, GameObject> dicOpenedUIs = null;  
  28.   
  29.        private Stack<UIInfoData> stackOpeningUIs = null;  
  30.   
  31.        public override void Init()  
  32.        {  
  33.            dicOpenedUIs = new Dictionary<EnumUIType, GameObject>();  
  34.            stackOpeningUIs = new Stack<UIInfoData>();  
  35.        }  
  36.  
  37.        #region Get  
  38.          
  39.        public T GetUI<T>(EnumUIType _type) where T : BaseUI  
  40.        {  
  41.            GameObject _retObj = GetUIObject(_type);  
  42.            if (_retObj != null)  
  43.                return _retObj.GetComponent<T>();  
  44.            return null;  
  45.        }  
  46.          
  47.        public GameObject GetUIObject(EnumUIType _type)  
  48.        {  
  49.            GameObject _retObj = null;  
  50.            if(!dicOpenedUIs.TryGetValue(_type,out _retObj))  
  51.                throw new Exception("dicOpenedUIs TryGetValue Failure! _uiType :" + _type.ToString());  
  52.            return _retObj;  
  53.        }  
  54.  
  55.        #endregion  
  56.  
  57.        #region Preload  
  58.   
  59.        public void PreloadUI(EnumUIType[] _uiTypes)  
  60.        {  
  61.            for (int i = 0; i < _uiTypes.Length; i++)  
  62.            {  
  63.                PreloadUI(_uiTypes[i]);  
  64.            }  
  65.        }  
  66.   
  67.   
  68.        public void PreloadUI(EnumUIType _uiType)  
  69.        {  
  70.            string path = UIPathDefines.UI_PREFAB + _uiType.ToString();  
  71.            ResManager.Instance.Load(path);  
  72.              
  73.        }  
  74.  
  75.        #endregion  
  76.  
  77.        #region Open  
  78.         
  79.        public void OpenUI(EnumUIType[] uiTypes)  
  80.        {  
  81.            OpenUI(false, uiTypes, null);  
  82.        }  
  83.   
  84.         
  85.        public void OpenUI(EnumUIType uiType, params object[] uiObjParams)  
  86.        {  
  87.            EnumUIType[] uiTypes = new EnumUIType[1];  
  88.            uiTypes[0] = uiType;  
  89.            OpenUI(false, uiTypes, uiObjParams);  
  90.        }  
  91.   
  92.        public void OpenUICloseOthers(EnumUIType[] uiTypes)  
  93.        {  
  94.            OpenUI(true, uiTypes, null);  
  95.        }  
  96.   
  97.   
  98.        public void OpenUICloseOthers(EnumUIType uiType, params object[] uiObjParams)  
  99.        {  
  100.            EnumUIType[] uiTypes = new EnumUIType[1];  
  101.            uiTypes[0] = uiType;  
  102.            OpenUI(true, uiTypes, uiObjParams);  
  103.        }  
  104.   
  105.        
  106.        private void OpenUI(bool _isCloseOthers, EnumUIType[] _uiTypes, params object[] _uiParams)  
  107.        {  
  108.            // Close Others UI.  
  109.            if (_isCloseOthers)  
  110.            {  
  111.                CloseUIAll();  
  112.            }  
  113.   
  114.            // push _uiTypes in Stack.  
  115.            for (int i = 0; i < _uiTypes.Length; i++)  
  116.            {  
  117.                EnumUIType _uiType = _uiTypes[i];  
  118.                if (!dicOpenedUIs.ContainsKey(_uiType))  
  119.                {  
  120.                    string _path = UIPathDefines.UI_PREFAB + _uiType.ToString();  
  121.                    stackOpeningUIs.Push(new UIInfoData(_uiType, _path, _uiParams));  
  122.                }  
  123.            }  
  124.   
  125.            // Open UI.  
  126.            if (stackOpeningUIs.Count > 0)  
  127.            {  
  128.                  CoroutineInstance.Instance.StartCoroutine(AsyncLoadData());  
  129.            }  
  130.        }  
  131.   
  132.   
  133.        private IEnumerator<int> AsyncLoadData()  
  134.        {  
  135.            UIInfoData _uiInfoData = null;  
  136.            GameObject _prefabObj = null;  
  137.            //GameObject _uiObject = null;  
  138.   
  139.            if (stackOpeningUIs != null && stackOpeningUIs.Count > 0)  
  140.            {  
  141.                do  
  142.                {  
  143.                    _uiInfoData = stackOpeningUIs.Pop();  
  144.   
  145.                    //_prefabObj = ResManager.Instance.Load(_uiInfoData.Path);  
  146.                    string[] str = _uiInfoData.Path.Split('/');  
  147.                    _prefabObj = ObjPool.Instance.OnGetObj(str[1], str[0]);  
  148.                    _prefabObj.transform.SetParent(null);  
  149.   
  150.   
  151.                    if (_prefabObj != null)  
  152.                    {  
  153.                        //_uiObject = NGUITools.AddChild(Game.Instance.mainUICamera.gameObject, _prefabObj as GameObject);  
  154.                        //_uiObject = MonoBehaviour.Instantiate(_prefabObj) as GameObject;  
  155.                        BaseUI _baseUI = _prefabObj.GetComponent<BaseUI>();  
  156.                        if (null == _baseUI)  
  157.                        {  
  158.                            _baseUI = _prefabObj.AddComponent(_uiInfoData.ScriptType) as BaseUI;  
  159.                        }  
  160.                        if (null != _baseUI)  
  161.                        {  
  162.                            _baseUI.SetUIWhenOpening(_uiInfoData.UIParams);  
  163.                        }  
  164.                        dicOpenedUIs.Add(_uiInfoData.UIType, _prefabObj);  
  165.                    }  
  166.   
  167.                } while (stackOpeningUIs.Count > 0);  
  168.            }  
  169.            yield return 0;  
  170.        }  
  171.  
  172.        #endregion  
  173.  
  174.        #region Close  
  175.   
  176.        public void CloseUI(EnumUIType _uiType)  
  177.        {  
  178.            GameObject _uiObj = null;  
  179.            if (!dicOpenedUIs.TryGetValue(_uiType, out _uiObj))  
  180.            {  
  181.                Debug.Log("dicOpenedUIs TryGetValue Failure! _uiType :" + _uiType.ToString());  
  182.                return;  
  183.            }  
  184.            CloseUI(_uiType, _uiObj);  
  185.        }  
  186.   
  187.        public void CloseUI(EnumUIType[] _uiTypes)  
  188.        {  
  189.            for (int i = 0; i < _uiTypes.Length; i++)  
  190.            {  
  191.                CloseUI(_uiTypes[i]);  
  192.            }  
  193.        }  
  194.   
  195.   
  196.        public void CloseUIAll()  
  197.        {  
  198.            List<EnumUIType> _keyList = new List<EnumUIType>(dicOpenedUIs.Keys);  
  199.            foreach (EnumUIType _uiType in _keyList)  
  200.            {  
  201.                GameObject _uiObj = dicOpenedUIs[_uiType];  
  202.                CloseUI(_uiType, _uiObj);  
  203.            }  
  204.            dicOpenedUIs.Clear();  
  205.        }  
  206.   
  207.        private void CloseUI(EnumUIType _uiType, GameObject _uiObj)  
  208.        {  
  209.            if (_uiObj == null)  
  210.            {  
  211.                dicOpenedUIs.Remove(_uiType);  
  212.            }  
  213.            else  
  214.            {  
  215.                BaseUI _baseUI = _uiObj.GetComponent<BaseUI>();  
  216.                if (_baseUI != null)  
  217.                {  
  218.                    _baseUI.StateChanged += CloseUIHandler;  
  219.                    _baseUI.Release();  
  220.                }  
  221.                else  
  222.                {  
  223.                    GameObject.Destroy(_uiObj);  
  224.                    dicOpenedUIs.Remove(_uiType);  
  225.                }  
  226.            }  
  227.        }  
  228.   
  229.   
  230.        private void CloseUIHandler(object _sender, EnumObjectState _newState, EnumObjectState _oldState)  
  231.        {  
  232.            if (_newState == EnumObjectState.Closing)  
  233.            {  
  234.                BaseUI _baseUI = _sender as BaseUI;  
  235.                dicOpenedUIs.Remove(_baseUI.GetUIType());  
  236.                _baseUI.StateChanged -= CloseUIHandler;  
  237.            }  
  238.        }  
  239.        #endregion  
  240.   
  241.    }  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值