UE4 SaveGame保存游戏注意事项

来源:互联网 发布:淘宝找运营商可靠吗 编辑:程序博客网 时间:2024/05/16 16:20

保存数据的流程参考官方文档的例子足够(https://docs.unrealengine.com/latest/CHN/Gameplay/SaveGame/index.html)
这里说一些注意事项以及对SaveGame使用相关的分析理解。

1.首先,UE提供的游戏保存的基本原理是序列化对象,通过构建一个SaveGame对象,并把要保存的数据赋给该对象的成员属性,再把SaveGame对象序列化保存到磁盘上来实现该功能。查看SaveGame类可以看到,他直接继承于UObject并且没有任何成员变量及函数。所以,保存对象的细节不在于SaveGame对象,而在于UObject序列化里面的相关内容。

2.所有保存与加载游戏的逻辑操作都在GamePlayStatics.cpp的SaveGame相关函数里面,如果自己要实现自己的存档机制(完全可以不使用SaveGame对象),可以参考SaveGameToSlot等函数。下面给出了保存游戏涉及到的所有类:
这里写图片描述
Archive是“档案”的意思,在UE里面表示数据存储的类。FMemoryArchive是内存数据存储,就是将当前的数据写到内存里面(如写到一个Byte数组里面),进而存档。用它来辅助UObject的序列化以及反序列化操作。

3.SaveGameToSlot以及LoadGameFromSlot里面的最后参数UserIndex在非H5平台上并没有作用。你保存文件的名字就是SlotName.sav文件,与UserIndex无关。
这里写图片描述

4.属性前面可以添加SaveGame宏,但是不添加这个宏也可以在保存游戏时执行对属性的序列化,官方的例子就没有标记这个宏。官方的解释是: This specifier is a simple way to include fields explicitly for a checkpoint/save system at the property level. The flag should be set on all fields that are intended to be part of a saved game, and then a proxy archiver can be used to read/write it. 大家可以参考下面的代码,其实意思就是如果不标记SaveGame属性,在使用FArchive对UObject序列化时,如果标记了ArIsSaveGame为true,那么这个属性就会跳过序列化。如果标记了SaveGame,那么无论FArchive的ArIsSaveGame是否为true,都不会跳过这个属性的序列化。
这里写图片描述

/*** Indicates whether this archive is saving or loading game state* @return true if the archive is dealing with save games, false otherwise.*/virtual bool IsSaveGame(){    return ArIsSaveGame;}