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

开场白


LitJson是一个开源项目,比较小巧轻便,安装也很简单,在Unity里只需要把LitJson.dll放到Plugins文件夹下,并在代码的最开头添加
“Using LitJson”就可以了。简单来说,LitJson的用途是实现Json和代码数据之间的转换,一般用于从服务器请求数据,得到返回的Json后进行转换从而在代码里可以访问。具体请详见LitJson的官网

关于和服务器数据之间的转换在此就不再赘述,官网以及一些博客里已有涉及,而且也比较详细了。

这里,主要谈一下LitJson的其他用途。

想象一个场景,你需要显示一个家庭信息的表格,这个表格的每一行代表了你的一个家人的名字、年龄、手机号码和住址等信息。因为这个信息不大,用数据库实在是大材小用,而且也很麻烦。

我们可以用一个数据结构来在代码里表示每个家人的信息:

public class FamilyInfo {
public string name;
public int age;
public string tellphone;
public string address;
}

然后用一个List来表示家庭信息表:

public class FamilyList {
public List<FamilyInfo> family_list;
}

最后,打印信息:

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]来实现的。

具体代码如下:

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如下:
{
"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"
}
]
}

代码如下:

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后缀;

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

注意

使用LitJson解析时,解析类(如上面的FamilyInfo)
  • 若包含Dictionary结构,则key的类型必须是string,而不能是int类型(如需表示id等),否则无法正确解析!
  • 若需要小数,要使用double类型,而不能使用float,可后期在代码里再显式转换为float类型。


结束语


这个教程比较简单,希望大家可以从这个小例子里举一反三!我实习所做的这个项目里就经常使用这样的方法来初始化一些表格,这样也方便项目管理。感谢阅读。

【Unity插件】LitJson杂谈的更多相关文章

  1. Unity插件之Unity调用C#编译的DLL

    Unity插件分为两种:托管插件(Managed Plugins)和本地插件(Native Plugins).本文先来说说Unity中的托管插件,本地插件的文章留到下一篇文章再说. 有时候我们会有这样 ...

  2. Unity插件之NGUI学习(8)—— Table和NGUI尺寸转换为世界坐标系尺寸

    依据 Unity插件之NGUI学习(2),创建一个UI Root,在UI Root下创建一个Texture作为背景图,并设置图片,在Wiget下调整大小:然后在UI Root下再创建一个Panel. ...

  3. 导入Unity插件时出现Failed to import package with error: Couldn't decompress package

    导入Unity插件时出现Failed to import package with error: Couldn't decompress package 一开始以为压缩包本身有问题,坏了 后来发现在父 ...

  4. Unity插件-NGUI使用教程

    Unity插件-NGUI使用教程 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 NGUI 一款强大的次 ...

  5. Unity插件-ShareSDK使用指南

    Unity插件ShareSDK使用教程 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Summariz ...

  6. 《图说VR入门》——Unity插件DK2使用教程

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/53339254 作者:car ...

  7. Egret3D学习笔记一 (Unity插件使用)

    一 官方教程: http://developer.egret.com/cn/github/egret-docs/Engine3D/getStarted/getStarted/index.html 大部 ...

  8. Unity插件之NGUI学习(4)—— 创建UI2DSprite动画

    创建一个新的Scene.并按 Unity插件之NGUI学习(2)创建UI Root,并在UI Root的Camera下创建一个Panel. 然后在选中Panel,在菜单中选择NGUI->Crea ...

  9. Unity 插件收集(持续更新)

    MGS Machinery Unity绑定机械关节,铰链,机构插件包.    MGS Mechanical Drive 用于绑定场景中的机械驱动器的Unity插件   Unity Wave Propa ...

随机推荐

  1. Android Multimedia框架总结(二十五)MediaProjection实现手机截屏(无须root)

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53966818 前言:一年半多以前 ...

  2. 安卓高级3 RecyclerView 和cardView使用案例

    cardView: 添加依赖:在Studio搜索cardview即可 在V7包中 或者直接在gradle中添加 compile 'com.android.support:cardview-v7:24. ...

  3. Mac 下安装运行Rocket.chat

    最近花了一周的时间,复习了HTML.CSS.原生JS,并学习了Node.js.CoffeeScript.js.MongoDB,入了下门. 因为准备在Rocket.chat 上做二次开发,所以先下载和安 ...

  4. 如何使用Live CD来修复Grub / Grub2

    Introduction 一般我会在计算机上装两个或者多个系统,例如,我在计算机上安装了Ubuntu.Windows 7.Windows 8.1.有一天我的Win8.1不能正常使用了,我想重新安装Wi ...

  5. 1、win10下连接本地系统上的Linux操作系统(分别以Nat方式和桥接模式实现)

    1.win10下连接本地系统上的Linux操作系统(分别以Nat方式和桥接模式实现) 一.准备知识:win10下打开Administrator的方式 在win10操作系统中,Administrator ...

  6. 奥比中光Orbbec Astra Pro RGBD 3D视觉传感器在ROS(indigo和kinetic)使用说明 rgb depth同时显示

    Orbbec Astra Pro传感器在ROS(indigo和kinetic)使用说明 rgb depth同时显示 这款摄像头使用uvc输入彩色信息,需要libuvc和libuvc_ros这样才能在R ...

  7. Linux 高性能服务器编程——I/O复用

    问题聚焦:     前篇提到了I/O处理单元的四种I/O模型.     本篇详细介绍实现这些I/O模型所用到的相关技术.     核心思想:I/O复用 使用情景: 客户端程序要同时处理多个socket ...

  8. Cartographer资料分享

    中文资料稍后补充 Introducing Cartographer By Tully Foote on October 5, 2016 10:11 AM From Damon Kohler, Wolf ...

  9. Android图片setBackgroundResource和setImageResource的区别

    网上对于这2个的区别大都是如下所示: setImageResource與xml中的src的屬性才是相匹配的,而setBackgroundResource是與xml中的background屬性相匹配 的 ...

  10. 1079. Total Sales of Supply Chain (25) -记录层的BFS改进

    题目如下: A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyon ...