进行本地数据存档和载入在游戏开发中非常常见,几乎任何一款游戏都需要这样的功能。

命名空间:

using System.IO;

主要用于引入File类以处理各类文件操作。

using System.Runtime.Serialization.Formatters.Binary;

用于对文件进行序列化与反序列化。

1.判断数据文件是否存在:

     static public bool HasGameSaveData(string fileName)
{
if (File.Exists(Application.persistentDataPath + "/" + fileName))
return true;
else
return false;
}

主要用到File.Exists(string filePath);方法

Application.persistentDataPath是相对路径,用于在不同的平台都能得到正确的路径

2.读(存档载入)

     static public GameSaveData saveData= new GameSaveData();

     static public void LoadGameSaveData(string fileName)
{
if (!HasGameSaveData(fileName))
{
NewGameSaveData(fileName);
}
else
{
BinaryFormatter bf = new BinaryFormatter();
FileStream file = File.Open(Application.persistentDataPath + "/" + fileName, FileMode.Open);
saveData = (GameSaveData)bf.Deserialize(file);
file.Close();
}
}

GameSaveData也就是游戏中要保存的某个数据类,这里就省略了

读取数据要先判断文件是否存在,没有就新建一个;NewGameSaveData(fileName);中初始化后一般会立马写入(如何写见后面)

读取的过程是将文件打开后反序列化为对应的类型,也就是将二进制文件转化为可直接处理的对象

如果用到了Easy Save插件,也可以这么读取:

     static public void LoadGameSaveData(string fileName,string fileKey,string filePassCode)
{
if (!HasGameSaveData(fileName))
{
NewGameSaveData(fileName);
}
else
{
var passCodeSet = new ES3Settings(ES3.EncryptionType.AES, filePassCode);//数据加密设置
saveData = ES3.Load<GameSaveData>(fileKey, Application.persistentDataPath + "/" + fileName, passCodeSet);
}
}

Easy Save可以很方便的给文件加密,这里用的第三个版本;其中filePassCode是文件解密的密码,它的后台用的是Rijndael算法

3.写(存档)

     static public void WriteGameSaveData(string fileName)
{
BinaryFormatter bf = new BinaryFormatter();
FileStream file = File.Create(Application.persistentDataPath + "/" + fileName);
bf.Serialize(file, saveData);
file.Close();
}

写入文件和读取比较类似,是将对象序列化为二进制文件流;一般一个数据对象在初始化结束后,会自动运行一次写操作,其余时候则根据玩家的交互必要的时候进行写入

同样的,Easy Save的版本如下:

     static public void WriteGameSaveData(string fileName,string fileKey,string filePassCode)
{
var passCodeSet = new ES3Settings(ES3.EncryptionType.AES, filePassCode);//设置加密
ES3.Save<GameSaveData>(fileKey, Application.persistentDataPath + "/" + fileName, passCodeSet);
}

对于同一个文件,读和写的fileName,fileKey,filePassCode应保持一致

4.移除

     static public void RemoveGameSaveData(string fileName)
{
if (HasGameSaveData(fileName))
{
File.Delete(Application.persistentDataPath + "/" + fileName);
}
}

Unity C# File类 本地数据保存和游戏存档的更多相关文章

  1. 使用File类、StreamRead和StreamWrite读写数据、以及Path类操作文件路径和Directory

    1.File类的概念: File类,是一个静态类,主要是来提供一些函数库用的.静态实用类,提供了很多静态的方法,支持对文件的基本操作,包括创建,拷贝,移动,删除和 打开一个文件. File类方法的参量 ...

  2. JAVA基础--JAVA 集合框架(泛型、file类)16

    一.集合总结 集合:Collection体系.Map体系. Collection体系:单列集合的共性操作规则. List:列表,可以重复,有下标,拥有特有的迭代器ListIterator. Array ...

  3. JAVA基础--JAVA 集合框架(泛型、file类)

    一.集合总结 集合:Collection体系.Map体系. Collection体系:单列集合的共性操作规则. List:列表,可以重复,有下标,拥有特有的迭代器ListIterator. Array ...

  4. 01.使用File类读写文件

    使用File类去读数据: 方法一:使用ReadAllBytes(); 方法 namespace _01.使用File类读写数据01 { class Program { static void Main ...

  5. unity 通过JsonUtility实现json数据的本地保存和读取

    本文主要讲解json数据在本地的保存和读取,使用的是unity5之后提供的JsonUtility工具. 一.关于json数据的保存 在实际开发中,有时候可能涉及到大量数据保存到本地,以便于下次客户端的 ...

  6. c# unity PlayerPrefs 游戏存档,直白点就是讲游戏数据本地保存下来

    在游戏会话中储存和访问游戏存档.这个是持久化数据储存,比如保存游戏记录. 我的理解是通过某个特殊的标签来保存在本地,而且该标签为key的意思,初始值不用赋值. 在游戏开发中较为实用. 暂时用到了 Se ...

  7. Unity本地数据存储---Sqlite和JSON

    2014-05-04更新 SqliteDatabase.cs这个文件的初始方法有问题,具体是如果指定URL已经存在了DB文件,就不会重新覆盖DB文件. 这导致我们修改之后的DB文件无法产生效果. 本人 ...

  8. 本地数据Store。Cookie,Session,Cache的理解。Timer类主要用于定时性、周期性任务 的触发。刷新Store,Panel

    本地数据Store var monthStore = Ext.create('Ext.data.Store', { storeId : 'monthStore', autoLoad : false, ...

  9. Swift - 本地数据的保存与加载(使用NSCoder将对象保存到.plist文件)

    下面通过一个例子将联系人数据保存到沙盒的“documents”目录中.(联系人是一个数组集合,内部为自定义对象). 功能如下: 1,点击“保存”将联系人存入userList.plist文件中 2,点击 ...

随机推荐

  1. Delphi - 操作Excel数据公式的实现

    procedure TF_SMP_FT_NEW.RzBitBtn_StartToChangeClick(Sender: TObject); var i, j, ni, nj, iRows, iCol, ...

  2. SpringBoot打可执行war包

    1. 主程序类: @SpringBootApplication public class Application extends SpringBootServletInitializer { @Ove ...

  3. python网络编程-2

    1.理解相关概念 #浅显理解下 对比cpu与io的差距如:io从硬盘读取一条数据9ms ,cpu在9ms可以做450万次指令 cpu切换上下文的方式:1.遇到io操作切换cpu 2.cpu时间片分配 ...

  4. js javascript 如何获取某个值在数组中的下标

    js 某个值在数组中的下标javascript中知道一个数组中的一个元素的值,如何获取数组下标JS 获取数组某个元素下标 函数方法 采用prototype原型实现方式,查找元素在数组中的索引值js查找 ...

  5. cent OS 7 安装谷歌浏览器

    我直接写一个shell 脚本,  install_google.sh,  bash 命令直接运行就好, 脚本内容如下: (切换root用户执行) set -e  # 出错即退出 echo " ...

  6. SQL行转列,列转行

    SQL 行转列,列转行 行列转换在做报表分析时还是经常会遇到的,今天就说一下如何实现行列转换吧. 行列转换就是如下图所示两种展示形式的互相转换 行转列 假如我们有下表: SELECT * FROM s ...

  7. ucoreOS_lab1 实验报告

    由于我个人不太懂 AT&T 语法,在完成实验的过程中遇到了相当大的阻碍,甚至有点怀疑人生,我是否心太大了,妄想在短时间内学懂大清的课程.ucoreOS_lab1 这个实验前前后后做到了现在才勉 ...

  8. 转:oracle 体系结构

    前几天面试的时候面试官才问过我ORACLE的体系结构,让我在一张白纸上画出来.回头想想当时答得还不错,大部分内容都描述出来了,呵呵,刚才在网上看到一篇讲解ORACLE体系结构的文章,觉得不错,转过来存 ...

  9. Django restframework 序列化之 ModelSerializer 小记

    首先介绍一下相关概念 序列化器(Serializer) 1. 自定义型:  继承rest_framework.serializers.Serializer 2. 模型类型:  继承rest_frame ...

  10. Linux创建高级用户并删除

    Linux创建高级用户并删除 常见window系统可以创建许多用户,但是linux也可以创建许多用户. 方法比window方便简单. (1)添加一个普通用户 :nangong(名字自己取) usera ...