エディタモジュール + Live Cording オフ時、コンパイル・実行でエディタ再起動できなくなる

アンリアル勉強3年目、実務1年目の初心者です。
C++ で独自のアセットを作ろうとしています。

プライマリゲームモジュールに UObject から派生した C++ アセットクラスを作り、
Editor モジュールに UFactory や FAssetTypeActions_Base から派生した C++ クラスを作り、それらからゲーム側のアセットクラスをなんらかの方法で参照すると、

  1. Live Cording をオフにする
  2. コンパイルする
  3. :play_button: プレイする
  4. Unreal エディタを一度閉じる
  5. Unreal エディタを起動する(uproject を開く)

の手順でエディタが必ず落ちます。

5.5.4 では、

Fatal error: [File:xxx\Engine\Source\Runtime\CoreUObject\Private\UObject\UObjectGlobals.cpp] [Line: 3466]
Cannot replace existing object of a different class.
New Object: /Script/TestMods.TestActor /Script/TestMods.Default__TestActor
Existing Object: /Script/TestMods.TestActor /Script/TestMods.Default__TestActor (0x00000031 0x00000001)

5.3.2 では、

appError called: Fatal error: [File:xxx\Engine\Source\Runtime\CoreUObject\Private\UObject\UObjectGlobals.cpp] [Line: 3337]
Objects have the same fully qualified name but different paths.
New Object: TestActor /Script/TestMods.Default__TestActor
Existing Object: TestActor /Script/TestMods.Default__TestActor

というエラーになります。
どうやら、(アセット以外のクラスが)同名だけど別物のクラスとして認識しているようです。

Live Cording オンの場合は起きませんし、単一モジュール運用していれば起きないので、とりあえずは回避できるのですが、
モジュール構成としてよくあるケースだと思われるため、何かを見落としているように思われます。
なお、プロジェクト下の Binaries を消去してリビルドすれば復活はします。(が、毎回かなり面倒です。)

新規プロジェクトからでも簡単に再現するので、テストプロジェクト TestMods のソースを載せておきます。
なお、テスト用に TestActor という C++ アクタをひとつ配置しています。
上記のように一見この TestActor で落ちているようですが、アクタを消しても GameMode や GameState などの(最初のコンパイルされる?)クラスで落ちます。

TestMods.uproject

{
	"FileVersion": 3,
	"EngineAssociation": "5.3",
	"Category": "",
	"Description": "",
	"Modules": [
		{
			"Name": "TestMods",
			"Type": "Runtime",
			"LoadingPhase": "Default",
			"AdditionalDependencies": [
				"Engine"
			]
		},
		{
			"Name": "TestModsEditor",
			"Type": "Editor"
		}
	],
	"Plugins": [
		{
			"Name": "ModelingToolsEditorMode",
			"Enabled": true,
			"TargetAllowList": [
				"Editor"
			]
		}
	]
}

プライマリゲームモジュール側 TestAsset.h(アセットとしては実装途中)

#pragma once

#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "TestAsset.generated.h"

UCLASS()
class TESTMODS_API UTestAsset : public UObject
{
	GENERATED_BODY()

public:
	UTestAsset() {}
};

Editor モジュール側 TestAssetFactory.h (ファクトリとしては実装途中)

#pragma once

#include "CoreMinimal.h"
#include "Factories/Factory.h"
#include "TestAssetFactory.generated.h"

UCLASS()
class UTestAssetFactory : public UFactory
{
	GENERATED_BODY()

public:
	UTestAssetFactory();
};

Editor モジュール側 TestAssetFactory.cpp

#include "TestAssetFactory.h"
#include "TestAsset.h"

UTestAssetFactory::UTestAssetFactory()
	: Super()
{
	SupportedClass = UTestAsset::StaticClass();	// ここを消すとエラーは出なくなる
	bCreateNew = false;
	bEditorImport = true;
}

Editor モジュール側 TestModsEditor.Build.cs

using UnrealBuildTool;

public class TestModsEditor : ModuleRules
{
	public TestModsEditor(ReadOnlyTargetRules Target) : base(Target)
	{
		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine" });
		PrivateDependencyModuleNames.AddRange(new string[] { "UnrealEd", "TestMods" });
	}
}

Editor モジュール側 TestModsEditor.Target.cs

using UnrealBuildTool;
using System.Collections.Generic;

public class TestModsEditorTarget : TargetRules
{
	public TestModsEditorTarget( TargetInfo Target) : base(Target)
	{
		Type = TargetType.Editor;
		//DefaultBuildSettings = BuildSettingsVersion.V5;
		IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_3;
		ExtraModuleNames.Add("TestMods");
		ExtraModuleNames.Add("TestModsEditor");
	}
}

※プライマリゲームモジュール側 TestMods.Target.cs, TestMods.Build.cs はデフォルトまま

どのクラスでも落ちますが、念のためプライマリゲームモジュール側 TestActor.h

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "TestActor.generated.h"

UCLASS()
class TESTMODS_API ATestActor : public AActor
{
	GENERATED_BODY()
	
public:	
	ATestActor();

private:
	UPROPERTY(VisibleAnywhere, Category = Actor)
	TObjectPtr<UStaticMeshComponent> _Mesh;
};

プライマリゲームモジュール側 TestActor.cpp

#include "TestActor.h"

ATestActor::ATestActor()
{
	_Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMeshComponent_TestActor"));
	RootComponent = _Mesh;
	UStaticMesh* mesh = LoadObject<UStaticMesh>(nullptr, TEXT("/Engine/BasicShapes/Sphere"), nullptr, LOAD_None, nullptr);
	_Mesh->SetStaticMesh(mesh);
}

※環境

  • Windows11 Pro 24H2 (64bit)
  • Unreal Engine 5.5.4 / 5.3.2
  • Visual Studio 2022 Version 17.13.5
  • Windows 11 SDK (10.0.22621.0)
  • MSVC v143
  • v143 ビルドツール用の C++ v14.38(17.8)

アドバイスよろしくお願いいたします :man_bowing: