飞碟游戏-序列化

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

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


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

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

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

简单打飞碟游戏

一、鼠标点击小游戏         在写简单飞碟游戏之前,先写一个鼠标点击的小游戏热热身:游戏场景中会随机出现小圆圈,鼠标点击后,圆圈3秒后自动消失。      (1).  首先,创建Terrai...
  • pnxldzw
  • pnxldzw
  • 2016年05月30日 15:36
  • 674

Unity3D学习笔记(6)—— 飞碟射击游戏

游戏规则:          游戏分多个回合,每个回合有N个飞碟,玩家按空格后,321倒数3秒,飞碟飞出,点击鼠标,子弹飞出。飞碟落地或被击中,则准备下一次射击。每回合飞碟的大小、颜色、发射位置、发射...
  • Simba_Scorpio
  • Simba_Scorpio
  • 2016年04月03日 20:43
  • 3387

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

序列化技术
  • datealive
  • datealive
  • 2016年06月05日 20:45
  • 1008

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

大家都知道,数据的持久化保存一般是以二进制形式保存。常用的数据序列化协议有 google的protobuf ,json,Serializab。现在很多游戏开发都是用的是google的protobuf ...
  • u011657408
  • u011657408
  • 2016年06月01日 13:38
  • 956

打飞碟游戏

今天我们做一个简单的飞碟游戏有了上一章点击地面出现攻击目标而引出的单例模式,这一次的游戏可以很好设计出来。这个游戏中的主要角色有 飞碟:最基本的要素,就是一个ganmeobject 游戏场景:作为游戏...
  • WSQPoison
  • WSQPoison
  • 2017年03月24日 22:44
  • 265

Unity3D学习:飞碟游戏进化版

飞碟游戏改进版
  • KingsonYing
  • KingsonYing
  • 2017年04月07日 11:45
  • 254

Unity资源,对象和序列化

本文将从Unity编辑器和运行时两个角度出发,主要探讨以下两方面内容:Unity序列化系统内部细节以及Unity如何维护不同对象之间的强引用。译注:除非特别说明,下文中所有的“资源”均指代“Asset...
  • zww_liittle_boy
  • zww_liittle_boy
  • 2016年09月01日 09:53
  • 147

Unity3D 从入门到放弃(四)----打飞碟

Unity3D 从入门到放弃(五)—–打飞碟填坑计划的万恶之源 写在开头: 本来感觉应该是不会写博客的,而且也不是很擅长写 博客。但在后来,突然醒悟到,博客这个东西,实际上并不是给别人看的(...
  • MyCodecOdecoDecodE
  • MyCodecOdecoDecodE
  • 2017年03月23日 14:15
  • 349

关于Unity游戏的序列化

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

Unity3D学习笔记(10)—— 游戏序列化

这期内容有关游戏的序列化,什么是序列化呢?额...就是游戏的内容可以输出成文本格式,或者游戏的内容可以从文本中解析获得。现在的游戏几乎离不开序列化,只要有存档机制的游戏必然会序列化,并且游戏的每次启动...
  • Simba_Scorpio
  • Simba_Scorpio
  • 2016年05月21日 18:30
  • 1447
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:飞碟游戏-序列化
举报原因:
原因补充:

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