UE5でWorldSubsystemの追加でクラッシュ

UE5を触り始めて、WorldSubsystemを使おうとしたところ、WorldSubsystemを追加した途端にBPエディタを開く度にエラーが発生するようになってしまいました。
何度もプロジェクトを作りなして、やり直しましたが再現率が100%です。

環境が悪いか、WorldSubsystemの追加方法が悪いのかもしれまんせんが、質問させて頂ければと思います。

環境はUE5+VSCode
(Visual Studio Community2019もインストール済みですが、IDEはVSCodeを使用)
また、UE5の設定もVSCodeを使用するように設定済みです。

再現の方法は以下の通りです。
1.UE5でThirdPersonTemplateを新規作成
2.[ツール]->[新規 C++クラス]を選択
3."全てのクラス"を選択し、"WorldSubsystem"で検索し、“WorldSubsystem"を選択した状態で次へ
4.デフォルトの"MyWorldSubsystem"のままで"クラスを作成”
5.メッセージダイアログに「プロジェクトにソースが含まれます。エディタを閉じてIDEからビルドしてください。」と表示されるので"OK"をクリック
6.メッセージダイアログに「クラス ‘MyWorldSubsystem’の追加に成功しました。ただしコンテントブラウザに表示されるようにするには’[プロジェクト名]’ モジュールをコンパイルする必要があります。コード編集を行いますか?」と表示されるので"はい"をクリック
7.VSCodeが立ち上がる
8.一旦UE5を終了
9.再度UE5を起動し、上記のプロジェクトを開く
10.以下のメッセージダイアログが開くので"はい"ボタンをクリック

Missing [プロジェクト名] Modules

The following modules are missing or built with a different engine version:

[プロジェクト名]

Would you like to rebuild them now?

はい(Y) いいえ(N)

11.対象プロジェクトが起動
12.UE5の右下に表示されるようになったコンパイルボタンをクリック → コンパイル成功
13.C++で以下のソースを作成(MyWorldSubsystem.hのGENERATED_BODY配下)

public:
UFUNCTION(BlueprintCallable)
int32 GetScore(){ return Score; }
private:
int32 Score;

14.再度コンパイルして正常終了を確認
15.なんでも良いのでBPを新規作成し、編集しようとダブルクリックすると、以下のクラッシュレポートが表示されてUE5が落ちる

Assertion failed: Ret->IsA(T::StaticClass()) [File:D:\build++UE5\Sync\Engine\Source\Runtime\CoreUObject\Public\UObject\Class.h] [Line: 3119]

UnrealEditor_Engine!FSubsystemCollectionBase::AddAndInitializeSubsystem() [D:\build++UE5\Sync\Engine\Source\Runtime\Engine\Private\Subsystems\SubsystemCollection.cpp:246]
UnrealEditor_Engine!FSubsystemCollectionBase::Initialize() [D:\build++UE5\Sync\Engine\Source\Runtime\Engine\Private\Subsystems\SubsystemCollection.cpp:138]
UnrealEditor_Engine!UWorld::InitWorld() [D:\build++UE5\Sync\Engine\Source\Runtime\Engine\Private\World.cpp:1751]
UnrealEditor_Engine!UWorld::InitializeNewWorld() [D:\build++UE5\Sync\Engine\Source\Runtime\Engine\Private\World.cpp:2019]
UnrealEditor_Engine!FPreviewScene::FPreviewScene() [D:\build++UE5\Sync\Engine\Source\Runtime\Engine\Private\PreviewScene.cpp:48]
UnrealEditor_Kismet!FBlueprintEditor::FBlueprintEditor() [D:\build++UE5\Sync\Engine\Source\Editor\Kismet\Private\BlueprintEditor.cpp:1749]
UnrealEditor_Kismet!FBlueprintEditorModule::CreateBlueprintEditor() [D:\build++UE5\Sync\Engine\Source\Editor\Kismet\Private\BlueprintEditorModule.cpp:274]
UnrealEditor_Kismet!FBlueprintEditorModule::CreateBlueprintEditor()
以下、略

16.UE5再起動
17.改めて、上記15.で作ろうとしたBPを作ってみる
18.BPエディタが開く
19.BPからC++で作ったMyWorldSubsystemのメソッドをコールしようとするが、メソッドが表示されないので、BPエディタを一旦閉じて、C++を再コンパイルする → C++コンパイル正常終了
20.BPエディタを再び開くと、上記と同じクラッシュレポートが表示されて落ちる
21.C++で作ったMyWorldSubsystemのヘッダーから追加部分を削除し、再コンパイルして、BPを開く分にはエラーは発生せず

私のローカルの環境で同様の手順を踏んでも再現はしませんでした。
プロジェクトディレクトリの、"Intermediate"フォルダを削除して再度試してみると良いかも知れません。

コールスタック的には、FSubsystemCollectionBase::AddAndInitializeSubsystemで止まっています。
SubsystemClassがUSubsystem派生のクラスでは無い?のが原因ですので
SubsystemClassをデバッガーで確認してみて下さい。
UClass::SuperStructを辿って、USubsystemのクラスが含まれている場合はエンジン側の不具合の可能性があるかと思われます。

Engine\Source\Runtime\Engine\Private\Subsystems\SubsystemCollection.cpp

USubsystem* FSubsystemCollectionBase::AddAndInitializeSubsystem(UClass* SubsystemClass)
{
	TGuardValue<bool> PopulatingGuard(bPopulating, true);

	if (!SubsystemMap.Contains(SubsystemClass))
	{
		// Only add instances for non abstract Subsystems
		if (SubsystemClass && !SubsystemClass->HasAllClassFlags(CLASS_Abstract))
		{
            // 省略

            // ここでアサートに止まっている
            // SubsystemClassがUSubsystemからの派生クラスでは無い場合にアサートで止まるようです
			const USubsystem* CDO = SubsystemClass->GetDefaultObject<USubsystem>();
			if (CDO->ShouldCreateSubsystem(Outer))

ご回答ありがとうございます。

どうも、私の環境特有の現象っぽいですね。

VSCodeのデバッガーで検証する為に、プロジェクトからVSCodeのワークスペースを作成し、VSCodeの「実行とデバッグ」からUE5を起動したところ、正常に動作するようになりました。そして、Engine\Source\Runtime\Engine\Private\Subsystems\SubsystemCollection.cppにブレイクポイントを置いて検証してみたところ、普通にMyWorldSubsystemが読み込まれていました。

しかし、その後、改めてエディタのショートカットから普通にUE5を起動した場合には、再びこのクラッシュ現象が発生するようになってしまいました。

つまり、VSCodeの「実行とデバッグ」からLaunch [プロジェクト名]EditorでUE5を起動させた場合は問題なく動作し、UE5のexeからエディタを起動させた場合のみ、MyWorldSubsystemを
USubsystemにキャストできずにクラッシュするという感じです。

再現手順にはBPの編集と書きましたが、MyWorldSubsystemがある状態ではプレイすらできずにクラッシュしてしまいます。

下記URLに再現動画をアップさせて頂きました。
(もし、お手数でなければ)何か問題点がありそうでしたら、教えて頂けると助かります。

コチラで再度試した所再現しました。

どの環境でも再現する可能性が高いです。

私の再現手順に問題があったのか、UE5.0.1に更新してから試したので環境が変わっている可能性がありますのでご了承ください

LiveCoding(動的コンパイル機能)

原因は↑を使ってビルドを行った際の不具合だと思われます。

hファイルの記述を修正した場合、私の環境でも再現がなされました。(UPROPERTYやUFUNCTION絡みのコードです)

.cppファイルのロジックを修正した場合には、Playを行ってもクラッシュには至りませんでした。

hファイルを修正する際にはLiveCoding機能が正常に動作しない可能性があります。

一度エディターを落として、ビルドしてからエディターを起動する事を推奨致します。

1 Like

動作検証までして頂き、ありがとうございました。

LiveCordingの不具合の可能性ということで、もう少し現象を確認してみて、もし手におえなさそうなら、不具合報告にあげたいと思います。

非常に長々とお付き合い頂きありがとうございました。