我们在使用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. 函数的参数是函数,函数中Ajax返回的回调函数中的函数运行

    调用函数 checkAjax('addrinfo',formdata,vzxcv); 函数checkAjax function checkAjax(url,formdata,call_back){ / ...

  2. MySql的基操勿六

    2018/12/6 星期四 19:34:07 authot by dabaine 数据库注释; -- 这就是注释 /*.....*/ 这也是注释 创建库; create databse [if not ...

  3. MySQL丨01丨数据库基本概念

    以前记录数据可能很少也很简单,比如说老王借了老李半斤肉,这样的数据老李直接就写到墙上就行了. 后来数据多了人们就以表格的方式开始记录,写到一张A4纸上,比如学生的档案,有表头和序号等. 表头里有姓名. ...

  4. (54)zabbix链接及解除模板链接

    上一节就已经涉及到了链接与解除模板链接(link与unlink),这篇文章除了说明怎么链接模板以外,还会特别讲到一些需要特别注意的细节. HOST链接模板之后,便继承了模板里定义的item,trigg ...

  5. https原理解读

    参考:架构师必读!以图文的方式解锁 HTTPS原理,10分钟还原HTTPS真像! 对于消息安全的定义是:即使消息被中间人拦截到,中间人也没办法解读出其中的消息. 对称加密 要实现消息安全,首先想到的是 ...

  6. 【linux】【网络安全】linux中怎样关闭ICMP回应功能

    引用自:http://blog.csdn.net/qq844352155/article/details/49700121       linux中怎样关闭ICMP回应功能   输入:   echo ...

  7. Scrapy实战-新浪网分类资讯爬虫

    项目要求: 爬取新浪网导航页所有下所有大类.小类.小类里的子链接,以及子链接页面的新闻内容. 什么是Scrapy框架: Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应 ...

  8. Python 模块和包的概念

    模块&包(* * * * *) 模块(modue)的概念: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函 ...

  9. PAT Basic 1063

    1063 计算谱半径 在数学中,矩阵的“谱半径”是指其特征值的模集合的上确界.换言之,对于给定的 n 个复数空间的特征值 { a​1​​+b​1​​i,⋯,a​n​​+b​n​​i },它们的模为实部 ...

  10. DocView mode 3 -- 配置

    ;在当前页中滚动doc-view-continuous nil ;指定默认的字体大小doc-view-resolution ;gs生成的缓存的目录doc-view-cache-directory