Unity3D——游戏序列化
说在前面
序列化是为了将对象存储(或传输)到内存、数据库或文件中,把对象状态转化为一组字节的过程。换句话说:就是如何保存对象并恢复其状态以供后续使用。现在的游戏一般都离不开序列化,特别是一些大型游戏,因为游戏本身就非常大,每次版本更新就去重装一次显然不现实。而游戏系列化就能很好的解决这个矛盾,通过比对服务器上的文本数据来判断玩家是否需要更新。
实现
以之前写过的一个简单的打飞碟游戏为基础,实现将其的序列化
首先在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——游戏序列化相关推荐
- 《学Unity的猫》——第十八集:Unity3D游戏开发工程师笔试刷题,皮皮收到面试邀请
文章目录 18.1 皮皮收到面试邀请 18.2 面试题库相关网站 18.2.1 牛客网 18.2.2 领扣LintCode 18.2.3 力扣LeetCode 18.3 优质学习网站 18.3.1 菜 ...
- Unity3D游戏开发之网络游戏服务器架构设计培训
下面我们开始今天的Unity3D游戏开发技能培训. 我们专业培养"游戏主程",挑战20W年薪,初期学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改 ...
- Unity3D游戏开发之数据持久化PlayerPrefs的使用
unity3d提供了一个用于本地持久化保存与读取的类--PlayerPrefs.工作原理非常简单,以键值对的形式将数据保存在文件中,然后程序可以根据这个名称取出上次保存的数值. PlayerP ...
- Unity3D 游戏引擎之脚本实现模型的平移与旋转(六)
Unity3D 游戏引擎之脚本实现模型的平移与旋转 雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong.com/ar ...
- Unity3D游戏-愤怒的小鸟游戏源码和教程(二)
Unity愤怒的小鸟游戏教程(二) 本文提供全流程,中文翻译. Chinar坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) AngryEva游戏 ...
- android+Unity3D游戏开发之简单的物体运动
android+Unity3D游戏开发之简单的物体运动 其实这篇也是转载的,真的感觉对于我们初学者来说很不错的,不信你看看嘛;原创链接:http://bbs.9ria.com/thread-98192 ...
- Unity3D 游戏引擎之IOS高级界面发送消息与Unity3D消息的接收(九)
Unity3D 游戏引擎之IOS高级界面发送消息与Unity3D消息的接收 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289 ...
- 从一点儿不会开始——Unity3D游戏开发学习(一)
一些废话 我是一个windows phone.windows 8的忠实粉丝,也是一个开发者,开发数个windows phone应用和两个windows 8应用.对开发游戏一直抱有强烈兴趣和愿望,但奈何 ...
- Unity3D 游戏引擎之平面小球重力感应详解【转】
http://blog.csdn.net/xys289187120/article/details/6969333 手机重力感应应该对大多数开发者并不陌生,在新一代智能手机Android ...
最新文章
- 如何升级jdk_简述面试常见问题的锁升级与锁优化
- Object-C 打开工程,选择模拟起时,提示no scheme
- 生成android证书
- 支付宝支付系统繁忙,请稍后再试(ALI64)错误解决
- [合作赞助]九叔生日由中国移动、51cto、奇虎360以及一帆浩瀚联合举办
- 解决重启centos后resolv.conf总被清空的问题
- 教你如何用若依创建子模块详细教程
- 想要获得别人尊重,你必须得自己先牛逼起来
- 关于几款系统恢复常用工具的用法介绍
- Task04 Python操作PDF
- 质量数据分析工具软件的应用
- 安卓9安装xpose
- Android 长按Menu键的监听
- Youtube 评论数
- js获取当前时间并转换为一定的格式
- win7 dll怎么在xp运行_微信DLL劫持反弹shell复现
- python做值班表_如何用Python 实现自动排班
- 超链接的伪类及如何清除缓存
- 高一被清华姚班录取,高三委拒谷歌 offer,一个重度网瘾少年到理论计算机科学家的蜕变!...
- 为什么高斯白噪声的平均功率等于方差?
热门文章
- 全球域名后缀注册量排行榜!
- mysqlit根据稀有值随机选择_三中锋教练来过了!实况足球20赛季DP7.0后新增稀有阵型top10...
- Python实现文字转语音功能
- 【Unity】如何删除不要的Tile Palette(瓦片地图)(遇到新的问题就继续更新2021.4.29)
- 联想ghost重装系统_联想电脑怎么重装系统的方法
- 笔记本怎么用android,电脑上如何使用Android系统
- vba控制图表,excel图表,一键完成
- 网络基础知识之IP与子网掩码和网络地址
- 论文阅读:《A Wavenet For Speech Denoising》
- 寒冬中,这些行业正在爆发