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     }
  • 相关阅读:
    How to Use the UTL_MAIL Package
    ORA-32001: 已请求写入 SPFILE, 但是在启动时未指定 SPFILE
    2.4 批量下达车间任务平台
    2.3 改装及返修任务管理
    2.2 生产外协管理
    2.1 车间排产与生产备料
    1.15 计划分析-订单与预测差异比较
    1.14 计划分析-两周订单变更比较
    1.13 生产计划的调整与维护
    1.12 售后配件需求与计划生产衔接
  • 原文地址:https://www.cnblogs.com/koshio0219/p/11196547.html
Copyright © 2011-2022 走看看