[Unity]存档功能
[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]存档功能相关推荐
- unity 存档插件_【Unity消息】5月1日到5月15日 Unity资源商店大促
5月1日到5月15日,Unity资源商店5月大促,几百款资源5折,而且每天有一款资源打3折~ 而且Unity资源商店又改版啦,新版好好看呀~ Unity资源5月大促地址:Unity Asset Sto ...
- 部署及配置Lync Server 2013存档功能
在前面我们已经做了不少功能,Lync Server拓扑已经逐渐的完整,但仍然还有一些空白,比如存档和监控功能.虽然Lync Server 2013的存档和监控已经不再是单个角色,但是我们仍然需要对其进 ...
- 谷歌相册_Google相册中的新存档功能是什么?
谷歌相册 If you're a Google Photos user, you've may have seen a new feature called "Archive" s ...
- 企业微信会话存档功能的推出背景,版本,部署方式
会话存档推出的背景 会话存档最开始推出的使用对象为金融企业,金融从业人员的工作沟通合规监管日趋严格,2018年1月,"一行三会"联合发布<关于规范债券市场参与者债券交易业务的 ...
- [Unity存档系统]简单介绍Unity常见存档系统二JSON以及使用方法
学习目标: 如果你和我同样苦恼于游戏相关的数据怎么存储与读取,那么不妨看看这个up主有关Unity存档系统的教程.[Unity] 存档系统 Part 1 | PlayerPrefs | Unity初学 ...
- 企业微信会话存档功能开启
企业微信会话存档功能是企业微信所开发的,可以获取存档员工的工作聊天记录,包括文字.图片.语音.撤回消息等内容,用来保障客户服务质量.提高内部协作效率和监管合规. 企业如果想使用会话存档功能,首先需要管 ...
- Unity 工具栏功能介绍
Unity 工具栏功能介绍 题外话:人生还真是充满了戏剧性,不是惊喜就是惊吓 1.Unity工具栏 说明:等下会根据如图所示的三个区域,一一介绍.PS:我的Unity版本号是2019.4.16f1c1 ...
- 企业微信会话内容存档功能说明
为保障客户服务质量.提高内部协作效率和监管合规等原因,企业微信提供会话内容存档功能. 会话内容存档是什么? 企业在遇到以下情况时,是不是非常想获取员工与客户的聊天记录: 考察员工和客户的沟通过程是否有 ...
- epic怎么添加本地游戏_从《夜勤人》开始EPIC游戏商城现已加入云存档功能
EPIC游戏商城虽然已经推出数月,然而除了努力争夺限时独占游戏之外,商城本身仍然缺乏GOG和STEAM等竞争对手所具备的功能,像是成就和云存档等.不过,EPIC自然不会对此置之不理.经过玩家发现,EP ...
- unity静音功能_如何更改iPad静音开关的功能
unity静音功能 Your iPhone or iPad has a physical switch on its side, which can be used to mute the devic ...
最新文章
- debian dhcp服务启动不了_DHCP服务器配置
- JEPF 3.1.3 发布,我们的软件机床
- 每行代码都有注释释的java面向对象代码_每行代码都有注释释的java面向对象代码...
- JavaScript 按对象的属性排序方法(升序和降序)
- 商人Larry Ellison炮轰云计算
- C语言问题,if条件里面按位取反
- mybatis plus分页插件 total数为0
- 某网店营销策划方案(SWOT部分)
- 我失窃的信用卡资料在4500英里外被使用,我试图找出它是怎么发生的
- linux 网卡绑定解绑,网卡绑定开机绑定,关机解绑
- 无法接收到github邮箱验证码的解决方法
- 嵌入式软件工程师—成长笔记#02
- Dataframe两列值去重
- 德国转专业申请计算机,详细攻略:在德国,如何转学或转专业?
- 电控系统开发工作内容梳理
- C#读取文件:按行读取
- 异常记录(3)——关于360移动开放平台上传ApK显示413问题
- inkscape学习笔记
- The request was rejected because the URL was not normalized【翻译】
- 玩转 ESP32 + Arduino (八) U8G2驱动OLED