• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

游戏开发

常州手游开发-U3D客户端框架:UI框架

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2019/0313/411.html

Unity 客户端框架:UI框架

 

 

 

翻开,关闭,层级,页面跳转等管理问题集中化,将外部切换等逻辑交给UIManager处置

功用逻辑分散化,每个页面维护本身逻辑,依托于框架便于多人协同开发,不用关怀跳转和显现关闭细节

通用性框架可以做到简单的代码复用和"项目经历"沉淀

 

 

这个UI框架不区别于NGUIUGUI,通用

public abstract class BaseUI : MonoBehaviour

    {

        #region 缓存

 

        private Transform _CachedTransform;

        public Transform cachedTransform

        {

            get

            {

                if(!_CachedTransform)

                {

                    _CachedTransform = this.transform;

                }

                return _CachedTransform;

            }

        }

 

        private GameObject _CachedGameobject;

        public GameObject cachedGameobject

        {

            get

            {

                if (!_CachedGameobject)

                {

                    _CachedGameobject = this.gameObject;

                }

                return _CachedGameobject;

            }

        }

 

        #endregion

 

        #region Type && State

 

        protected EnumObjectState state = EnumObjectState.None;

 

        public event StateChangedEvent StateChanged;

 

        public EnumObjectState State

        {

            get

            {

                return this.state;

            }

            set

            {

                if(value != state)

                {

                    EnumObjectState oldState = value;

                    state = value;

                    if (null != StateChanged)

                        StateChanged(this, state, oldState);

                }

            }

        }

 

        public abstract EnumUIType GetUIType();

 

        #endregion

 

        public virtual void SetDepthToTop() { }

 

        void Start()

        {

            OnStart();

        }

 

        void Awake()

        {

            this.State = EnumObjectState.Initial;

            OnAwake();

        }

 

        void Update()

        {

            if (EnumObjectState.Ready == State)

                OnUpdate(Time.deltaTime);

        }

 

        public void Release()

        {

            this.State = EnumObjectState.Closing;

            //GameObject.Destroy(cachedGameobject);

            ObjPool.Instance.OnReturnObj(cachedGameobject);

            OnRelease();

        }

 

        protected virtual void OnStart()

        {

 

        }

 

        protected virtual void OnAwake()

        {

            this.State = EnumObjectState.Loading;

            this.OnPlayOpenUIAudio();

        }

 

        protected virtual void OnUpdate(float dletaTime)

        {

 

        }

 

        protected virtual void OnRelease()

        {

            this.OnPlayCloseUIAudio();

        }

 

        protected virtual void OnPlayOpenUIAudio()

        {

 

        }

 

        protected virtual void OnPlayCloseUIAudio()

        {

 

        }

 

        protected virtual void SetUI(params object[] uiParams)

        {

            this.State = EnumObjectState.Loading;

        }

 

        protected virtual void OnLoadData()

        {

 

        }

 

        public void SetUIWhenOpening(params object[] uiParams)

        {

            SetUI(uiParams);

            CoroutineInstance.Instance.StartCoroutine(AsyncOnLoadData());

        }

 

        private IEnumerator AsyncOnLoadData()

        {

            yield return new WaitForSeconds(0);

            if(this.State == EnumObjectState.Loading)

            {

                this.OnLoadData();

                this.State = EnumObjectState.Ready;

            }

        }

 

 

    }

 public class UIManager : Singleton

    {

 

        #region 常州网站开发建设UIInfoData

 

        class UIInfoData

        {

            public EnumUIType UIType { get; private set; }

 

            public Type ScriptType { get; private set; }

 

            public string Path { get; private set; }

 

            public object[] UIParams { get; private set; }

 

            public UIInfoData(EnumUIType _uiType, string _path, params object[] _uiParams)

            {

                this.UIType = _uiType;

                this.Path = _path;

                this.UIParams = _uiParams;

                this.ScriptType = UIPathDefines.GetUIScriptByType(this.UIType);

            }

        }

 

        #endregion

 

        private Dictionary<EnumUIType, GameObject> dicOpenedUIs = null;

 

        private Stack stackOpeningUIs = null;

 

        public override void Init()

        {

            dicOpenedUIs = new Dictionary<EnumUIType, GameObject>();

            stackOpeningUIs = new Stack();

        }

 

        #region Get

 

        public T GetUI(EnumUIType _type) where T : BaseUI

        {

            GameObject _retObj = GetUIObject(_type);

            if (_retObj != null)

                return _retObj.GetComponent();

            return null;

        }

 

        public GameObject GetUIObject(EnumUIType _type)

        {

            GameObject _retObj = null;

            if(!dicOpenedUIs.TryGetValue(_type,out _retObj))

                throw new Exception("dicOpenedUIs TryGetValue Failure! _uiType :" + _type.ToString());

            return _retObj;

        }

 

        #endregion

 

        #region Preload

 

        public void PreloadUI(EnumUIType[] _uiTypes)

        {

            for (int i = 0; i < _uiTypes.Length; i++)

            {

                PreloadUI(_uiTypes[i]);

            }

        }

 

 

        public void PreloadUI(EnumUIType _uiType)

        {

            string path = UIPathDefines.UI_PREFAB + _uiType.ToString();

            ResManager.Instance.Load(path);

 

        }

 

        #endregion

 

        #region Open

 

        public void OpenUI(EnumUIType[] uiTypes)

        {

            OpenUI(false, uiTypes, null);

        }

 

 

        public void OpenUI(EnumUIType uiType, params object[] uiObjParams)

        {

            EnumUIType[] uiTypes = new EnumUIType[1];

            uiTypes[0] = uiType;

            OpenUI(false, uiTypes, uiObjParams);

        }

 

        public void OpenUICloseOthers(EnumUIType[] uiTypes)

        {

            OpenUI(true, uiTypes, null);

        }

 

 

        public void OpenUICloseOthers(EnumUIType uiType, params object[] uiObjParams)

        {

            EnumUIType[] uiTypes = new EnumUIType[1];

            uiTypes[0] = uiType;

            OpenUI(true, uiTypes, uiObjParams);

        }

 

 

        private void OpenUI(bool _isCloseOthers, EnumUIType[] _uiTypes, params object[] _uiParams)

        {

            // Close Others UI.

            if (_isCloseOthers)

            {

                CloseUIAll();

            }

 

            // push 游戏开发运营 _uiTypes in Stack.

            for (int i = 0; i < _uiTypes.Length; i++)

            {

                EnumUIType _uiType = _uiTypes[i];

                if (!dicOpenedUIs.ContainsKey(_uiType))

                {

                    string _path = UIPathDefines.UI_PREFAB + _uiType.ToString();

                    stackOpeningUIs.Push(new UIInfoData(_uiType, _path, _uiParams));

                }

            }

 

            // Open UI.

            if (stackOpeningUIs.Count > 0)

            {

                  CoroutineInstance.Instance.StartCoroutine(AsyncLoadData());

            }

        }

 

 

        private IEnumerator AsyncLoadData()

        {

            UIInfoData _uiInfoData = null;

            GameObject _prefabObj = null;

            //GameObject _uiObject = null;

 

            if (stackOpeningUIs != null && stackOpeningUIs.Count > 0)

            {

                do

                {

                    _uiInfoData = stackOpeningUIs.Pop();

 

                    //_prefabObj = ResManager.Instance.Load(_uiInfoData.Path);

                    string[] str = _uiInfoData.Path.Split('/');

                    _prefabObj = ObjPool.Instance.OnGetObj(str[1], str[0]);

                    _prefabObj.transform.SetParent(null);

 

 

                    if (_prefabObj != null)

                    {

                        //_uiObject = NGUITools.AddChild(Game.Instance.mainUICamera.gameObject, _prefabObj as GameObject);

                        //_uiObject = MonoBehaviour.Instantiate(_prefabObj) as GameObject;

                        BaseUI _baseUI = _prefabObj.GetComponent();

                        if (null == _baseUI)

                        {

                            _baseUI = _prefabObj.AddComponent(_uiInfoData.ScriptType) as BaseUI;

                        }

                        if (null != _baseUI)

                        {

                            _baseUI.SetUIWhenOpening(_uiInfoData.UIParams);

                        }

                        dicOpenedUIs.Add(_uiInfoData.UIType, _prefabObj);

                    }

 

                } while (stackOpeningUIs.Count > 0);

            }

            yield return 0;

        }

 

        #endregion

 

        #region Close

 

        public void CloseUI(EnumUIType _uiType)

        {

            GameObject _uiObj = null;

            if (!dicOpenedUIs.TryGetValue(_uiType, out _uiObj))

            {

                Debug.Log("dicOpenedUIs TryGetValue Failure! _uiType :" + _uiType.ToString());

                return;

            }

            CloseUI(_uiType, _uiObj);

        }

 

        public void CloseUI(EnumUIType[] _uiTypes)

        {

            for (int i = 0; i < _uiTypes.Length; i++)

            {

                CloseUI(_uiTypes[i]);

            }

        }

 

 

        public void CloseUIAll()

        {

            List _keyList = new List(dicOpenedUIs.Keys);

            foreach (EnumUIType _uiType in _keyList)

            {

                GameObject _uiObj = dicOpenedUIs[_uiType];

                CloseUI(_uiType, _uiObj);

            }

            dicOpenedUIs.Clear();

        }

 

        private void CloseUI(EnumUIType _uiType, GameObject _uiObj)

        {

            if (_uiObj == null)

            {

                dicOpenedUIs.Remove(_uiType);

            }

            else

            {

                BaseUI _baseUI = _uiObj.GetComponent();

                if (_baseUI != null)

                {

                    _baseUI.StateChanged += CloseUIHandler;

                    _baseUI.Release();

                }

                else

                {

                    GameObject.Destroy(_uiObj);

                    dicOpenedUIs.Remove(_uiType);

                }

            }

        }

 

 

        private void CloseUIHandler(object _sender, EnumObjectState _newState, EnumObjectState _oldState)

        {

            if (_newState == EnumObjectState.Closing)

            {

                BaseUI _baseUI = _sender as BaseUI;

                dicOpenedUIs.Remove(_baseUI.GetUIType());

                _baseUI.StateChanged -= CloseUIHandler;

            }

        }

        #endregion

 

    }

namespace TownsFrameWork

{

 

        #region 拜托常州游戏开发培训

        public delegate void StateChangedEvent(object sender,EnumObjectState n,EnumObjectState o);

        #endregion

 

        #region 枚举

        public enum EnumObjectState

        {

            None,

            Initial,

            Loading,

            Ready,

            Disabled,

            Closing

        }

 

        public enum EnumUIType : int

        {

            None = -1,

            StartUI,

            WarUI

        }

 

        #endregion

 

        #region 静态类

 

        public static class UIPathDefines

        {

            ///

 

            /// UI预设

            ///

            public const string UI_PREFAB = "UIPrefab/";

            ///

 

            /// UI小控件

            ///

            public const string UI_CONTROLS_PREFAB = "UIPrefab/Control/";

            ///

 

            /// UI子页面

            ///

            public const string UI_SUBUI_PREFAB = "UIPrefab/SubUI/";

            ///

 

            /// 图标途径

            ///

            public const string UI_ICON = "UI/Icon";

 

            public static System.Type GetUIScriptByType(EnumUIType type)

            {

                System.Type _type = null;

                switch (type)

                {

                    case EnumUIType.StartUI:

                        //返回对应UI脚本

                        _type = typeof(StratUI);

                        break;

                    case EnumUIType.WarUI:

                        //返回对应UI脚本手机App外包

                        _type = typeof(WarUI);

                        break;

                    default:

                        Debug.Log("No This UIType : " + type.ToString());

                        break;

                }

                return _type;

            }

 

        }

 

        #endregion

 

}

 

上篇:上一篇:U3D 客户端框架:资源管理器
下篇:下一篇:常州手游开发-Unity5资源管理和增量更新