广州unity3d培训
达内广州CBD中心

18589266248

热门课程

广州unity3d培训班:unity3d使用 litjson 制作数据表

  • 时间:2017-12-13 14:59
  • 发布:unity3d培训
  • 来源:达内新闻

广州unity3d培训:unity3d使用 litjson 制作数据表

距离上一次更新博客已有一段时间了,一实习就懒了,嘿嘿。这次谈一下在实习里新碰到的一个Unity插件——LitJson(也可以去官网下载最新版)。

开场白
LitJson是一个开源项目,比较小巧轻便,安装也很简单,在Unity里只需要把LitJson.dll放到Plugins文件夹下,并在代码的最开头添加 “Using LitJson”就可以了。简单来说,LitJson的用途是实现Json和代码数据之间的转换,一般用于从服务器请求数据,得到返回的Json后进行转换从而在代码里可以访问。具体请详见LitJson的官网。
关于和服务器数据之间的转换在此就不再赘述,官网以及一些博客里已有涉及,而且也比较详细了。
这里,主要谈一下LitJson的其他用途。
想象一个场景,你需要显示一个家庭信息的表格,这个表格的每一行代表了你的一个家人的名字、年龄、手机号码和住址等信息。因为这个信息不大,用数据库实在是大材小用,而且也很麻烦。
我们可以用一个数据结构来在代码里表示每个家人的信息:
[csharp] view plaincopy在CODE上查看代码片派生到我的代码片 
public class FamilyInfo {  
    public string name;  
    public int age;  
    public string tellphone;  
    public string address;  
}  
然后用一个List来表示家庭信息表:
[csharp] view plaincopy在CODE上查看代码片派生到我的代码片 
public class FamilyList {  
    public List<FamilyInfo> family_list;  
}  
最后,打印信息:
[csharp] view plaincopy在CODE上查看代码片派生到我的代码片 
private void DisplayFamilyList(FamilyList familyList) {  
    if (familyList == null) return;  
          
    foreach (FamilyInfo info in familyList.family_list) {  
        Debug.Log("Name:" + info.name + " Age:" + info.age + " Tel:" + info.tellphone + " Addr:" + info.address);  
    }  
}  
准备工作都已经做好,那么数据到底在什么时候初始化呢?
第一种方法
一种方法是我们可以在编辑面板里直接初始化。为了达到目的,我们还需要告诉Unity编辑器在面板里显示我们的FamilyInfo,以便我们可以随机编辑,这是通过在类名前声明
[System.Serializable]来实现的。
具体代码如下:
[csharp] view plaincopy在CODE上查看代码片派生到我的代码片 
sing System.Collections;  
using System.Collections.Generic;  
using LitJson;  
  
[System.Serializable]  
public class FamilyInfo {  
    public string name;  
    public int age;  
    public string tellphone;  
    public string address;  
}  
  
[System.Serializable]  
public class FamilyList {  
    public List<FamilyInfo> family_list;  
}  
  
public class LitJsonSample : MonoBehaviour {  
      
    public FamilyList m_FamilyList = null;  
      
    // Use this for initialization  
    void Start () {  
        DisplayFamilyList(m_FamilyList);  
    }  
      
    private void DisplayFamilyList(FamilyList familyList) {  
        if (familyList == null) return;  
          
        foreach (FamilyInfo info in familyList.family_list) {  
            Debug.Log("Name:" + info.name + "       Age:" + info.age + "        Tel:" + info.tellphone + "      Addr:" + info.address);  
        }  
    }  
      
    // Update is called once per frame  
    void Update () {  
      
    }  
}  
运行结果如下:

但是这种方法灵活性太差,而且很容易发生错误。例如当我们不小心改变了变量名称,那么我们在面板里编辑好的数据就都会不见了!下面介绍另一种比较好的方法——把数据保存为本地的一个文本文件。

第二种方法

正如前面所说,我们把信息存成一个表格,并保存为txt格式。注意,为了能使用LitJson解析,txt中必须使用Json格式。
family.txt如下:
[plain] view plaincopy在CODE上查看代码片派生到我的代码片 
{  
    "family_list": [  
        {  
            "name" : "candycat",  
            "age" : 21,  
            "tellphone" : "xxx",  
            "address" : "xxx"  
        },  
        {  
            "name" : "candycat#",  
            "age" : 22,  
            "tellphone" : "xxx",  
            "address" : "xxx"  
        },  
        {  
            "name" : "candycat##",  
            "age" : 23,  
            "tellphone" : "xxx",  
            "address" : "xxx"  
        }  
    ]  
}  


代码如下:
[csharp] view plaincopy在CODE上查看代码片派生到我的代码片 
using UnityEngine;  
using UnityEditor;  
using System.Collections;  
using System.Collections.Generic;  
using LitJson;  
  
public class FamilyInfo {  
    public string name;  
    public int age;  
    public string tellphone;  
    public string address;  
}  
  
public class FamilyList {  
    public List<FamilyInfo> family_list;  
}  
  
public class LitJsonSample : MonoBehaviour {  
      
    public FamilyList m_FamilyList = null;  
      
    // Use this for initialization  
    void Start () {  
        ReloadFamilyData();  
          
        DisplayFamilyList(m_FamilyList);  
    }  
      
    private void ReloadFamilyData()  
    {             
        UnityEngine.TextAsset s = Resources.Load("Localize/family") as TextAsset;   
        string tmp = s.text;  
        m_FamilyList = JsonMapper.ToObject<FamilyList>( tmp );  
        if ( JsonMapper.HasInterpretError() )  
        {  
            Debug.LogWarning( JsonMapper.GetInterpretError() );  
        }  
    }  
      
    private void DisplayFamilyList(FamilyList familyList) {  
        if (familyList == null) return;  
          
        foreach (FamilyInfo info in familyList.family_list) {  
            Debug.Log("Name:" + info.name + "       Age:" + info.age + "        Tel:" + info.tellphone + "      Addr:" + info.address);  
        }  
    }  
      
    // Update is called once per frame  
    void Update () {  
      
    }  
}  


有几点注意的地方:
Resources.Load("Localize/family")表示加载family文件,但一定要注意要把family.txt文件放在Resources文件夹下,只有这样Resources.Load才能够访问到,在这个例子里family的绝对路径为“Resources/Localize/family”。这是因为Resources文件夹是Unity默认的资源文件夹,有着特殊的用途,这里我还不是很了解,以后要深入学习一下;
Resources.Load参数中的路径名一定不可以包含后缀,这里也就是.txt后缀;

输出结果和第一种方法完全一样。

如此高质量的广州unity3d培训班,足以让你从小白成长为精英,等你四个月后从达内教育毕业,找到高薪工作的时候,相信你一定会感谢当初的选择!

上一篇:广州unity3d培训班:unity3d 场景快速搭建教程
下一篇:广州unity3d培训:在Unity3D里使用DLL

马上预约三天免费体验课

姓名:

电话:

想独立开发unity3d游戏 必须掌握哪些相关知识?

Unity3D零基础入门指南?初学者必看!

怎样学习unity3d?Unity3D培训班哪家好?

学习unity3d有哪几个步骤?

选择城市和中心
贵州省

广西省

海南省