unity3d学习笔记(二十)--利用JSON读取和保存游戏数据

本文介绍了一种使用JsonMapper库简化游戏数据保存与读取的方法,通过实例展示了如何快速实现数据的JSON格式存储与读取,特别针对游戏中的建筑数据进行了详细说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢。

http://blog.youkuaiyun.com/lzhq1982/article/details/19237031


前面转载的文章介绍过如何利用c#解析json,但实用性有些差,对于游戏大量数据的保存和读取很不方便。这里着重介绍下JsonMapper的使用,可以很简单就实现json格式的数据保存与读取。

以游戏中的建筑举例,假如我的游戏可以建造很多建筑,建筑公有的数据结构如下:

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class BuildingSaveData {  
  2.     public string strID;  
  3.     public int nBuildingId;  
  4.     public int nBuildingLevel;  
  5.     ...  
  6. }  

那么这样的一个建筑列表就应该是: public List<BuildingSaveData_buildingList;

那如何保存这个建筑列表里的建筑信息呢,如果用JsonWriter一个数据一个数据的保存,那数据量小还好,数据多就太复杂了,程序员不是干体力劳动的工种。这时候就让JsonMapper来解决吧。

1、这里我们用LitJson库里的Json,所以首先需要加载LitJson库,没有的百度上下载一个,然后放到你的工程下,我放在了Assets/Plugins下,然后别忘了在文件头引用LitJson:

using LitJson;

2、写一个建筑列表的类。

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class BuildingList {  
  2.     public List<BuildingSaveData> _buildingList = new List<BuildingSaveData>();  
  3. }  

3、保存建筑信息。

先创建BuildingList的对象:BuildingList _ownBuildingList = null; 然后就可以保存数据了,代码如下:

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public void SaveBuildingData(BuildingSaveData data) {  
  2.     string filePath = Application.dataPath + @"/Resources/Settings/JsonBuilding.txt";  
  3.     if (!File.Exists(filePath)) {  
  4.         _ownBuildingList = new BuildingList();  
  5.         _ownBuildingList._buildingList.Add(data);  
  6.     } else {  
  7.         bool bFind = false;  
  8.         for (int i = 0; i < _ownBuildingList._buildingList.Count; ++i) {  
  9.             BuildingSaveData saveData = _ownBuildingList._buildingList[i];  
  10.             if (data.strID == saveData.strID) {  
  11.                 saveData.nBuildingLevel = data.nBuildingLevel;  
  12.                 ...  
  13.                 bFind = true;  
  14.                 break;  
  15.             }  
  16.         }  
  17.         if (!bFind)  
  18.             _ownBuildingList._buildingList.Add(data);  
  19.     }  
  20.   
  21.     FileInfo file = new FileInfo(filePath);  
  22.     StreamWriter sw = file.CreateText();  
  23.     string json = JsonMapper.ToJson(_ownBuildingList);  
  24.     sw.WriteLine(json);  
  25.     sw.Close();  
  26.     sw.Dispose();  
  27.  
  28. #if UNITY_EDITOR  
  29.     AssetDatabase.Refresh();  
  30. #endif  
  31. }  

以上代码很简单,要保持的数据通过 BuildingSaveData参数传进来,我的数据都保存在了Assets/Resources/Settings/下,所以先判断该路径下是否有这个文件,如果没有,直接构造函数,并且直接把这个data加到数据列表中去。如果有这个文件,那先判断你的建筑列表中是否已经有了该条建筑信息,你只是想更新一下数据,比如建筑升级,如果没有该建筑信息,直接把这个data加到数据列表中去。下面是重点,用FileInfo的CreateText打开文件,这个函数会判断是否有文件,有则打开,没有则创建后打开,然后就是JsonMapper上场了,直接用它的ToJson接口将你的列表类传进去,然后自动转化成string数据,最后把这个string数据写到文件中就OK了。这里用到了文件处理类,所以别忘了加上其引用:

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. using System.IO;  
  2. using System.Text;  


因为这里用了AssetDatabase,所以也别忘了加上其引用:

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #if UNITY_EDITOR  
  2. using UnityEditor;  
  3. #endif  

4、读取建筑信息

一般在游戏刚加载的就需要将文件里存储的数据读取出来,利用JsonMapper读取数据相当简单。

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public void LoadBuildingData() {  
  2.     TextAsset s = Resources.Load("Settings/JsonBuilding"as TextAsset;  
  3.     if (!s)  
  4.         return;  
  5.           
  6.     string strData = s.text;  
  7.     _ownBuildingList = JsonMapper.ToObject<BuildingList>(strData);  
  8. }  

上面代码很简单,不多解释,就是用了JsonMapper的ToObject接口将文本信息直接转化成类信息并传给 BuildingList类,里面的列表数据都不用你操心,自动生成了,相当简便。直接使用即可。


最后你只要在适合的地方保存你的数据,适合的时候读取数据就可以了,相似的数据保存读取方式可以照上面套用。最后看一下我这里的JsonBuilding.txt文件保存的数据:

{"_buildingList":[{"strID":"01/23/2014 17:31:22","nBuildingId":1,"nBuildingLevel":2},{"strID":"01/23/2014 17:48:10","nBuildingId":2,"nBuildingLevel":1},{"strID":"01/23/2014 17:53:09","nBuildingId":3,"nBuildingLevel":1}]}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值