Unity实现json格式的序列化并发布
2016-05-23 02:19
543 查看
关于Unity实现json的反序列化并发布
先上个发布在桌面上的小应用效果图虽然丑,但是毕竟心血
一:什么是序列化
简单说就是把一个内存对象变为与地址无关的可传输的数据格式通常是文本格式;反序列化反之。
详情请看中山大学潘茂林老师的课件:
http://ss.sysu.edu.cn/~pml/se347/11_publish_serialization.html
实现序列化很重要,有助于我们更新游戏,因为更新游戏不允许修改exe文件。
我们只能通过向用户传一系列的系列化后的文件。
然后再反序列化更新游戏中内存对象的属性。
二:unity中json格式的序列化
unity是支持将json格式的文件来反序列化首先,我们通过unity中WWW类型来打开json文件。
找到json文件的url,
string url = "json文件所在的地址"
然后新建WWW类型打开url地址对应的json文件
WWW www = new WWW(url); String json = www.text.ToString();
现在我们得到了一个json格式的字符串
利用unity自带的反序列化来解读字符串
[SerializeField] //这是最新版unity表示可序列化类的标签 public class Data { public int data1; public float data2; public static Data CreateFromJSON(string json) { return JsonUtility.FromJson<LevelData>(json); } }
现在,我们只要调用类中的CreateFromJSON函数
Data _data = Data.CreateFromJSON(json);
然后,我们就可以得到一个类的实例_data
访问数据,只需要下面操作
int json_data1 = _data.data1; float json_data2 = _data.data2; Debug.Log(json_data1); Debug.Log(json.data2);
三:具体代码例子(序列化的具体应用)
这里只贴出游戏中的json文件读取,以及反序列化实现的2个类其他代码,可以去我最下面提供的网盘地址下载我的demo
反序列的实现类:Sence_control
namespace My_Game_Scene { public struct GameData//定义一个结构体类型存储相应内存对象的属性 { public int y_force; public float next_time; public Color flys_color; } public class SceneControl : System.Object { private static SceneControl _instance = null; private FileManager _fm; public int level = 1; public GameData game_data; //存储data的结构体 public string game_version; public int game_total_round; public static SceneControl GetInstance() { if (_instance == null) _instance = new SceneControl(); return _instance; } public FileManager GetFM() { return _fm; } public void SetFM(FileManager fm) { _fm = fm; } public void stageGameInfo(string json) { GameInfo data = GameInfo.CreateFromJSON(json); game_version = data.version; game_total_round = data.totalRound; } public void nextRound() { if (level > game_total_round) { level = 1; // 循环 } string file = "disk_level_" + level.ToString() + ".json"; _fm.loadLevelJson(file); } public void stageLevel(string json) //实现反序列化的函数 { LevelData data = LevelData.CreateFromJSON(json);//将json字符串进行反序列化 game_data.y_force = data.y_force; game_data.next_time = data.next_time; game_data.flys_color = Color.HSVToRGB(data.f_c_a, data.f_c_b, data.f_c_c); } } } [SerializeField]//可序列化类的标签 public class LevelData { public int y_force; public float next_time; public float f_c_a; public float f_c_b; public float f_c_c; public static LevelData CreateFromJSON(string json) { return JsonUtility.FromJson<LevelData>(json); } } [SerializeField] public class GameInfo { public string version; public int totalRound; public static GameInfo CreateFromJSON(string json) { return JsonUtility.FromJson<GameInfo>(json); } } public class Scene_Control : MonoBehaviour {}
读取json文件的实现类:FileManager
using UnityEngine; using System.Collections; using My_Game_Scene; public class FileManager : MonoBehaviour { private SceneControl sc;//场景管理者(单例),在sc中实现反序列化 public string url;//json文件的地址 void Awake() { sc = SceneControl.GetInstance(); sc.SetFM(this); LoadGameInfoJson("game_info.json"); } public void LoadGameInfoJson(string name) { url = "file://" + Application.dataPath + "/Data/" + name; StartCoroutine(LoadGameInfo());//用协程可以避免读取内容太多卡死 } IEnumerator LoadGameInfo() { if (url.Length > 0) { WWW www = new WWW(url); yield return www; //返回帧,具体请看协程的信息 if (!string.IsNullOrEmpty(www.error)) Debug.Log(www.error); else sc.stageGameInfo(www.text.ToString()); //将其交给sc进行反序列化 } } public void loadLevelJson(string name) { url = "file://" + Application.dataPath + "/Data/" + name; StartCoroutine(LoadLevel()); } IEnumerator LoadLevel() { if (url.Length > 0) { WWW www = new WWW(url); yield return www; if (!string.IsNullOrEmpty(www.error)) Debug.Log(www.error); else sc.stageLevel(www.text.ToString()); // 返回json字符串给scene } } }
游戏发布
如图点击build and run,保存在桌面的打飞碟文件夹
这里注意,你发布了之后,发现之前辛辛苦苦打的json文件不见了
然后游戏运行就出现了bug,因为没有json文件读入,
内存对象的一些属性就全乱了。
经过很久的debug,发现,只要按照代码中写的m,在对应的_data
就是发布后储存数据的的文件夹里新建DATA放入我们的json文件
然后 exe文件就可以正常运行了。
五:更新游戏
经过上面的步骤,一旦想更新游戏,只要修改data中的json文件就可以了因为我们向用户更新游戏的时候,虽然不允许修改exe文件
但是可以通过一些途径更改json文件。
也就说,我们只要像下图中更改json文件,就可以简单更新游戏了
六:游戏Demo
这网盘中,有整个打飞碟游戏的demo,以及生成的exe文件及其文件夹读者可以去下载
链接: http://pan.baidu.com/s/1i4BtoZ7 密码: rvdu
相关文章推荐
- 使用 Python 处理 JSON 格式的数据
- c#调用COM组件
- XML 与 JSON 优劣对比
- VBA将excel数据表生成JSON文件
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#实现给图片加水印的方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#中的delegate委托类型基本学习教程
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- 举例讲解C#中自动实现的属性
- C#中this的用法集锦
- C#数据结构之顺序表(SeqList)实例详解
- C#.NET获取拨号连接的宽带连接方法
- C#异步绑定数据实现方法