いつもお世話になっております。
今回はシリアライズ時のメソッド FArchive::SetUEVer()メソッドについてお聞きしたいと思います。
UE5.3から5.5あたりでコアシステムの変更がありデシリアライズ時にFArchive::SetUEVer() にてバージョン指定をしないとならない
ようなのですが、この指定の仕方について確認したいです。
ネットの記事によりますと、FMemoryReader に対し以下のように指定しておりました。
static void LoadObject(UObject* Object, const TArray<uint8>& Data)
{
FMemoryReader Reader(Data, true);
Reader.SetUEVer(FPackageFileVersion(static_cast<int>(EUnrealEngineObjectUE5Version::DATA_RESOURCES), EUnrealEngineObjectUE5Version::DATA_RESOURCES));
MySaveGameArchive MyArchive(Reader);
Object->Serialize(MyArchive);
}
これは.5.3で作成したデータを5.5で読み出すために行っている処理のようですが、書き込みの際は必要ないのでしょうか?
あとこのSetUEVer()の引き数のパッケージバージョン指定ですが、指定の仕方がイマイチよくわからないため、EUnrealEngineObjectUE5Version についての詳しい説明ページなどはありませんでしょうか?
お手数ですがよろしくお願いいたします。
Ken.Kuwano
(Ken.Kuwano)
2
お世話になっております。
> これは.5.3で作成したデータを5.5で読み出すために行っている処理のようですが、書き込みの際は必要ないのでしょうか?
結論としては、必ずしも書き込みの際に必要ではありませんが、書く先と読む先によって変わります。
デシリアライズ時に FMemoryReader 等の「パッケージ外の生バイト列」を読む場合は、パッケージのヘッダがないため Reader.SetUEVer(…) を必ず設定する必要があります。通常のパッケージ(UPackage/FLinkerLoad 経由)では自動で設定されるので明示的な指定は不要です。書き込み側(FMemoryWriter で独自フォーマットを保存)も、将来の読み戻し判定のために「どのUEバージョンで書いたか」を保存し、読み側で同じ値を SetUEVer に反映するのが安全ではあります(実質的には必要です)。
> EUnrealEngineObjectUE5Version についての詳しい説明ページなどはありませんでしょうか?
EUnrealEngineObjectUE5Version に関する詳しい説明をするドキュメントなどがないため、ここでそれを説明したいと思います。引数の指定方法について主に以下のようなケースが挙げられます。
// UE5単体を指定する場合
FPackageFileVersion(EUnrealEngineObjectUE5Version::DATA_RESOURCES, EUnrealEngineObjectUE5Version::DATA_RESOURCES)
// UE4とUE5を指定
FPackageFileVersion(UE4Version, EUnrealEngineObjectUE5Version::DATA_RESOURCES)
// 現在のエンジン値を指定
GPackageFileUEVe
// 特定バージョンに固定(非推奨)
FPackageFileVersion(0, EUnrealEngineObjectUE5Version::DATA_RESOURCES)
バージョンの詳細については、ObjectVersion.h の以下の内容をご確認ください。
// UE5 版のグローバルバージョン列挙と FPackageFileVersion:
enum class EUnrealEngineObjectUE5Version : uint32
{
INITIAL_VERSION = 1000,
...
DATA_RESOURCES,
...
AUTOMATIC_VERSION_PLUS_ONE,
AUTOMATIC_VERSION = AUTOMATIC_VERSION_PLUS_ONE - 1
};
struct FPackageFileVersion
{
FPackageFileVersion(int32 UE4Version, EUnrealEngineObjectUE5Version UE5Version);
static FPackageFileVersion CreateUE4Version(...);
int32 ToValue() const;
int32 FileVersionUE4 = 0;
int32 FileVersionUE5 = 0;
};
// 現在のエンジン既定バージョン(グローバル)
extern const CORE_API FPackageFileVersion GPackageFileUEVersion;
以下は最新のバージョンで保存する際と読み出す場合の利用ケースの例となります。
// 保存時:現在のエンジンバージョンで保存
FMemoryWriter Writer(SaveData, true);
Writer.SetUEVer(GPackageFileUEVersion);
MyObject->Serialize(Writer);
// 読み込み時:同じバージョンで読み込み
FMemoryReader Reader(SaveData, true);
Writer.SetUEVer(GPackageFileUEVersion);
MyObject->Serialize(Reader);
どうぞ、よろしくお願いします。