我们在使用u3d开发一些单机游戏的过程中,都会涉及到游戏数据的存单和加载。一般情况下,如果存储的数据不复杂,我们就可以用PlayerPrefs,但有时涉及到的数据更加复杂,使用PlayerPrefs难于应付,所以可以选择使用序列化的方式实现对游戏数据的存档。以下我通过小案列来实现加载数据和存档数据。

首先,我们先来建立一个脚本,这个脚本是游戏数据的载体,可以用来序列化。代码如下:

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine; [System.Serializable]
public class Gamedata
{
// 三个游戏数据
public int data1;
public string data2;
public bool data3; // 单例模式
private Gamedata()
{
data1=; // 分值
data2 = "林洛殇"; // 昵称
data3 = true; // 是否获得【埃及宝石】
}
// 对象
private static Gamedata gamedata;
//接口1
public static Gamedata GetGamedataInstance()
{
if (gamedata == null )
{
gamedata=new Gamedata();
}
return gamedata;
}
//接口2
public static void SetGamedataInstance (BinaryFormatter bf,FileStream fs)
{
gamedata = (Gamedata) bf.Deserialize(fs);
}
}

下一个是用来保存、加载游戏数据和在面板上显示游戏数据。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Net;
using UnityEngine;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine.UI; public class Gamedatasava_load : MonoBehaviour
{
public Text data1;
public Text data2;
public Text data3;
private string datapath;
void Start()
{
DontDestroyOnLoad(this);
Setpath(); // 根据平台设置路径
Loaddata(); //加载数据
}
void Update()
{
if (Input.GetMouseButtonDown())
{
Gamedata.GetGamedataInstance().data1++;
} if (Input.GetMouseButtonDown())
{
Gamedata.GetGamedataInstance().data3 = !Gamedata.GetGamedataInstance().data3;
} if (Input.GetMouseButtonDown())
{
Gamedata.GetGamedataInstance().data2 += "洛";
}
}
/// <summary>
/// 将数据加载到面板上
/// </summary>
public void OnGUI()
{
data1.text = ""+Gamedata.GetGamedataInstance().data1;
data2.text = ""+Gamedata.GetGamedataInstance().data2;
data3.text = ""+Gamedata.GetGamedataInstance().data3;
}
/// <summary>
/// 保存游戏数据
/// </summary>
public void Savadata()
{
BinaryFormatter bf=new BinaryFormatter();
if (File.Exists(datapath))
{
File.Delete(datapath);
}
FileStream fs=new FileStream(datapath,FileMode.Create);
bf.Serialize(fs,Gamedata.GetGamedataInstance());
fs.Close();
}
/// <summary>
/// 加载游戏数据
/// </summary>
public void Loaddata()
{
// 判断路径上是否有文件
if (File.Exists(datapath))
{
BinaryFormatter bf=new BinaryFormatter();
FileStream fs=new FileStream(datapath ,FileMode.Open);
Gamedata.SetGamedataInstance(bf,fs);
fs.Close();
}
}
void Setpath()
{
if (Application.platform == RuntimePlatform.Android)
{
datapath = Application.persistentDataPath + "/Gamedata.gb";
} if (Application.platform == RuntimePlatform.WindowsEditor)
{
datapath = Application.streamingAssetsPath + "/Gamedata.gb";
}
}
private void OnDestroy()
{
Savadata();
}
}

最后一个是用来挂载在按钮上,用于退出游戏,相当简单。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class Quit : MonoBehaviour
{
public void Click ()
{
Application.Quit();
}
}

接下来我们来看看文件结构(因为涉及到加载路径)

运行效果:

手机端的显示效果也一样,都可以实现游戏数据的存储和加载。

对于这次的文章,写的很简单,不够详细,多多见谅。

Unity 3D 之通过序列化来存档游戏数据的更多相关文章

  1. 【Unity 3D】学习笔记29:游戏的例子——简单的小制作地图

    无论学习.只看不练是坏科学. 因此,要总结回想这怎么生产MMROPG小地图的游戏.于MMROPG游戏类,在游戏世界中行走时导致各地,通常在屏幕的右上角,将有一个区域,以显示当前的游戏场景微缩.在游戏世 ...

  2. 《Unity 3D游戏客户端基础框架》概述

    框架概述: 做了那么久的业务开发,也做了一年多的核心战斗开发,最近想着自己倒腾一套游戏框架,当然暂不涉及核心玩法类型和战斗框架,核心战斗的设计要根据具体的游戏类型而定制,这里只是一些通用的基础系统的框 ...

  3. Unity 3D 游戏上线之后的流水总结

    原地址:http://tieba.baidu.com/p/2817057297?pn=1 首先.unity 灯光烘焙 :Unity 3D FBX模型导入.选项Model 不导入资源球.Rig 不导入骨 ...

  4. Unity 3d游戏逆向及.NET Reflector工具使用介绍

    移动平台游戏框架主要有unity 3d和cocos 2d.我们首先得识别游戏使用的框架.识别Unity游戏Android平台的apk包可以直接解压,看是否有./assets/bin/Data/Mana ...

  5. Unity 3D游戏开发学习路线(方法篇)

    Unity 3D本来是由德国的一些苹果粉丝开发的一款游戏引擎,一直只能用于Mac平台,所以一直不被业外人士所知晓.但是后来也推出了2.5版,同时发布了PC版本,并将其发布方向拓展到手持移动设备.Uni ...

  6. 使用 Unity 3D 开发游戏的架构设计难点

    Unity 3D 引擎对于开发者来说,入手非常快,因为它采用的是 C# 作为开发语言,这也大大降低了开发者的门槛.但凡只要懂一门编程语言的人都能使用 Unity 3D 引擎开发,另外 Unity 3D ...

  7. Unity 3D还原Scene场景、市面多数游戏视角高度自定义、第三人称视角分离功能:平移、拖动、看向中心等

    Unity视角的高度自定义 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...

  8. Unity 3D网络游戏实战 pdf

    Unity 3D网络游戏实战(全) 目录: 掌握Unity3D基本元素 1.1 简单的游戏 1.1.1在场景中创建一个立方体 1.1.2编写可以使立方体运动的程序 1.1.3测试游戏1.1.4总结1. ...

  9. C#程序员整理的Unity 3D笔记(十三):Unity 3D基于组件的思想

    如果你接触过<设计模式>.软件架构的编程思想,就会知道优秀的设计准则:“组合优于继承的”. 这句话很简短,但开始学习OOP的时候,真切的是—-不太好理解(以我个人当初学习为例). OOP的 ...

随机推荐

  1. QT5:先导篇 全局定义

    一.简介 <QtGlobal>头文件包含了Qt类库的一些全局定义,包含基本数据类型 函数和宏 二.全局变量定义 <QtGlobal>定义的数据类型: Qt数据类型        ...

  2. plsql循环的简单实例

    declare v_id tbl_regions.regions_id%type; begin .. loop select t.regions_id into v_id from tbl_regio ...

  3. python-DB模块实例

    MySQLdb其实有点像php或asp中连接数据库的一个模式了,只是MySQLdb是针对mysql连接了接口,我们可以在python中连接MySQLdb来实现数据的各种操作. python连接mysq ...

  4. PHP 递归无限极下级

    下面是自己用到的一些递归方法,当然都是借鉴的,各位看官请勿怪 第一种 有层级 $array = array( array('id' => 1, 'pid' => 0, 'n' => ...

  5. ios开发--常用的高效开发的宏

    本次在做项目的时候使用了下面的一些宏定义 以及 建立宏定义的一些规则.虽然只用了其中的一点点,但是还是极大的提高了开发效率.. 将这些宏放到一个头文件里然后再放到工程中,在需要使用这些宏定义的地方体检 ...

  6. C# 使用Epplus导出Excel [1]:导出固定列数据

    C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...

  7. 文件读写FILE类

    1. 新建一个文件: FILE *f = fopen("a.txt","w+"); (1)fopen()函数介绍fopen的原型是:FILE *fopen(co ...

  8. centos7中将python2.7.5版本升级到3.x版本

    一.安装gcc源码编译器 yum -y install gcc gcc-c++ pcre-devel zlib-devel openssl-devel 二.下载python软件包 wget https ...

  9. 编写testplan

    编写验证计划是验证工作核心技能.衡量标准是完备性.可是写一个完备的验证计划,才开始不是一件容易的事情,需要不断的练习实践. 1.验证计划主要从设计的futurelist中提取.     复杂的futu ...

  10. perl5中锚位修饰符\A \z \Z 和perl4中^(开头)和$(结尾)的区别

    习惯使用perl4的开发者总是用^表示字符串开头锚位,用$表示字符串结尾锚位,比如\^https://\ 将会匹配所有以https://开头的字符串,同样,\.bmp$\将会匹配所有以.bmp结尾的字 ...