Unity 3D 之通过序列化来存档游戏数据
我们在使用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 之通过序列化来存档游戏数据的更多相关文章
- 【Unity 3D】学习笔记29:游戏的例子——简单的小制作地图
无论学习.只看不练是坏科学. 因此,要总结回想这怎么生产MMROPG小地图的游戏.于MMROPG游戏类,在游戏世界中行走时导致各地,通常在屏幕的右上角,将有一个区域,以显示当前的游戏场景微缩.在游戏世 ...
- 《Unity 3D游戏客户端基础框架》概述
框架概述: 做了那么久的业务开发,也做了一年多的核心战斗开发,最近想着自己倒腾一套游戏框架,当然暂不涉及核心玩法类型和战斗框架,核心战斗的设计要根据具体的游戏类型而定制,这里只是一些通用的基础系统的框 ...
- Unity 3D 游戏上线之后的流水总结
原地址:http://tieba.baidu.com/p/2817057297?pn=1 首先.unity 灯光烘焙 :Unity 3D FBX模型导入.选项Model 不导入资源球.Rig 不导入骨 ...
- Unity 3d游戏逆向及.NET Reflector工具使用介绍
移动平台游戏框架主要有unity 3d和cocos 2d.我们首先得识别游戏使用的框架.识别Unity游戏Android平台的apk包可以直接解压,看是否有./assets/bin/Data/Mana ...
- Unity 3D游戏开发学习路线(方法篇)
Unity 3D本来是由德国的一些苹果粉丝开发的一款游戏引擎,一直只能用于Mac平台,所以一直不被业外人士所知晓.但是后来也推出了2.5版,同时发布了PC版本,并将其发布方向拓展到手持移动设备.Uni ...
- 使用 Unity 3D 开发游戏的架构设计难点
Unity 3D 引擎对于开发者来说,入手非常快,因为它采用的是 C# 作为开发语言,这也大大降低了开发者的门槛.但凡只要懂一门编程语言的人都能使用 Unity 3D 引擎开发,另外 Unity 3D ...
- Unity 3D还原Scene场景、市面多数游戏视角高度自定义、第三人称视角分离功能:平移、拖动、看向中心等
Unity视角的高度自定义 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...
- Unity 3D网络游戏实战 pdf
Unity 3D网络游戏实战(全) 目录: 掌握Unity3D基本元素 1.1 简单的游戏 1.1.1在场景中创建一个立方体 1.1.2编写可以使立方体运动的程序 1.1.3测试游戏1.1.4总结1. ...
- C#程序员整理的Unity 3D笔记(十三):Unity 3D基于组件的思想
如果你接触过<设计模式>.软件架构的编程思想,就会知道优秀的设计准则:“组合优于继承的”. 这句话很简短,但开始学习OOP的时候,真切的是—-不太好理解(以我个人当初学习为例). OOP的 ...
随机推荐
- common-fileupload上传文件
文件上传在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件上传功 ...
- shell脚本,在指定目录下通过随机小写10个字母加固定字符串oldboy批量创建10个html文件。
[root@localhost wyb]# cat test10.sh #!/bin/bash #使用for循环在/test10目录下通过随机小写10个字母加固定字符串oldboy批量创建10个htm ...
- json 将key值以字符串形式取出
int GetJsonCString(const Json::Value& value, char* str, int n){ if (!value.empty() && va ...
- RN与现有的原生app集成
https://facebook.github.io/react-native/docs/integration-with-existing-apps.html RN可以很好地支持往一个原生的app上 ...
- Cocos2D 添加 UIView
cocos2d是使用继承于ccnode的结点类型的层.但是我想用一个opengl来绘制,就简单的情况来说必须得加一个uiview.现转载如下: 第一部分:: 使用Cocos2D开发游戏和应用程序的时候 ...
- POJ-1061 青蛙的约会 (扩展欧几里得)
[题目描述] 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有 ...
- EFCore CodeFirst模型迁移生成数据库备注(mysql)
重写Mysql下sql脚本生成器 using Framework.NetCore.Extensions; using Framework.NetCore.Models; using Microsoft ...
- Python flask+css+js+ajax 综合复习
flask 基本语法结构 注:这里练习的时候把装饰器的@给忘记了,导致访问404 下面练习一下在前段向后端传递参数 get请求需要用 request.args.get('变量') 去接收, get ...
- luogu2483 【模板】k短路([SDOI2010]魔法猪学院)
模板题 #include <iostream> #include <cstring> #include <cstdio> #include <queue> ...
- Jmeter接口测试-简单分析结果数、聚合报告以及图形结果(二)
简单分析结果数.聚合报告以及图形结果 结果树 取样器结果:返回值报200,表示执行接口调试成功 请求:发送的数据 响应数据:返回的数据 Thread Name:线程组名称 Sample Start: ...