zoukankan      html  css  js  c++  java
  • Unity C# File类 本地数据保存和游戏存档

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

    命名空间:

    using System.IO;

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

    using System.Runtime.Serialization.Formatters.Binary;

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

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

    1     static public bool HasGameSaveData(string fileName)
    2     {
    3         if (File.Exists(Application.persistentDataPath + "/" + fileName))
    4             return true;
    5         else
    6             return false;
    7     }

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

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

    2.读(存档载入)

     1     static public GameSaveData saveData= new GameSaveData();
     2 
     3     static public void LoadGameSaveData(string fileName)
     4     {
     5         if (!HasGameSaveData(fileName))
     6         {
     7             NewGameSaveData(fileName);
     8         }
     9         else
    10         {
    11             BinaryFormatter bf = new BinaryFormatter();
    12             FileStream file = File.Open(Application.persistentDataPath + "/" + fileName, FileMode.Open);
    13             saveData = (GameSaveData)bf.Deserialize(file);
    14             file.Close();
    15         }
    16     }

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

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

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

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

     1     static public void LoadGameSaveData(string fileName,string fileKey,string filePassCode)
     2     {
     3         if (!HasGameSaveData(fileName))
     4         {
     5             NewGameSaveData(fileName);
     6         }
     7         else
     8         {
     9             var passCodeSet = new ES3Settings(ES3.EncryptionType.AES, filePassCode);//数据加密设置
    10             saveData = ES3.Load<GameSaveData>(fileKey, Application.persistentDataPath + "/" + fileName, passCodeSet);
    11         }
    12     }

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

    3.写(存档)

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

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

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

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

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

    4.移除

    1     static public void RemoveGameSaveData(string fileName)
    2     {
    3         if (HasGameSaveData(fileName))
    4         {
    5             File.Delete(Application.persistentDataPath + "/" + fileName);
    6         }
    7     }
  • 相关阅读:
    Mathematica查看内部定义
    Mathematica绘制曲面交线方法
    Mathematica新特性Inactive, 求解复杂微分方程
    Mathematica修改默认字体
    Mac系统下lipo, ar, nm等工具的使用简介
    centos8 安装php7.2以及php-fpm
    mysql8.0创建用户只能访问某一个数据库
    CentOS 7 yum安装 RabbitMQ
    Linux服务器PHP+MYSQL环境配置优化提升网站运行效率
    PHP 7.1安装xhprof进行性能分析
  • 原文地址:https://www.cnblogs.com/koshio0219/p/11196547.html
Copyright © 2011-2022 走看看