飞碟游戏-序列化

原创 2016年05月30日 13:51:21

一、序列化

        什么是序列化呢?序列化就是把一个内存对象变为与地址无关的可传输的数据格式,通常是文本格式;反序列化反之。更通俗一点说,就是把游戏运行时保存在内存中的对象或数据输出为文本,如json等;反序列化就是把这些文本重新转换为内存中对象的数据。像本次飞碟的序列化,就是把每个关卡中飞碟的颜色,大小,发射位置和方向等等数据,转换为json文件保存在根文件夹的Data目录中,每次游戏启动都会读取序列文本,将读取到的数据作为初始化飞碟的函数的参数。现在许多大型的游戏如LOL,更新周期短,每次更新时要更新代码是不可能的,他们每次更新的是资源而不是程序,生成的exe文件是不会改变的,更改的只是json之类的文本文件。在一个类前面加上[SerializeField]说明这个类是可序列化的,也就是要和文本文件打交道的。

二、具体过程

     首先,在Assets目录下新建Data文件夹,在Data文件夹下新建disk_level_1、disk_level_2、disk_level_3保存三个关卡的具体文本,新建game_info保存游戏版本信息,具体如下:

   

       原先的飞碟版本中,游戏信息在Basecode.cs文件中,现在不需要这些内容了,删除。

   

    更改后Basecode类为空

   

    在Basecode.cs中添加两个新类

     

      然后,需要有一个负责文件读取的类,将json文件的信息读取进来并返回读到的 json 字符串,同样在游戏进行过程中读取游戏关卡文件,返回读到的 json 字符串。将新添加的FileManager.cs挂到主摄像机上。下面是代码:

using UnityEngine;
using System.Collections;
using Com.Mygame;

public class FileManager : MonoBehaviour
{
    public string url;
    SceneController scene = SceneController.getInstance();

    void Awake()
    {
        scene.setFileManager(this);    //  注册到场景控制器
        LoadGameInfoJson("game_info.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);
            else
                scene.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);
            else
                scene.stageGameInfo(www.text.ToString());   // 返回json字符串给scene
        }
    }
}
    由于需要将FileManager注册到场景控制器,在SceneController中添加相应注册函数

   

    场景控制器中,用到stageLevel函数(返回json字符串给scene)、stageGameInfo函数(返回json字符串给scene),完善它。

   

    同时需要在SceneController中添加两个私有变量来保存版本信息以及保存总关卡数

   

    由于游戏的关卡是游戏过程中读取的,所以修改SceneController的 nextRound() 方法:

    这是修改前的

    修改后的

    接着,修改SceneController的接口方便UI的使用,如下:

   

    FileManager执行LoadGameInfoJson函数读取指定位置文件的内容传给场景控制器的stageGameInfo,在stageGameInfo完成json对象的序列化。在游戏关卡执行下一关的函数nextRound()的时候会执行loadLevelJson,把读到的字符串转换为实例对象,然后通过GameModel的setting方法初始化关卡设置,下一次发射就是新的关卡了。

    最后,修改UserInterface.cs文件:

   

   

    在游戏场景里新建一个Text命名为Version,并拖到UserInterface.cs中的versionText:

   

这样,飞碟游戏的序列化已经完成了,以后想修改游戏的关卡难度系数等等就只需要编辑json文本就好了。

这是游戏界面,看起来确实与未序列化没差别偷笑


这是飞碟游戏原先版本代码:负责任链接

这是序列化后代码:不负责任链接

版权声明:本文为博主原创文章,未经博主允许不得转载。

游戏表格数据序列化自动生成工具

大家都知道,数据的持久化保存一般是以二进制形式保存。常用的数据序列化协议有 google的protobuf ,json,Serializab。现在很多游戏开发都是用的是google的protobuf ...

《从零开始搭建游戏服务器》 java与C#的protobuf序列化不兼容

引言:今天在联调Java服务器与Unity(C#编写)的客户端的网络协议数据,由于网络通信的核心数据是通过序列化之后的字节数组经过加密和压缩的结果,但是发现两者使用Protobuf协议序列化工具出来的...

在unity中序列化储存游戏元素

由于unity在运行时只能动态加载Resources目录下的文件,但是在有的情况下一些资源不能直接放在Resources目录下(比如UGUI的需要打包的散图)。如果需要动态加载在Resources目录...

Unity3D游戏序列化以及新版本发布

序列化技术

Unity3D——游戏序列化

说在前面     序列化是为了将对象存储(或传输)到内存、数据库或文件中,把对象状态转化为一组字节的过程。换句话说:就是如何保存对象并恢复其状态以供后续使用。现在的游戏一般都离不开序列化,特别是一些...
  • zhaokx3
  • zhaokx3
  • 2016年05月28日 19:05
  • 1432

游戏引擎C++反射和序列化方案心得

凡是上了点规模的游戏引擎,都需要面对C++反射和序列化的问题。反射和序列化对游戏引擎非常重要,因为在游戏里,需要处理大量的数据和对象,数据驱动的编程模式是非常普遍的。比如对于World Editor,...
  • viX0026
  • viX0026
  • 2017年01月12日 19:25
  • 190

Unity3D-游戏序列化

序列化 就是把一个内存对象变为与地址无关的可传输的数据格式,通常是文本格式;反序列化反之。一般情况下,对象序列化指把一个对象用 XML,YAML 或 json 文本表示。 尽管 Unity 场景文件是...
  • Ro_Jack
  • Ro_Jack
  • 2016年05月22日 18:36
  • 769

(NO.00005)iOS实现炸弹人游戏(七):游戏数据的序列化表示

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 用plist列表文件来表示游戏数据因为在这个炸弹人游戏中有...
  • mydo
  • mydo
  • 2015年12月24日 15:39
  • 1517

MessagePack序列化实例代码

  • 2017年12月02日 11:35
  • 7.64MB
  • 下载

Java中序列化Json的jar包

  • 2017年11月13日 14:54
  • 256KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:飞碟游戏-序列化
举报原因:
原因补充:

(最多只允许输入30个字)