问题:
- 前一个版本进入序列化的数据,下一个版本不需要了
- 下一个版本加了序列化数据,但是上一个版本的文件内没有这个数据
Unreal支持在序列化的时候,获取旧的文件所在的版本号,和新的版本号。可以拿这两个版本号,进行序列化定制。
为对象新建特定的版本管理:
#pragma once
#include "CoreMinimal.h"
#include "Misc/Guid.h"
struct FXXXCustomVersion
{
enum Type
{
// Before any version changes were made
BeforeCustomVersionWasAdded = 0,
SomeDetailOfVersion1 = 1,
SomeDetailOfVersion2 = 2,
// -----<new versions can be added above this line>-------------------------------------------------
VersionPlusOne,
LatestVersion = VersionPlusOne - 1
};
// The GUID for this custom version number
const static FGuid GUID;
private:
FXXXCustomVersion() {}
};
#include "XXXCustomVersion.h"
#include "Serialization/CustomVersion.h"
const FGuid FXXXCustomVersion::GUID(0x1C74D14B, 0x00C145AE, 0x816D0277, 0xA1EA1770);
// Register the custom version with core
FCustomVersionRegistration GRegisterXXXCustomVersion(FXXXCustomVersion::GUID, FXXXCustomVersion::LatestVersion, TEXT("XXXVer"));
GUID随机生成一个就行:只需要和其它版本GUID不一样就好,从概率上来说几乎是不可能重复的
序列化:
virtual void Serialize(FArchive& Ar) override;
void AXXX::Serialize(FArchive& Ar)
{
Super::Serialize(Ar);
Ar.UsingCustomVersion(FXXXCustomVersion::GUID);
// 判断当前版本(对于Load来说是历史文件的版本号,对于Save来说是最新版本号)
if (Ar.CustomVer(FXXXCustomVersion::GUID) >= FXXXCustomVersion::SomeDetailOfVersion1)
}
void AXXX::PostLoad()
{
Super::PostLoad();
const int32 XXXVer = GetLinkerCustomVersion(FXXXCustomVersion::GUID);
// 判断加载文件的版本号,做一些历史维护(旧版本移植到新版本)
if (XXXVer < FXXXCustomVersion::SomeDetailOfVersion1)
}
若之前没有添加版本信息,则读取版本为:BeforeCustomVersionWasAdded也就是0。之后序列化Save的时候,都是保存的当前的LatestVersion值,也就是最新的版本值。所以下次更新版本,版本数++后,读取的旧的LatestVersion值就自然变化了。