写在前面的话
我会先把源码直接给出来。博主本身也不是什么大牛,所以写的也不是什么很厉害的框架,只是一个很小很小的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);