Unity项目数据表管理简易框架

编程入门 行业动态 更新时间:2024-10-11 23:21:25

Unity项目数据表管理<a href=https://www.elefans.com/category/jswz/34/1769136.html style=简易框架"/>

Unity项目数据表管理简易框架

文章目录

    • 一、背景
    • 二、思路概述
    • 三、具体实现代码及其思路梳理
      • 1.确定数据表存放路径
      • 2.建立数据表管理类
      • 3.加载json数据
      • 4.json解析
      • 5.数据初始化
      • 6.数据初始化调用示例
      • 7.数据获取的相关方法
      • 8.数据调用示例
    • 四、说明

一、背景

很多项目都需要对数据表进行调用、数据管理和解析等操作,所以就需要一个模板来减少造轮子的过程。以下即为参考之前做过的一些项目整理出来的针对于小项目,易于实现且扩展性比较强的数据表管理的简易模板的实现思路。

二、思路概述

首先我们可以通过数据表的路径来加载数据表并将他们统一存储,因此可以把他们封装成一个类(这里叫它TabPath)。然后对TabPath中的数据表进行数据解析便可获取到每个TabPath中数据表的数据。把数据存入一个个列表。这样的话我们写一个管理类来对这些列表统一进行管理即可。

三、具体实现代码及其思路梳理

该模板以json格式的数据表为例,当需要其他格式时替换对应的加载和解析方法即可,主要是探究数据表的管理框架。

1.确定数据表存放路径

示例中的存放路径为:“Assets/StreamingAssets/Tables/…”

2.建立数据表管理类

定义一个静态变量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() { }
}

3.加载json数据

我们需要通过路径来获取相应的资源,所以将两者封装成一个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);}}}

4.json解析

实例化后的类里面的数据依然还是字符串的形式,无法直接的获取数据,所以还需要将他们转成类的形式。对于json中的每条信息,我们可以根据json格式建立数据实体类,如:

public class TabnameDataEntity
{public int ID;public string key1= string.Empty;public string key2= string.Empty;public string key3= string.Empty;
}

对应json中的一条信息为

 {"ID": 1002,"key1": "value1","key2": "value2","key3": "value3"}

这样便可以通过UnityEngine提供的接口JsonUtility将json数据转为类实例。自定义一个UI工具类UIComTool,并写入json转类的泛型方法

using UnityEngine;
public class UIComTool
{public static T GetJsonToMode<T>(string mode){        return JsonUtility.FromJson<T>(mode);}
}

5.数据初始化

为了保存解析到的数据定义对应类型数量的列表,

List<Tabname1DataEntity> tabname1DataEntitys= new List<Tabname1DataEntity>();
List<Tabname2DataEntity> tabname2DataEntitys= new List<Tabname2DataEntity>();

当有多个数据类型时可以建立一个枚举类型

public enum DataType
{tableName1,tableName2
}

这样在TableManager中写入以下初始化方法,将列表里面的数据存入上面定义的列表中

//根据所要获取数据的表格名字来初始化该类型数据的数据列表
public IEnumerator InitTabListData(MonoBehaviour ui,DataType dataType)
{if (tabname1DataEntitys.Count == 0 || tabname2DataEntitys.Count == 0){//根据传入的表格名字来获取对应表格的完整路径string path = string.Format("{0}{1}.json", tabPath, dataType.tostring());//实例化一个TabPath类用来保存路径TabPath t = new TabPath(path);//根据路径加载json数据到实例化的TabPath类yield return ui.StartCoroutine(UIComTool.LoadJsonData(t));//遍历获取到的json数据列表for (int i = 0; i < t.lsttab.Count; i++){//将json数据转化为实例TabnameDataEntity tab = UIComTool.GetJsonToMode<TabTestDemo>(t.lsttab[i]);//将实例存入列表switch(dataType){case DataType .tableName1:tabname1DataEntitys.Add(tab);break;case DataType .tableName2:tabname2DataEntitys.Add(tab);break;}}}
}

6.数据初始化调用示例

在需要加载表格数据表时只需要使用TableManager的单例调用该方法即可,调用示例如下:

void LoadData()
{StartCoroutine(LoadTab_tablenameData());
}
IEnumerator LoadTab_tablenameData()
{yield return TableManager.Tab.InitTabListData(this, knowledgeType);
}

当只有一个数据类型时,可以不使用枚举类型,初始化时也可以不使用dataType的参数。

7.数据获取的相关方法

初始化后的列表中已经保存了表格中的数据,为方便对数据的存取,可以根据项目需求编写获取列表数据的相关方法,示例如下:

//根据id获取对应数据实例
public TabnameDataEntity GetTabtByID(int id)
{for (int i = 0; i < tabnameDataEntitys.Count; i++){if (tabnameDataEntitys[i].ID == id){return tabnameDataEntitys[i];}}return null;
}
//获取整个数据列表
public List<TabnameDataEntity> GetAllTabData()
{return tabnameDataEntitys;
}

8.数据调用示例

在需要调用数据时只需要通过TableManager的单例调用其中的方法即可

tablenameDataEntitys=TableManager.Tab.GetAllTabData();

四、说明

该模板只是一个初步整理的简易框架,可能描述会有不清晰,框架结构不完善考虑不周到等问题,后续会不断完善优化。

更多推荐

Unity项目数据表管理简易框架

本文发布于:2024-03-23 16:56:46,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1740588.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:简易   数据表   框架   项目   Unity

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!