我们在使用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. vs 2017 boost 安装目录 非安装

    linuxg++ -Wall -std=c++11 boost_socks5.cpp -o boost_socks5 -lboost_system -lboost_thread -lpthread m ...

  2. ios之UIWebView(2)

    UIWebView是iOS sdk中一个最常用的控件.是内置的浏览器控件,我们可以用它来浏览网页.打开文档等等.这篇文章我将使用这个控件,做一个简易的浏览器.如下图: 我们创建一个Window-bas ...

  3. React初识整理(五)--Redux和Flux(解决状态传递问题)

    Flux 1.引入:在React的应⽤中,状态管理是⼀个⾮常重要的⼯作.我们不会直接对DOM节点进⾏操作,⽽是通过将数据设置给state,由state来同步UI,这种⽅式有个潜在的问题,每个组件都有独 ...

  4. web安全--<a>标签带有target=“_blank”

    面试时遇到安全相关的一个题目 :超链接<a>标签带有target=“_blank”属性的,容易被利用进行诸如钓鱼等攻击,请问如何在书写代码时进行防范?(谷歌和火狐环境). 自己看到这道题目 ...

  5. Wannafly挑战赛23 A 字符串

    题目描述 小N现在有一个字符串S.他把这这个字符串的所有子串都挑了出来.一个S的子串T是合法的,当且仅当T中包含了所有的小写字母.小N希望知道所有的合法的S的子串中,长度最短是多少. 输入描述: 一行 ...

  6. Java面试——从JVM角度比较equals和==的区别

    1.  Java中数据类型分类 1.1    基本数据类型 又称为原始数据类型,byte,short,char,int,long,float,double,boolean,他们之间的比较应该使用(== ...

  7. python模块--random

    random主要用于生成随机字符串等,例如登录页面上随机字符串验证. random常用方法: import random print(random.randrange(1, 10)) # 返回1-10 ...

  8. 二分查找与 bisect 模块

    Python 的列表(list)内部实现是一个数组,也就是一个线性表.在列表中查找元素可以使用 list.index() 方法,其时间复杂度为O(n).对于大数据量,则可以用二分查找进行优化.二分查找 ...

  9. spring cloud 学习资源

    1.https://blog.csdn.net/column/details/17737.html 2.https://blog.csdn.net/column/details/15197.html? ...

  10. 数据库质疑或只有MDF文件资料

    --允许进行系统表的操作 use master declare @databasename varchar(255) set @databasename='Blwy BarCode' --1.如果用户 ...