很多项目都需要对数据表进行调用、数据管理和解析等操作,所以就需要一个模板来减少造轮子的过程。以下即为参考之前做过的一些项目整理出来的针对于小项目,易于实现且扩展性比较强的数据表管理的简易模板的实现思路。
首先我们可以通过数据表的路径来加载数据表并将他们统一存储,因此可以把他们封装成一个类(这里叫它TabPath)。然后对TabPath中的数据表进行数据解析便可获取到每个TabPath中数据表的数据。把数据存入一个个列表。这样的话我们写一个管理类来对这些列表统一进行管理即可。
该模板以json格式的数据表为例,当需要其他格式时替换对应的加载和解析方法即可,主要是探究数据表的管理框架。
示例中的存放路径为:“Assets/StreamingAssets/Tables/...”
定义一个静态变量tabPath来存储数据存放路径。为保证所使用数据的唯一性这里用单例模式来建立数据表管理类TableManager。
public class TableManager
{
static string tabPath = Application.streamingAssetsPath + "/Tables/";//记录数据存放路径
//生成一个Tab单例
static TableManager tab;
public static TableManager Tab
{
get
{
if (tab == null)
{
tab = new TableManager();
}
return tab;
}
}
//构造方法
public TableManager() { }
}
我们需要通过路径来获取相应的资源,所以将两者封装成一个TabPath类,在类的构造方法中可以先将路径传进去
public class TabPath
{
public string loadPath;
//保存解析到的数据
public List<string> lsttab = new List<string>();
public TabPath(string path)
{
loadPath = path;
}
}
这样的话,当需要加载某一个json数据,只需要根据传进去的路径实例化一个TabPath类
TabPath t = new TabPath(path);
然后写一个以下加载数据表的方法,在方法中分割json数据为单个信息,生成列表存入该实例 t。
public static IEnumerator LoadJsonData(TableManager.TabPath tpath)
{
using (UnityWebRequest www = UnityWebRequest.Get(tpath.loadPath))
{
yield return www.SendWebRequest();
if (www.isNetworkError)
{
Debug.LogError("www错误:" + www.error);
}
if (www.isDone)
{
DownloadHandler handler = www.downloadHandler;
yield return new WaitForEndOfFrame();
string jsonData = System.Text.Encoding.UTF8.GetString(handler.data, 1, handler.data.Length - 2);
string temp = jsonData.Replace("\\r\\n", "");
temp = temp.Replace("},", "}⊥");
string[] spt = temp.Split('⊥');
tpath.lsttab.Clear();
for (int i = 0; i < spt.Length; i++)
{
tpath.lsttab.Add(spt[i]);
}
}
}
}
有时可能不需要返回一个列表,这时可以对该方法进行调整,示例如下。这时返回内容为单个类。后续对列表的处理可以对该单个类进行相应处理
public static IEnumerator LoadJsonDataEntire(TableManager.TabPath tpath)
{
using (UnityWebRequest www = UnityWebRequest.Get(tpath.loadPath))
{
yield return www.SendWebRequest();
if (www.result == UnityWebRequest.Result.ConnectionError)
{
Debug.LogError("www错误:" + www.error);
}
if (www.isDone)
{
DownloadHandler handler = www.downloadHandler;
yield return new WaitForEndOfFrame();
string jsonData = System.Text.Encoding.UTF8.GetString(handler.data, 0, handler.data.Length );
string temp = jsonData.Replace("\\r\\n", "");
tpath.lsttab.Clear();
tpath.lsttab.Add(temp);
}
}
}