我们在使用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. Android 使用 adb命令 远程安装apk

    Android 使用 adb命令 远程安装apk ./adb devices 列出所有设备 ./adb connect 192.168.1.89 连接到该设备 ./adb logcat 启动logca ...

  2. CAP 可用性理解

    从容灾角度看可用性. 多机同时返回. 主通过 heart-beat 脑裂. 用 paxos. 性能远距离. 对整体压力较大. 从用户体验的角度看单数据可用性: 不考虑城市灾备的情况发生.只有单机房的 ...

  3. redhat7.3建两个网桥导致mac地址不一致解决办法

    将网卡配置文件中加入下面一行参数 NM_CONTROLLED=no

  4. STL 之 vector的应用

    关于vector vector是C++提供的一个容器,它是一个能够存放任意类型的动态数组,可以随时增加和压缩数据. 使用vector时需要注意以下几点: 1. 如果要表示的向量长度较长(需要为向量内部 ...

  5. CentOS6、7安装MySQL5.7全教程

    CentOS6.7安装MySQL5.7全教程 做开发总得用到数据吧,Linux作为服务器,总得有一个数据库来存储测试用的数据,所以呢,这里附上CentOS6.7安装MySQL5.7的教程喔~ 用到的工 ...

  6. [译]The Python Tutorial#9. Classes

    写在前面 本篇文章是<The Python Tutorial>(3.6.1),第九章,类的译文. 9. Classes 与其他编程语言相比,Python的类机制定义类时,最小化了新的语法和 ...

  7. 剑指Offer(书):对称的二叉树

    题目:请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. boolean isSymmetrical(TreeNode pRoot) { r ...

  8. 笛卡尔&小雷:科学发展有规律,研究科学有方法

    一直在总结自己的学习和研究方法,最近在读吴军写的<文明之光> ,感觉这篇介绍笛卡尔的内容非常有价值,特此整理.最近开始在密谋自己的理论体系,低调实施中...  笛卡尔按照感知的方式,把人的 ...

  9. skkyk:线段树浅谈

    推荐前辈学姐博客文章,写的很细 https://www.cnblogs.com/TheRoadToTheGold/p/6254255.html 学学半,此随笔主要是加深自己对线段树的理解 题目:洛谷P ...

  10. sql存储过程打印图形

    print '三角形' declare @a int set @a=1 while(@a<10) begin print replace(space(@a),' ','*') set @a=@a ...