Unity框架——UI管理

来源:互联网 发布:单片机数码管显示数字 编辑:程序博客网 时间:2024/05/19 09:47

1.BaseUI

using UnityEngine;using System.Collections;public class BaseUI : MonoBehaviour{    [HideInInspector]    public string UIName;    private Transform _transform;    public Transform CacheTransform    {        get        {            if (_transform == null)            {                _transform = this.transform;            }            return transform;        }    }    private GameObject _gameObject;    public GameObject CacheGameObject    {        get        {            if(_gameObject==null)            {                _gameObject = this.gameObject;            }            return _gameObject;        }    }    /// <summary>    /// 绑定脚本并激活游戏物体调用的方法    /// </summary>    void Awake()    {        OnAwake();    }    /// <summary>    /// 初始化UI,用于寻找组件等    /// </summary>    public void Init()    {        OnInit();    }    /// <summary>    /// 显示当前UI    /// </summary>    /// <param name="objArgs">参数集</param>    public void Show(params object[] objArgs)    {        CacheGameObject.SetActive(true);    }    /// <summary>    /// 隐藏UI    /// </summary>    public void Hide()    {        CacheGameObject.SetActive(false);    }    #region 虚函数    /// <summary>    /// 初始化    /// </summary>    public virtual void OnInit()    {    }    /// <summary>    /// 唤醒    /// </summary>    public virtual void OnAwake()    {    }    /// <summary>    /// 显示UI    /// </summary>    /// <param name="objArgs">参数</param>    public virtual void OnShow(params object[] objArgs)    {    }    /// <summary>    /// 隐藏UI    /// </summary>    public virtual void OnHide()    {    }    /// <summary>    /// 删除UI    /// </summary>    public virtual void OnDestroy()    {    }    #endregion}

2.UI管理者类

using UnityEngine;using System.Collections;using System.Collections.Generic;using System;public class UIManager : EventNode {    #region 单例    private static UIManager instance;    public static UIManager Instance    {        get        {            if (instance == null)            {                instance = (UIManager)FindObjectOfType(typeof(UIManager));                if (instance == null)                {                    Debug.LogError("An instance of " + typeof(UIManager) + " is needed in the scene, but there is none.");                }            }            return instance;        }    }    #endregion    private Dictionary<string, BaseUI> UIDic = new Dictionary<string, BaseUI>();    /// <summary> 命令集合 </summary>    public List<Command> cmdList = new List<Command>();    /// <summary>    /// 添加一个ui到ui集合中    /// </summary>    /// <param name="ui">ui</param>    public void AddUI(BaseUI ui)    {        UIDic[ui.UIName] = ui;    }    /// <summary>    /// 移除UI从ui集合中    /// </summary>    /// <param name="ui"></param>    public void RemoveUI(BaseUI ui)    {        if(ui!=null&&UIDic.ContainsKey(ui.UIName))        {            UIDic.Remove(ui.UIName);        }    }    #region 创建UI     /// <summary>    /// 创建UI    /// </summary>    /// <param name="uiName">ui名</param>    /// <param name="type">要绑定的脚本名</param>    /// <param name="listener">创建完成回调</param>    public void CreateUI(string uiName, Type type, ILoadUIListener listener)    {        cmdList.Add(new Command(Command.CmdType.Create,type,listener));    }    /// <summary>    /// 创建UI的实体部分    /// </summary>    /// <param name="cmd">指令</param>    private void _Create(Command cmd)    {        BaseUI ui = null;        UIDic.TryGetValue(cmd.uiName,out ui);        if (ui != null)        {            if (cmd.listener != null)            {                cmd.listener.Finish(ui);            }            else            {                ResManager.Instance.Load(cmd.uiName, new LoadResFinish(cmd));            }        }    }    #endregion    #region 显示UI    /// <summary>    /// 显示一个UI界面 如果不存在则创建一个    /// </summary>    /// <param name="uiName">ui名称</param>    /// <param name="type">要绑定的脚本</param>    /// <param name="listener">如果界面不存在则会有加载完成后的回调</param>    /// <param name="objArgs">参数</param>    public void ShowUI(string uiName,Type type,ILoadUIListener listener,params object[] objArgs)    {        BaseUI ui=null;        UIDic.TryGetValue(uiName,out ui);        if(ui==null)        {            CreateUI(uiName, type, listener);        }        cmdList.Add(new Command(Command.CmdType.Show,uiName,objArgs));    }    /// <summary>    /// 显示一个界面    /// </summary>    /// <param name="cmd">指令</param>    private void _Show(Command cmd)    {        BaseUI ui=null;        UIDic.TryGetValue(cmd.uiName, out ui);        if(ui!=null)        {            ui.Show();            if(cmd.listener!=null)            {                cmd.listener.Finish(ui);            }        }    }    #endregion    #region 隐藏UI    /// <summary>    /// 隐藏ui    /// </summary>    /// <param name="uiName">ui名</param>    public void HideUI(string uiName)    {        cmdList.Add(new Command(Command.CmdType.Hide, uiName));    }    /// <summary>    /// 隐藏UI(实体部分)    /// </summary>    /// <param name="cmd">指令</param>    public void _Hide(Command cmd)    {        BaseUI ui=null;        UIDic.TryGetValue(cmd.uiName, out ui);        if (ui != null)        {            ui.Hide();        }    }    #endregion    #region 删除UI    /// <summary>    /// 删除一个UI    /// </summary>    /// <param name="uiName">ui名</param>    public void DestroyUI(string uiName)    {        cmdList.Add(new Command(Command.CmdType.Destroy,uiName));    }    /// <summary>    /// 删除UI (实体部分)    /// </summary>    /// <param name="cmd">指令</param>    private void _Destroy(Command cmd)    {        BaseUI ui=null;        UIDic.TryGetValue(cmd.uiName, out ui);        if (ui != null)        {            UIDic.Remove(ui.UIName);            Destroy(ui.CacheGameObject);        }    }    #endregion    void Update()    {        if(cmdList.Count>0)        {            Command tempCmd = null;            tempCmd = cmdList[0];            if(tempCmd==null)            {                cmdList.RemoveAt(0);            }            else            {                switch(tempCmd.cmdType)                {                    case Command.CmdType.Create:                        _Create(tempCmd);                        break;                    case Command.CmdType.Show:                        _Show(tempCmd);                        break;                    case Command.CmdType.Hide:                        _Hide(tempCmd);                        break;                    case Command.CmdType.Destroy:                        _Destroy(tempCmd);                        break;                }                cmdList.RemoveAt(0);            }        }    }    /// <summary>    /// UI资源加载完成的回调    /// </summary>    public class LoadResFinish:IResLoadListener    {        public Command cmd;        public LoadResFinish(Command _cmd)        {            cmd = _cmd;        }        public void Finished(object asset)        {            if(cmd ==null)            {                return;            }            GameObject gamObject = GameObject.Instantiate<GameObject>(asset as GameObject);            gamObject.SetActive(false);            BaseUI ui= gamObject.AddComponent(cmd.type)as BaseUI;            ui.Init();            if(cmd.listener!=null)            {                cmd.listener.Finish(ui);            }        }        public void Failed()        {            if (cmd.listener != null)            {                cmd.listener.Failed();            }        }    }    /// <summary>    /// 界面加载的回调    /// </summary>    public interface ILoadUIListener    {        void Finish(BaseUI ui);        void Failed();    }    /// <summary>    /// 操作UI指令集    /// </summary>    public class Command    {        /// <summary>        /// 指令类型        /// </summary>        public enum CmdType        {            /// <summary> 创建 </summary>            Create,            /// <summary> 显示或者刷新 </summary>            Show,            /// <summary> 隐藏 </summary>            Hide,            /// <summary> 删除 </summary>            Destroy,        }        /// <summary> ui名称 </summary>        public string uiName;        /// <summary> 要绑定的脚本 </summary>        public Type type;        /// <summary> 加载完成后的回调 </summary>        public ILoadUIListener listener;        /// <summary> 参数集合 </summary>        public object[] objArgs;        /// <summary> 命令类型 </summary>        public CmdType cmdType;        /// <summary>        /// 构造函数(刷新页面)        /// </summary>        /// <param name="_cmdType">命令类型</param>        /// <param name="_uiName">UI名</param>        /// <param name="_objArgs">参数</param>        public Command(CmdType _cmdType, string _uiName,params object[] _objArgs)        {            uiName = _uiName;            cmdType = _cmdType;            objArgs = _objArgs;        }        /// <summary>        /// 构造函数(创建时的)        /// </summary>        /// <param name="_cmdType">命令类型</param>        /// <param name="_type">脚本名</param>        /// <param name="_listener">回调</param>        public Command(CmdType _cmdType,Type _type,ILoadUIListener _listener)        {            cmdType = _cmdType;            type = _type;            listener = _listener;        }    }}
0 0
原创粉丝点击