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

来源:互联网 发布:网络信息安全组制定 编辑:程序博客网 时间:2024/05/19 17:58

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


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


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


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


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


我的工程目录:


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

/****************************************************************************** * * Maintaince Logs: * 2013-01-06   WP      Initial version.  * 2013-01-10   WP      Added:FetchLevelByTXTFile(),FetchLevel(),FetchItem() * *****************************************************************************/using UnityEngine;using System.Collections;using System.Collections.Generic;using JsonFx.Json;/// <summary>/// use for external call/// </summary>public class ReadFileTool : MonoBehaviour{    /// <summary>    /// 根据一个JSON,得到一个类    /// </summary>    static public T JsonToClass<T>(string json) where T : class    {        T t = JsonReader.Deserialize<T>(json);        return t;    }    /// <summary>    /// 根据一个JSON的文件地址,得到一个类    /// </summary>    static public T AddressToClass<T>(string txtAddress) where T : class    {        TextAsset jsonData = Resources.Load(txtAddress) as TextAsset;        return JsonToClass<T>(jsonData.text);    }    /// <summary>    /// 将JSON转换为一个类数组    /// </summary>    static public T[] JsonToClasses<T>(string json) where T : class    {        //Debug.Log(json);        T[] list = JsonReader.Deserialize<T[]>(json);        return list;    }    /// <summary>    /// 给Json文件的地址。转换为一个类数组    /// </summary>    static public T[] AddressToClasses<T>(string txtAddress) where T : class    {        TextAsset jsonData = Resources.Load(txtAddress) as TextAsset;        return JsonToClasses<T>(jsonData.text);    }}


一个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类:

using UnityEngine;using System.Collections;/// <summary>/// 玩家的属性类/// </summary>public class PlayerStat{    public string name = "";    public int health;    public int maxHealth;    public int speed;    public int attackPower;    public float attackRate;    public int attackRange;    public int lastAttackTime;    //友情提示,这个是JsonFx必须要的    public PlayerStat() { }}

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


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

using UnityEngine;using System.Collections;public class GM : MonoBehaviour{    //放了所有的player的属性    public static PlayerStat[] players;    const string addressPlayer = "data/players";    //第一次进入游戏    public static bool isFirst = true;    void Awake()    {        if (isFirst)        {            isFirst = false;            players = ReadFileTool.AddressToClasses<PlayerStat>(addressPlayer);        }    }    void Start()    {        foreach (PlayerStat p in players)        {            Debug.Log("名字:" + p.name + "  health:" + p.health);        }    }}

运行与结果:




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


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


个人觉得非常方便。


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

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


转载时请注明出处