《Dandelion》中储存&读取机制的实现
在游戏中储存与读取逻辑主要由管理脚本SaveManager与GameManager完成。
将SaveManager与GameManager定义为Singleton,便于处理、防止冲突。
SaveManager.cs:


类SaveData为记录了场景中(scene)所有需要储存的GameObjects的必要信息,GameManager与SaveManager可以通过SaveData的内容完全还原场景状态。SaveFile则是SaveData的集合(5个),利用SaveFile游戏可以保存多个存档,让玩家选择性读取。


由于SaveData是需要被序列化储存的内容,故添加[System.Serializable]属性。SaveObject主要包含的内容为一个BasicGOSI的Dictionary collection。其中索引变量int为相关Object(Component)的UniqueID,SaveManager利用UniqueID将储存数据(BasicGOSI以及其继承类)匹配到相应的Component。

BasicGOSI是用于保存单个GameObject储存信息的base class。包含了最基本的GameObject储存信息,游戏中多数应用储存机制的脚本Component都将定义一个属于自己的继承与BasicGOSI的类,用于保存属于自己的独特的信息。
例如Butterfly component中定义的记录自己储存信息的类ButterflySI:

游戏中用于生成与处理相关BasicGOSI与其继承类信息的为SaveObject类,需要利用储存机制的脚本要继承于SaveObject,例如Butterfly:

SaveObject中定义了生成与处理BasicGOSI的函数,相关的继承类需要Override这些函数,仍以Butterfly为例:
SaveObject.cs:


其中PackSaveInfo功能为生成一个BasicGOSI并且将其添加到相应的SaveData中。ExtractSaveInfo的功能则为利用提供的BasicGOSI还原状态。
SaveManager的函数GenerateSaveData将调用每一个收集到的SaveObject的函数PackSaveInfo,并将其添加到新创建的SaveData中:
SaveManager.cs:

SaveObject包含一个int member “_uniqueID”,GameManager利用此int值寻找BasicGOSI所对应的场景中的Object。

GameManager.cs:


储存的过程为:由其他脚本调用SaveManager中的函数SaveCurrentScene(CheckArea),SaveCurrentScene将利用GenreateSaveObject生成一个包含当前场景储存信息的SaveData,并更新member “_saveFile”(添加新生成的SaveData后整理)。之后赋值并开启储存同步线程_saveThread。显示相关信息并结束。
SaveManager.cs:

其中储存线程执行的函数WriteSaveDataToBinaryFile(string)的主要功能为将_saveFile object序列化之后储存到相应的磁盘位置下。
SaveManager.cs:
SaveManager利用BinaryFormatter进行序列化,注意的是SaveFile中的数据,即相关BasicGOSI以及继承类中包含的数据类型必须支持Serialization。对于一些不支持Serialization的数据类型,可以自定义SurrogateSelector的方式解决。例如Unity中不支持Serialization的Vector2,Vector3与Quaternion类型。
SaveManager.cs:


浙公网安备 33010602011771号