Unity 简易UI框架

先声明一下,这个简易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);
        }
    }
 }

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值