Unity 简易UI框架

来源:互联网 发布:淘宝链接里的花店地址 编辑:程序博客网 时间:2024/05/29 15:48

先声明一下,这个简易UI框架是我根据网上的一个UI框架进行修改的阉割版。

原文章地址:http://www.cnblogs.com/LiuGuozhu/p/6416098.html

首先

编辑基础UI窗体 UIbase脚本:

namespace SUIFW{    public class UIBase : MonoBehaviour    {        // 显示状态        public virtual void Display()        {            this.gameObject.SetActive(true);        }        // 隐藏状态        public virtual void Hiding()        {            this.gameObject.SetActive(false);        }        // 重新显示状态        public virtual void Redisplay()        {            this.gameObject.SetActive(true);        }        // 冻结状态        public virtual void Freeze()        {            this.gameObject.SetActive(true);        }    }}

上述代码中,主要定义了UI窗体基类的四个重要虚方法,分别对应窗体的打开显示、隐藏、重新显示、窗体冻结(即:窗体显示在其他窗体下面)。方便窗体在不同状态下,针对不同的行为进一步做处理操作。例如,当窗体为“隐藏”与“冻结”状态时,如果此窗体有针对远程服务的网络连接(Socket套接字)时,则需要关闭网络连接,以节省网络资源。


定义“UI管理器”(UIManager.cs) 脚本,这是UI框架中的核心脚本,主要负责UI窗体的加载、缓存、以及对于“UI窗体基类”的各种生命周期的操作(显示、隐藏、重新显示、冻结)。

namespace SUIFW{    public class UIManager : MonoBehaviour    {        //定义单例        private static UIManager instance = null;        // 缓存所有UI窗体        private static Dictionary<string, UIBase> DicAllUIForm;        // 当前显示的UI窗体        private static Dictionary<string, UIBase> DicCurrentShowUIForm;        // 根节点        private Transform CanvasNode;        // 创建单例        public static UIManager GetInstance()        {            if (instance == null)            {                instance = new GameObject("UIManager").AddComponent<UIManager>();            }            return instance;        }        public void Awake()        {            // 找到根节点            CanvasNode = GameObject.FindGameObjectWithTag("TagCanvas").transform;            // 实例化缓存所有UI窗体的字典            DicAllUIForm = new Dictionary<string, UIBase>();            // 实例化缓存当前显示的UI窗体的字典            DicCurrentShowUIForm = new Dictionary<string, UIBase>();            // 将CanvasNode设为该脚本所在物体的父物体            this.gameObject.transform.SetParent(CanvasNode, false);            // 保证父物体在切换场景的时候不会被删除            DontDestroyOnLoad(CanvasNode);        }        /// <summary>        /// 显示UI的方法        /// </summary>        /// <param name="uiFormName"></param>        public void ShowUIForm(string uiFormName)        {            // 加载返回的UI窗体的基类            UIBase uibase = null;            if (string.IsNullOrEmpty(uiFormName))            {                return;            }            // 根据UI窗体的名称,加载到“所有UI窗体”集合中            uibase = LoadFormsToAllUIFormsCatch(uiFormName);            if (uibase == null)            {                return;            }            LoadCurrntCatch(uiFormName);        }        /// <summary>        /// 关闭UI窗体        /// </summary>        /// <param name="uiFormName"></param>        public void CloseUIForm(string uiFormName)        {            // 加载返回的UI窗体的基类            UIBase uibase;            if (string.IsNullOrEmpty(uiFormName))            {                return;            }            DicAllUIForm.TryGetValue(uiFormName, out uibase);            if (uibase == null)            {                return;            }            ExitUIForm(uiFormName);        }        // 加载所有UI窗体        private UIBase LoadFormsToAllUIFormsCatch(string uiFormName)        {            // 加载返回的UI窗体的基类            UIBase uibaseResult = null;            DicAllUIForm.TryGetValue(uiFormName, out uibaseResult);            if (uibaseResult == null)            {                uibaseResult = LoadUIForm(uiFormName);            }            return uibaseResult;        }        // 加载UI窗体        private UIBase LoadUIForm(string uiFormName)        {            // UI窗体路径            string strUIFormPath = "Prefab/" + uiFormName;            GameObject goCloneUIPrefab = null;            UIBase uibase = null;            if (!string.IsNullOrEmpty(strUIFormPath))            {                goCloneUIPrefab = ResourcesMgr.GetInstance().LoadAsset(strUIFormPath, false);            }            if (goCloneUIPrefab != null)            {                uibase = goCloneUIPrefab.GetComponent<UIBase>();                if (uibase == null)                {                    Debug.Log("出错");                    return null;                }                goCloneUIPrefab.transform.SetParent(CanvasNode, false);            }            // 设置隐藏            goCloneUIPrefab.SetActive(false);            // 把预设体加入到“所有UI窗体”集合中            DicAllUIForm.Add(uiFormName, uibase);            return uibase;        }        /// <summary>        /// 加载当前窗体        /// </summary>        /// <param name="uiFormName"></param>        private void LoadCurrntCatch(string uiFormName)        {            UIBase uibase;            UIBase uibaseFormAll;            DicCurrentShowUIForm.TryGetValue(uiFormName, out uibase);            if (uibase != null)            {                return;            }            DicAllUIForm.TryGetValue(uiFormName, out uibaseFormAll);            if (uibaseFormAll != null)            {                DicCurrentShowUIForm.Add(uiFormName, uibaseFormAll);                uibaseFormAll.Display();            }        }        /// <summary>        /// 退出指定UI窗体        /// </summary>        /// <param name="strUIFormName"></param>        private void ExitUIForm(string strUIFormName)        {            UIBase uibase;            DicCurrentShowUIForm.TryGetValue(strUIFormName, out uibase);            if (uibase == null)            {                return;            }            uibase.Hiding();            DicCurrentShowUIForm.Remove(strUIFormName);        }    } }

接下来的脚本下次有空再继续更新。。。。。。。

原创粉丝点击