不解

最好用的 unity3d Json数据传输,插件JsonFx !!

之前用过一些插件,都是根据取key值来得value。感觉操作起来很麻烦,特别是在unity3d游戏数值比较多的情况下。


比如一个得到Json,先序列化,然后["name"] =  xxx, ["hp"] = xxx, ["fuck"] = XX,


麻烦,效率低,字符串不能批量改名,代码写出来有一堆,恶心!


之下介绍一个插件。JSONFX,百度一下,你找不到,Google一下,你能知道,原因不解释。


下面直接用代码来、文字、和截图来分析JsonFx的用法与妙处:


我的工程目录:


自己封装了一个类,用来读取文件,名字为ReadFileTool。 代码有注释可以自己看。

[csharp] view plaincopy

  1. /****************************************************************************** 
  2.  * 
  3.  * Maintaince Logs: 
  4.  * 2013-01-06   WP      Initial version.  
  5.  * 2013-01-10   WP      Added:FetchLevelByTXTFile(),FetchLevel(),FetchItem() 
  6.  * *****************************************************************************/  
  7.   
  8. using UnityEngine;  
  9. using System.Collections;  
  10. using System.Collections.Generic;  
  11. using JsonFx.Json;  
  12.   
  13. /// <summary>  
  14. /// use for external call  
  15. /// </summary>  
  16. public class ReadFileTool : MonoBehaviour  
  17. {  
  18.   
  19.     /// <summary>  
  20.     /// 根据一个JSON,得到一个类  
  21.     /// </summary>  
  22.     static public T JsonToClass<T>(string json) where T : class  
  23.     {  
  24.         T t = JsonReader.Deserialize<T>(json);  
  25.         return t;  
  26.     }  
  27.   
  28.     /// <summary>  
  29.     /// 根据一个JSON的文件地址,得到一个类  
  30.     /// </summary>  
  31.     static public T AddressToClass<T>(string txtAddress) where T : class  
  32.     {  
  33.         TextAsset jsonData = Resources.Load(txtAddress) as TextAsset;  
  34.         return JsonToClass<T>(jsonData.text);  
  35.     }  
  36.   
  37.     /// <summary>  
  38.     /// 将JSON转换为一个类数组  
  39.     /// </summary>  
  40.     static public T[] JsonToClasses<T>(string json) where T : class  
  41.     {  
  42.         //Debug.Log(json);  
  43.         T[] list = JsonReader.Deserialize<T[]>(json);  
  44.         return list;  
  45.     }  
  46.   
  47.     /// <summary>  
  48.     /// 给Json文件的地址。转换为一个类数组  
  49.     /// </summary>  
  50.     static public T[] AddressToClasses<T>(string txtAddress) where T : class  
  51.     {  
  52.         TextAsset jsonData = Resources.Load(txtAddress) as TextAsset;  
  53.         return JsonToClasses<T>(jsonData.text);  
  54.     }  
  55.   
  56. }  


一个Json文件:

目录下的players.txt文件内容为:

[{"name":"ant","health":20,"maxHealth":20,"speed":1,"attackPower":6,"attackRate":1.5,"attackRange":1,"lastAttackTime":0},
{"name":"goblin","health":60,"maxHealth":60,"speed":0.5,"attackPower":7,"attackRate":1.5,"attackRange":1,"lastAttackTime":0},
{"name":"groundArrow1","health":10,"maxHealth":10,"speed":1,"attackPower":3,"attackRate":1,"attackRange":1,"lastAttackTime":0},
{"name":"groundArrow2","health":50,"maxHealth":50,"speed":1,"attackPower":3,"attackRate":1,"attackRange":6,"lastAttackTime":0}]


Player类:

[csharp] view plaincopy

  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. /// <summary>  
  5. /// 玩家的属性类  
  6. /// </summary>  
  7. public class PlayerStat  
  8. {  
  9.     public string name = "";  
  10.     public int health;  
  11.     public int maxHealth;  
  12.     public int speed;  
  13.     public int attackPower;  
  14.     public float attackRate;  
  15.     public int attackRange;  
  16.     public int lastAttackTime;  
  17.   
  18.     //友情提示,这个是JsonFx必须要的  
  19.     public PlayerStat() { }  
  20. }  

准备工作就已经做好,现在开始要读取Json。。


GM类,新建一个场景,将这个类放到任意物品上。

[csharp] view plaincopy

  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class GM : MonoBehaviour  
  5. {  
  6.     //放了所有的player的属性  
  7.     public static PlayerStat[] players;  
  8.   
  9.     const string addressPlayer = "data/players";  
  10.   
  11.     //第一次进入游戏  
  12.     public static bool isFirst = true;  
  13.   
  14.     void Awake()  
  15.     {  
  16.         if (isFirst)  
  17.         {  
  18.             isFirst = false;  
  19.             players = ReadFileTool.AddressToClasses<PlayerStat>(addressPlayer);  
  20.         }  
  21.     }  
  22.   
  23.     void Start()  
  24.     {  
  25.         foreach (PlayerStat p in players)  
  26.         {  
  27.             Debug.Log("名字:" + p.name + "  health:" + p.health);  
  28.         }  
  29.     }  
  30. }  

运行与结果:




OK。如此简单,json里面的内容就全部放到了自己的静态类之中。


另外友情提示,JsonFx支持把Class 序列化为 Json。


个人觉得非常方便。


目前已知Bug:比如传一个float值为2的,可能会变成1.99999999.。。虽然知道unity3d的浮点型运算也有错,这里大胆猜测是jsonfx的原因。

LitJson也有浮点型的问题。不过不算硬伤。


转载时请注明出处

评论(1)

热度(2)

  1. Dominic Scris Qiu不解 转载了此文字