Inquiry about cause and batch resolution of "Asset has been saved with empty engine version" warning

“C:\Users\wonegero\Perforce\MDR_wonegero\MDR\Content\MDR\Character\Animation\PC\Male\1HS\MotionMatching_1HS\Database_1HS\MDR_1HS_PSD_Stand_Idles.uasset: Asset has been saved with empty engine version. The asset will be loaded but may be incompatible.”

Hello,

We are currently developing a project using Unreal Engine 5.5.4, and we frequently encounter the following warning when loading certain assets:

“Asset has been saved with empty engine version. The asset will be loaded but may be incompatible.”

We would like to understand the possible causes of this warning and how to resolve it safely and consistently across our project.

Our team’s development setup is as follows:

- Programmers are using a **source-built engine** from GitHub.

- Designers and artists are using the **Epic Games Launcher-installed engine**.

- Both setups are using the exact same engine version: **5.5.4**.

Given this mixed environment, we would like to ask:

1. Could the use of both source-built and launcher-installed engines cause engine version metadata to be omitted when assets are saved?

2. Are there any differences in how engine version information is written into `.uasset` files between the two engine types?

3. Would unifying the entire team on a single engine installation method (e.g., all launcher or all source-built) help prevent this issue? Or is there a recommended workflow for maintaining metadata consistency in mixed environments?

To resolve the warning, we attempted the following command-line operation:

Engine\Binaries\Win64\UnrealEditor-Cmd.exe PROJECT_PATH\MDR.uproject -run=ResavePackages -OnlyUnversioned -AutoCheckOutPackages -IgnoreChangeList -KeepPackageGUIDOnSave -PackageSubstring=/MDR/Content/PATH…

We would like to confirm whether this is the **recommended and proper method** for fixing this warning.

Additionally, we tried automating the process using **AutomationTest**, but during execution, the editor consumed excessive memory, eventually causing the process to freeze or crash.

Is AutomationTest an appropriate approach for this type of batch resave task, or are there more **memory-efficient workflows** you recommend for resaving large numbers of assets?

We would greatly appreciate your guidance.

Thank you!

재현 방법
Automation Test Code:

#if WITH_EDITOR

include “Misc/AutomationTest.h”

include “AssetRegistry/AssetRegistryModule.h”

include “UObject/UObjectGlobals.h”

include “UObject/UnrealType.h”

include “EditorAssetLibrary.h”

include “EditorFramework/AssetImportData.h”

IMPLEMENT_SIMPLE_AUTOMATION_TEST(FGenericAssetVersionTest,

“Project.AssetValidation.GenericEngineVersionCheck”,

EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter)

bool FGenericAssetVersionTest::RunTest(const FString& Parameters)

{

FAssetRegistryModule& AssetRegistry = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(“AssetRegistry”);

FARFilter Filter;

Filter.PackagePaths.Add(“/Game”);

Filter.bRecursivePaths = true;

TArray<FAssetData> AssetList;

AssetRegistry.Get().GetAssets(Filter, AssetList);

int32 TotalChecked = 0;

int32 MissingCount = 0;

int32 ResavedCount = 0;

TArray<FString> AssetsToUnload;

for (int32 Index = 0; Index < AssetList.Num(); ++Index)

{

const FAssetData& AssetData = AssetList[Index];

UObject* Asset = AssetData.GetAsset();

if (!Asset)

continue;

const FString AssetPath = Asset->GetPathName();

FProperty* ImportProp = Asset->GetClass()->FindPropertyByName(FName(“AssetImportData”));

if (FObjectProperty* ObjProp = CastField<FObjectProperty>(ImportProp))

{

UObject* ImportDataObj = ObjProp->GetObjectPropertyValue_InContainer(Asset);

if (UAssetImportData* ImportData = Cast<UAssetImportData>(ImportDataObj))

{

FString Filename = ImportData->GetFirstFilename();

if (Filename.IsEmpty())

{

AddWarning(FString::Printf(TEXT(“엔진 버전 누락: %s”), *Asset->GetFullName()));

if (UEditorAssetLibrary::SaveAsset(AssetPath, false))

{

AddInfo(FString::Printf(TEXT(“리세이브 완료: %s”), *AssetPath));

++ResavedCount;

}

else

{

AddWarning(FString::Printf(TEXT(“리세이브 실패: %s”), *AssetPath));

}

++MissingCount;

}

++TotalChecked;

}

}

AssetsToUnload.Add(AssetPath);

if ((AssetsToUnload.Num() % 50 == 0) || (Index == AssetList.Num() - 1))

{

for (const FString& Path : AssetsToUnload)

{

UEditorAssetLibrary::UnloadAsset(Path);

}

AssetsToUnload.Reset();

CollectGarbage(GARBAGE_COLLECTION_KEEPFLAGS);

AddInfo(FString::Printf(TEXT(“%d / %d 애셋 처리 및 GC 완료”), Index + 1, AssetList.Num()));

}

}

AddInfo(FString::Printf(TEXT(“총 검사한 애셋: %d개”), TotalChecked));

AddInfo(FString::Printf(TEXT(“엔진 버전 누락 애셋: %d개”), MissingCount));

AddInfo(FString::Printf(TEXT(“리세이브된 애셋 수: %d개”), ResavedCount));

return true;

}

#endif

Hello there,

Based on the description of the issue, I’m going to assume that the error is showing up on the Epic Games Launcher (EGL) binary builds. The reason is that there is a check in LinkerLoad.cpp when loading files that have no changelist on an engine that has a changelist. GitHub builds do not have a changelist, but EGL builds do, so even with compatible builds, this warning is likely to show up any time a file saved on your source build is opened by the EGL builds.

If these are both off of the same changelist, you could set the changelist in Build.version on the source build.

To answer the questions individually in the order they were asked:

  1. The metadata isn’t omitted. The changelist on GitHub builds is simply set to 0, and that’s what is being checked at that point by the loader.
  2. No, there shouldn’t be if both engines are build off of the same changelist.
  3. In general, unifying the team onto a single build would be preferable. There a few reasons that adopting source builds can be beneficial, and Unreal Game Sync (Setting up an Unreal Engine Studio the Epic Way | Tutorial) can help manage the workflow for designers and artists using source builds.

The ResavePackages commandlet -- or its WorldPartition sibling -- are the recommended way to handle rolling forward uasset versions. This shouldn’t be required for every update to the engine, especially if you are actively modifying the engine, but if you were to change engine versions, it can be prudent to resave.

I hope that helps.

Best regards,

Chris