说在前面

序列化是为了将对象存储(或传输)到内存、数据库或文件中,把对象状态转化为一组字节的过程。换句话说:就是如何保存对象并恢复其状态以供后续使用。现在的游戏一般都离不开序列化,特别是一些大型游戏,因为游戏本身就非常大,每次版本更新就去重装一次显然不现实。而游戏系列化就能很好的解决这个矛盾,通过比对服务器上的文本数据来判断玩家是否需要更新。

实现

以之前写过的一个简单的打飞碟游戏为基础,实现将其的序列化

首先在Assets视图中创建文件夹Data,并将存放游戏版本与关卡信息的json文件,如下:

原先的关卡信息存放在GameController.cs中,现在已经序列化了,这个类原先的实现就没有用处的,可以将其实现清空,然后再在其后添加两个带有[SerializeField]符号的类,一个存放关卡信息,一个存放版本信息,用于类的可序列化:

[SerializeField]
public class GameInfo
{  public string version;  public int totalRound;  public static GameInfo CreateFromJSON(string json)  {  return JsonUtility.FromJson<GameInfo>(json);  }
}  [SerializeField]
public class LevelData
{  public float speed;  public int round;  public static LevelData CreateFromJSON(string json)  {  return JsonUtility.FromJson<LevelData>(json);  }
}

接着创建一个FileManager的cs脚本,用于处理文本的读写:

using UnityEngine;
using System.Collections;
using Com.Mygame;
using Com.GameControllers;public class FileManager : MonoBehaviour {public string url;private GameController scene= GameController.getInstance();void Awake(){scene = GameController.getInstance();scene.setFileManager(this);LoadGameInfoJson("disk_game.json"); // 获取游戏版本等信息}// 输入关卡文件名,启动协程读取文件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);elsescene.stageLevel(www.text.ToString());  // 返回json字符串给scene}}// 输入游戏信息文件名,启动协程读取文件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);elsescene.stageGameInfo(www.text.ToString());   // 返回json字符串给scene}}
}

为了在屏幕上显示版本信息,因此需要更改UI脚本,类似这样:

另外,游戏的关卡是游戏过程中读取的,我将关卡信息放在rules.cs中,所以现在需要修改调用下一Round的函数:

public void passLever() {my = GameController.getInstance();if (++lever > my._totalRound) {  lever = 1; // 循环  }  string file = "disk_level_" + lever.ToString() + ".json";  my.getFileManager().loadLevelJson(file);  }

最后,还需要修改GameController.cs,比如添加FileManager的注册函数和调用函数;添加stageLevel和stageGameinfo用于接收json字符串并将其转化为对应的游戏参数:

        private FileManager _fileManager;public string _version;  public void stageGameInfo(string json) {  GameInfo data = GameInfo.CreateFromJSON(json);  _version = data.version;  _totalRound = data.totalRound;  }public void stageLevel(string json) {  LevelData data = LevelData.CreateFromJSON(json);  rule.speed = data.speed;rule.lever = data.round; }  public FileManager getFileManager() {  return _fileManager;  }  internal void setFileManager(FileManager ggo) {  if (null == _fileManager) {  _fileManager = ggo;  }  } 

最后看看简单效果:

Unity3D——游戏序列化相关推荐

  1. 《学Unity的猫》——第十八集:Unity3D游戏开发工程师笔试刷题,皮皮收到面试邀请

    文章目录 18.1 皮皮收到面试邀请 18.2 面试题库相关网站 18.2.1 牛客网 18.2.2 领扣LintCode 18.2.3 力扣LeetCode 18.3 优质学习网站 18.3.1 菜 ...

  2. Unity3D游戏开发之网络游戏服务器架构设计培训

    下面我们开始今天的Unity3D游戏开发技能培训. 我们专业培养"游戏主程",挑战20W年薪,初期学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改 ...

  3. Unity3D游戏开发之数据持久化PlayerPrefs的使用

    unity3d提供了一个用于本地持久化保存与读取的类--PlayerPrefs.工作原理非常简单,以键值对的形式将数据保存在文件中,然后程序可以根据这个名称取出上次保存的数值.     PlayerP ...

  4. Unity3D 游戏引擎之脚本实现模型的平移与旋转(六)

    Unity3D 游戏引擎之脚本实现模型的平移与旋转 雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong.com/ar ...

  5. Unity3D游戏-愤怒的小鸟游戏源码和教程(二)

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

  6. android+Unity3D游戏开发之简单的物体运动

    android+Unity3D游戏开发之简单的物体运动 其实这篇也是转载的,真的感觉对于我们初学者来说很不错的,不信你看看嘛;原创链接:http://bbs.9ria.com/thread-98192 ...

  7. Unity3D 游戏引擎之IOS高级界面发送消息与Unity3D消息的接收(九)

    Unity3D 游戏引擎之IOS高级界面发送消息与Unity3D消息的接收 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289 ...

  8. 从一点儿不会开始——Unity3D游戏开发学习(一)

    一些废话 我是一个windows phone.windows 8的忠实粉丝,也是一个开发者,开发数个windows phone应用和两个windows 8应用.对开发游戏一直抱有强烈兴趣和愿望,但奈何 ...

  9. Unity3D 游戏引擎之平面小球重力感应详解【转】

    http://blog.csdn.net/xys289187120/article/details/6969333       手机重力感应应该对大多数开发者并不陌生,在新一代智能手机Android  ...

最新文章

  1. 如何升级jdk_简述面试常见问题的锁升级与锁优化
  2. Object-C 打开工程,选择模拟起时,提示no scheme
  3. 生成android证书
  4. 支付宝支付系统繁忙,请稍后再试(ALI64)错误解决
  5. [合作赞助]九叔生日由中国移动、51cto、奇虎360以及一帆浩瀚联合举办
  6. 解决重启centos后resolv.conf总被清空的问题
  7. 教你如何用若依创建子模块详细教程
  8. 想要获得别人尊重,你必须得自己先牛逼起来
  9. 关于几款系统恢复常用工具的用法介绍
  10. Task04 Python操作PDF
  11. 质量数据分析工具软件的应用
  12. 安卓9安装xpose
  13. Android 长按Menu键的监听
  14. Youtube 评论数
  15. js获取当前时间并转换为一定的格式
  16. win7 dll怎么在xp运行_微信DLL劫持反弹shell复现
  17. python做值班表_如何用Python 实现自动排班
  18. 超链接的伪类及如何清除缓存
  19. 高一被清华姚班录取,高三委拒谷歌 offer,一个重度网瘾少年到理论计算机科学家的蜕变!...
  20. 为什么高斯白噪声的平均功率等于方差?

热门文章

  1. 全球域名后缀注册量排行榜!
  2. mysqlit根据稀有值随机选择_三中锋教练来过了!实况足球20赛季DP7.0后新增稀有阵型top10...
  3. Python实现文字转语音功能
  4. 【Unity】如何删除不要的Tile Palette(瓦片地图)(遇到新的问题就继续更新2021.4.29)
  5. 联想ghost重装系统_联想电脑怎么重装系统的方法
  6. 笔记本怎么用android,电脑上如何使用Android系统
  7. vba控制图表,excel图表,一键完成
  8. 网络基础知识之IP与子网掩码和网络地址
  9. 论文阅读:《A Wavenet For Speech Denoising》
  10. 寒冬中,这些行业正在爆发