unity3D之实现一个简单的UI框架

本文介绍了如何在Unity3D中实现一个简单的UI框架,旨在帮助初学者理解UI框架的基本结构和设计模式。通过介绍Utility、UIBases和Managers文件夹下的关键脚本,展示了如何实现资源管理、UI模块和控制器的组织。文中强调了框架的解耦合重要性,并提供了一个简单的使用框架的步骤,包括创建模块和控制器脚本,以及启动框架的Facade类。
摘要由CSDN通过智能技术生成

写在前面的话

我会先把源码直接给出来。博主本身也不是什么大牛,所以写的也不是什么很厉害的框架,只是一个很小很小的UI框架,给初学者一点入门的思路。
很多人在刚开始接触框架的时候都会有一种感觉:这NM什么DDX啊?!完全懵逼了有没有?!我还没开始写代码呢!怎么就已经有这么多代码要看啊?!还有大部分新人都会吐槽的事情:为什么要这么写啊?这玩意随便写个脚本挂上去不是分分钟实现功能吗?你这绕来绕去搞毛?这个主程是不是NT?!emmmmmmmmmmm…如果你知道主程怎么想的,你不就是主程了?
所以,初次接触框架的话,可以抱怨,但是请尽快冷静下来,好好看代码。起码要以最快的速度会用这个框架,在慢慢去分析为什么框架要这么写。其实看完后你就会发现,主程写的框架实现一个功能确实很麻烦,但是你用起来的时候却非常方便,因为很多东西主程早早的就给你封装在框架里了,你只需要干一些不动脑子的体力活就实现了需求,爽就一个字!这就是为什么要使用框架,为什么主程要弯弯绕绕的实现功能。

好,如果你做好了思想准备,那么就先下载源码,读起来吧!这真的是一个很简单的UI框架,内容不多。读起来应该很容易。
UIFrame
提取码:gt4a

那接下来我们就开始吧!

初次接触框架的读者可能会完全不知道从哪里下手阅读,那么博主就带着大家一起看看,这个框架主要是用来解决什么问题的。

脚本文件夹结构

在这里插入图片描述
这个框架有五个基本文件夹,分别是:Managers,Models,UIBases,UIInterface,Utility。
怎么样?都是大家耳熟能详的名字吧?那么我们应该先从哪里开始阅读呢?自然就是Utility文件夹了。

Utility文件夹下的脚本

打开这个文件夹,有如下脚本:
在这里插入图片描述
下面我将依次讲解这几个脚本各自负责做些什么。
首先,我们先看Singlton:

using System;

namespace UIFrame
{
   
    public class Singleton<T> where T : class
    {
   
        private static T instance;

        public static T Instance
        {
   
            get
            {
   
                if (instance == null)
                {
   
                    instance = (T)Activator.CreateInstance(typeof(T), true);
                }
                return instance;
            }
        }
    }
}

很简单,只有20行代码。这个脚本只做了一件事,就是实现一个单例。特殊之处在于,这是一个单例的带有泛型的基类,使用反射的方式搞定的单例,那么他的作用呢?也很简单,只要是你想要把一个脚本做成单例模式,那么只需要继承这个脚本,再私有化无参构造即可。文字可能解释的不是很清楚,我们结合代码来看,接下来我们来看看AssetsManager:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace UIFrame
{
   
    public class AssetsManager : Singleton<AssetsManager>
    {
   
        private AssetsManager()
        {
   
            assetsChace = new Dictionary<string, object>();
        }
        /// <summary>
        /// 资源缓存池
        /// </summary>
        private Dictionary<string, object> assetsChace;
        /// <summary>
        /// 获取资源方法
        /// </summary>
        /// <param name="assetPath">路径</param>
        /// <returns>获取到的对象</returns>
        public object GetAsset(string assetPath)
        {
   
            object asset = null;
            if (!assetsChace.TryGetValue(assetPath,out asset))
            {
   
                asset = Resources.Load(assetPath);
                assetsChace.Add(assetPath, asset);
            }
            return asset;
        }
    }
}

AssetsManager脚本是我用来做资源管理的脚本,那么可能会在很多其他地方要用到,那每次要用到我都去实例化就太麻烦了,而且也不利于资源管理,所以我把他做成单例。怎么做?就利用上面的Singleton脚本来实现,我们让AssetsManager继承Singleton,再私有化构造函数,就自然而然的完成了我们的需求,以后再有其它脚本要实现单例,也这样如法炮制即可。这里就已经体现了一些些框架的威力。也可以说是设计原则的好处。不展开了,回到正题。那么这个脚本管理的是什么资源呢?其实,什么资源都可以,但我们主要是针对UI资源进行管理,首先我们写了一个缓存池,用来缓存已经取过的资源用以二次利用。然后就是一个获取资源的方法了,很简单,就是传过来一个资源的所在路径,通过路径将资源拿出来放进缓存后返回该资源,自己看看应该就能看懂。
好,那这个脚本就不多说了,我们看下一个,JsonPanelManager:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace UIFrame
{
   
    public class JsonPanelManager : Singleton<JsonPanelManager>
    {
   
        private JsonPanelManager()
        {
   
            jsonPanelDataDic = new Dictionary<int, Dictionary<string, string>>();
            jsonLocalizationDic = new Dictionary<int, Dictionary<string, string[]>>();
            widgetDataDic = new Dictionary<int, Dictionary<string, string>>();
            ParseJsonPanel();
            //ParseJsonLocalization();
            ParseJsonWidget();
        }

        /// <summary>
        /// json转换的对象
        /// </summary>
        private JsonPanelModel jsonPanelData;

        /// <summary>
        /// json转换后的字典存储
        /// </summary>
        private Dictionary<int, Dictionary<string,string>> jsonPanelDataDic;

        /// <summary>
        /// json转化后的本地化文件对象
        /// </summary>
        private JsonLocalizationModel jsonLocalizationData;

        /// <summary>
        /// json转换后的本地化文件字典
        /// </summary>
        private Dictionary<int, Dictionary<string, string[]>> jsonLocalizationDic;

        //Widget解析后的数据
        private JsonWidgetModel widgetData;
        //Widget解析后的数据【字典版】
        private Dictionary<int, Dictionary<string, string>> widgetDataDic;

        /// <summary>
        /// json解析
        /// </summary>
        private void ParseJsonPanel()
        {
   
            //获取json文本对象
            TextAsset assetText = AssetsManager.Instance.GetAsset(SystemDefaine.JsonPanelsPath) as TextAsset;

            //解析json
            jsonPanelData = JsonUtility.FromJson<JsonPanelModel>(assetText.text);
            for (int i = 0; i < jsonPanelData.AllData.Length; i++)
            {
   
                //新定义一个字典
                Dictionary<string, string> crtPanelData = new Dictionary<string, string>();

                //将场景ID和字典存入
                jsonPanelDataDic.Add(i, crtPanelData);

                //将场景的所有资源路径保存
                for (int j = 0; j < jsonPanelData.AllData[i].Data.Length; j++)
                {
   
                    crtPanelData.Add(jsonPanelData.AllData[i].Data[j].PanelName, jsonPanelData.AllData[i].Data[j].PanelPath);
                }
            }
        }

        /// <summary>
        /// json解析
        /// </summary>
        private void ParseJsonLocalization()
        {
   
            //获取json文本对象
            TextAsset assetText = AssetsManager.Instance.GetAsset(SystemDefaine.JsonLanguages) as TextAsset;
            //解析json
            jsonLocalizationData = JsonUtility.FromJson<JsonLocalizationModel>(assetText.text);
            
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值