【第22期】观点:IT 行业加班,到底有没有价值?

飞碟游戏-序列化

原创 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文本就好了。

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


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

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

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

相关文章推荐

游戏配置序列化

游戏中提供很多可供配置的设置,有利用适应多种不同的硬件配置,也有利于适应用不同玩家的操作习惯.如果每次进游戏的话都要重设一次,这显然就失去了配置的意义,不如用一个适用范围比较广的默认值算了.所以,配置...

Flash游戏制作--打飞碟

射击类游戏不仅在各种平台的游戏中占有重要地位,在Flash游戏中也占有数量上的绝对优势,不少朋友喜欢将学习Flash射击游戏的制作作为学习Flash游戏制作的开始,又因为射击游戏可根据作者自己水平的不同,可难可易,较易掌握,所以Flash射击游戏的制作成为Flash游戏的一大热点,这次我们就来学习一...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

游戏配置序列化

游戏中提供很多可供配置的设置,有利用适应多种不同的硬件配置,也有利于适应用不同玩家的操作习惯.如果每次进游戏的话都要重设一次,这显然就失去了配置的意义,不如用一个适用范围比较广的默认值算了. 所以,配置需要保存. windows中就有众多的的ini文件,还有一些软件会把信息存入注册表.但是,当配...

关于Unity游戏的序列化

上课的时候讲到了用Unity制作游戏的序列化, 那么什么是序列化呢? 序列化就是将游戏里面的数据写进文件里, 包括角色的生命, 攻击, 防御等等. 这样当游戏需要调整时 (比如平衡性问题),...

J2ME实战:蓝牙联网俄罗斯方块(4)—数据传输序列化与游戏地图存储模块( 未完待续。。。)

1.数据传输序列化模块(Serialization接口) 在游戏的过程中需要将地图数据传输到远端玩家的手机上,故需进行数据的序列化和反序列化,因此我们这里定义了Serialization接口。   <span style='font-siz
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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