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

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


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

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<UIManager>
    {

        #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<UIInfoData> stackOpeningUIs = null;

        public override void Init()
        {
            dicOpenedUIs = new Dictionary<EnumUIType, GameObject>();
            stackOpeningUIs = new Stack<UIInfoData>();
        }

        #region Get
        
        public T GetUI<T>(EnumUIType _type) where T : BaseUI
        {
            GameObject _retObj = GetUIObject(_type);
            if (_retObj != null)
                return _retObj.GetComponent<T>();
            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<int> 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<BaseUI>();
                        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<EnumUIType> _keyList = new List<EnumUIType>(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<BaseUI>();
                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

    }




2017.3.12更新  补上枚举代码

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
        {
            /// <summary>
            /// UI预设
            /// </summary>
            public const string UI_PREFAB = "UIPrefab/";
            /// <summary>
            /// UI小控件
            /// </summary>
            public const string UI_CONTROLS_PREFAB = "UIPrefab/Control/";
            /// <summary>
            /// UI子页面
            /// </summary>
            public const string UI_SUBUI_PREFAB = "UIPrefab/SubUI/";
            /// <summary>
            /// 图标路径
            /// </summary>
            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脚本
                        _type = typeof(WarUI);
                        break;
                    default:
                        Debug.Log("No This UIType : " + type.ToString());
                        break;
                }
                return _type;
            }

        }

        #endregion

}




  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
Unity UI框架是一种用于创建用户界面(UI)的工具集和组件集合。它提供了丰富的UI元素和功能,可以帮助开发者轻松地构建交互性和可视化的界面。 Unity UI框架可以通过Unity Asset Store进行下载。打开Unity编辑器,点击"Window"菜单,选择"Asset Store"选项,会打开Asset Store窗口。在搜索栏中输入"Unity UI框架",可以找到很多可用的UI框架。 在选择和下载UI框架之前,开发者应该了解项目的需求并进行评估。可以根据项目的规模、复杂度和用户需求来选择合适的UI框架。一些常用的UI框架包括:"TextMeshPro"、"DOTween" 和 "UGUI"等。开发者可以根据自己的需要选择适合的框架。 下载UI框架后,可以将其导入到Unity项目中。在Asset Store或者Unity Package Manager中选择合适的UI框架,点击"Download" 或者 "Import"按钮进行安装。安装完成后,可以在Unity编辑器的"Assets"文件夹中找到导入的UI框架。 使用UI框架时,可以在Unity编辑器中创建UI元素,如按钮、文本、滑动条等,并对其进行布局和样式设置。可以通过脚本代码来实现交互性功能,如按钮的点击事件、输入框的文本处理等。UI框架还提供了很多可定制的功能和效果,如动画、过渡和绘制等,可以增强用户界面的视觉效果和交互体验。 总之,Unity UI框架是一个方便使用的工具集,可以帮助开发者快速构建用户界面。通过下载合适的UI框架,开发者可以轻松地创建、布局和管理UI元素,提供良好的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值