[Unity]Saving

脱离UnityAPI实现存档功能。

一.分析

基于接口设计,易于扩展

1. 类图

  • SaveMgr

    持有有一个任务队列。负责将ASave、ISaveTarget传给SaveTask构造实例化,发起任务。

    以下为NewTask方法,NewLoadTask、NewSaveTask等方法就是对此方法的封装。

    private static void NewTask (SaveTask.Type type, ASave save, ISaveTarget target) {var task = new SaveTask () {type = type,save = save,target = target,};switch (type) {case SaveTask.Type.Save:task.exception = save.ToBytes (out task.data);break;default:task.data = null;task.exception = null;break;}m_SaveTasks.Enqueue (task);if (m_SaveTasks.Count == 1) BeginTask ();}
    
  • SaveTask

    持有ASave、ISaveTarget的引用。data储存临时数据。

    public class SaveTask {public enum Type {Load,Save,Delete}public Type type;public ASave save;public ISaveTarget target;public byte[] data;public Exception exception;public bool IsSuccess { get { return exception == null; } }
    }
    
  • FileSaveTarget

    FileSaveTarget为ISaveTarget接口的一种实现,用于文件类型读写。

    • 构造函数,处理文件路径。

      public FileSaveTarget (string fileName) {m_FullPath = string.Format ("{0}/{1}", UnityEngine.Application.persistentDataPath, fileName);int firstSlash = m_FullPath.IndexOf ('/');int lastSlash = m_FullPath.LastIndexOf ('/');if (firstSlash != lastSlash) m_FullDir = m_FullPath.Substring (0, lastSlash);UnityEngine.Debug.Log (m_FullPath);
      }
      
    • ReadAsync,异步读取方法。WriteAsync、DeleteAsync方法也是类似的处理方式。

          void ISaveTarget.ReadAsync (SaveTask task) {// 在Unity主线程上进行同步。GameEntry.OnUpdate += ProcessMainTrhead;// 使用线程池开启子线程。ThreadPool.QueueUserWorkItem (BackgroundThreadProcess);void BackgroundThreadProcess (object state) {try {using (var fs = new FileStream (m_FullPath, FileMode.Open, FileAccess.Read)) {task.data = new byte[fs.Length];fs.Read (task.data, 0, task.data.Length);}} catch (System.Exception e) {task.exception = e;}// 同步状态m_Finished = true;}}// 主线程同步方法,在Unity Update中进行同步private void ProcessMainTrhead () {if (m_Finished) {m_Finished = false;GameEntry.OnUpdate -= ProcessMainTrhead;SaveMgr.EndTask();}}
      

2.操作

  • 存档

    ASave准备储存数据,SaveMgr发起SaveTask,将任务丢进队列,ASave(ToBytes方法)预处理数据,IBinarySavable接口处理字节流,ITextSavable接口处理文本,完成后,调用ISaveTarget异步执行任务,写入目标文件。

  • 读取

    SaveMgr发起任务,调用ISaveTarget异步读取文件,完成后,ASave(FromBytes方法)预处理数据,二进制文件调用IBinarySavable接口读取,文本文件调用ITextSavable接口读取。

  • 删除

    删除操作最简单,只需给ISaveTarget一个目标文件地址,即可删除。

    注:ASave <|- BinarySavableColiection TextSavableCollection

二.说明

使用Unity的Application.persistentDataPath路径存放文件,此路径可读可写,支持Android、PC。

  • Text文件储存游戏配置文件,比如音效大小、图形参数等设置。

  • 二进制文件储存游戏数据。

    由于是二进制读写,文件的写入顺序一定要与读取顺序一致,否则会出现数据错乱。

    使用数据包头,储存数组元素,通过嵌套类型,实现更加复杂的数据结构。

案例:https://github.com/Sarofc/UnityTools

参考:https://github.com/yuyang9119/UnityExtensions

[Unity]存档功能相关推荐

  1. unity 存档插件_【Unity消息】5月1日到5月15日 Unity资源商店大促

    5月1日到5月15日,Unity资源商店5月大促,几百款资源5折,而且每天有一款资源打3折~ 而且Unity资源商店又改版啦,新版好好看呀~ Unity资源5月大促地址:Unity Asset Sto ...

  2. 部署及配置Lync Server 2013存档功能

    在前面我们已经做了不少功能,Lync Server拓扑已经逐渐的完整,但仍然还有一些空白,比如存档和监控功能.虽然Lync Server 2013的存档和监控已经不再是单个角色,但是我们仍然需要对其进 ...

  3. 谷歌相册_Google相册中的新存档功能是什么?

    谷歌相册 If you're a Google Photos user, you've may have seen a new feature called "Archive" s ...

  4. 企业微信会话存档功能的推出背景,版本,部署方式

    会话存档推出的背景 会话存档最开始推出的使用对象为金融企业,金融从业人员的工作沟通合规监管日趋严格,2018年1月,"一行三会"联合发布<关于规范债券市场参与者债券交易业务的 ...

  5. [Unity存档系统]简单介绍Unity常见存档系统二JSON以及使用方法

    学习目标: 如果你和我同样苦恼于游戏相关的数据怎么存储与读取,那么不妨看看这个up主有关Unity存档系统的教程.[Unity] 存档系统 Part 1 | PlayerPrefs | Unity初学 ...

  6. 企业微信会话存档功能开启

    企业微信会话存档功能是企业微信所开发的,可以获取存档员工的工作聊天记录,包括文字.图片.语音.撤回消息等内容,用来保障客户服务质量.提高内部协作效率和监管合规. 企业如果想使用会话存档功能,首先需要管 ...

  7. Unity 工具栏功能介绍

    Unity 工具栏功能介绍 题外话:人生还真是充满了戏剧性,不是惊喜就是惊吓 1.Unity工具栏 说明:等下会根据如图所示的三个区域,一一介绍.PS:我的Unity版本号是2019.4.16f1c1 ...

  8. 企业微信会话内容存档功能说明

    为保障客户服务质量.提高内部协作效率和监管合规等原因,企业微信提供会话内容存档功能. 会话内容存档是什么? 企业在遇到以下情况时,是不是非常想获取员工与客户的聊天记录: 考察员工和客户的沟通过程是否有 ...

  9. epic怎么添加本地游戏_从《夜勤人》开始EPIC游戏商城现已加入云存档功能

    EPIC游戏商城虽然已经推出数月,然而除了努力争夺限时独占游戏之外,商城本身仍然缺乏GOG和STEAM等竞争对手所具备的功能,像是成就和云存档等.不过,EPIC自然不会对此置之不理.经过玩家发现,EP ...

  10. unity静音功能_如何更改iPad静音开关的功能

    unity静音功能 Your iPhone or iPad has a physical switch on its side, which can be used to mute the devic ...

最新文章

  1. debian dhcp服务启动不了_DHCP服务器配置
  2. JEPF 3.1.3 发布,我们的软件机床
  3. 每行代码都有注释释的java面向对象代码_每行代码都有注释释的java面向对象代码...
  4. JavaScript 按对象的属性排序方法(升序和降序)
  5. 商人Larry Ellison炮轰云计算
  6. C语言问题,if条件里面按位取反
  7. mybatis plus分页插件 total数为0
  8. 某网店营销策划方案(SWOT部分)
  9. 我失窃的信用卡资料在4500英里外被使用,我试图找出它是怎么发生的
  10. linux 网卡绑定解绑,网卡绑定开机绑定,关机解绑
  11. 无法接收到github邮箱验证码的解决方法
  12. 嵌入式软件工程师—成长笔记#02
  13. Dataframe两列值去重
  14. 德国转专业申请计算机,详细攻略:在德国,如何转学或转专业?
  15. 电控系统开发工作内容梳理
  16. C#读取文件:按行读取
  17. 异常记录(3)——关于360移动开放平台上传ApK显示413问题
  18. inkscape学习笔记
  19. The request was rejected because the URL was not normalized【翻译】
  20. 玩转 ESP32 + Arduino (八) U8G2驱动OLED

热门文章

  1. java中编写一个学生抽奖活动_用java做的抽奖程序
  2. [渝粤教育] 苏州科技大学 混凝土结构设计原理 参考 资料
  3. iOS 视频播放器旋转问题小结
  4. 经济学原理_宏观经济学,微观经济学合集 N.格里高利·曼昆PDF
  5. 【MODIS数据的下载】
  6. 储存卡怎么格式化为fat32_64g储存卡怎么格式化成fat32格式化
  7. 双层PDF—OCR文字识别系统
  8. 零基础做一个微信答题小程序(一)
  9. 成语答题小程序 开源的成语答题小程序
  10. Center OS和Linux的区别