アンリアル勉強3年目、実務1年目の初心者です。
C++ で独自のアセットを作ろうとしています。
プライマリゲームモジュールに UObject から派生した C++ アセットクラスを作り、
Editor モジュールに UFactory や FAssetTypeActions_Base から派生した C++ クラスを作り、それらからゲーム側のアセットクラスをなんらかの方法で参照すると、
- Live Cording をオフにする
- コンパイルする
プレイする
- Unreal エディタを一度閉じる
- 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)
アドバイスよろしくお願いいたします