UE5 SceneCapture2Dのハマった仕様

※この記事はUE5.3.2で確認しています。

RenderTargetにレンダリング結果を渡せるSceneCapture2D
これを使っていて気がついたことがあったのでメモ

シーン内にSceneCapture2Dが複数あり、RenderTargetに同じものが指定されている場合
CaptureSortPriorityが小さいものが優先して適用されます。
このとき、CaptureSortPriorityが高く使用されていないSceneCapture2Dは
全く動いていないものだと思いましたが

StatRHIでTriangleDrawnを確認してみたところ
レンダリングされているようでした。

DrawnTris_Normal
カメラ一つのみ
6万5千程度

DrawnTris_Camera1
SceneCaptureを一つ追加
12万1千
大体二倍ですね

DrawnTris_Camera10
カメラ一つ
SceneCaptureを11個
CaptureSortPriorityは-1が一つ100が10個です。
驚きの66万!?

SceneCaptureはRenderTargetに反映されていなくても描画処理が走っているようです。

これを避けるにはOptionにあるCaptureEveryFrameをOffにして
必要に応じてCaptureonMovementを切り替えれば大丈夫なようです。
Option menu

追記
BluePrintノードのDeactivateを呼んでもレンダリングの更新を止めることができるのを確認しました。

SceneCaptureの意外な落とし穴でした。

SpawnActor failed because no class was specifiedが発生したときの対応

問題

ABulletClass型の変数を定義して
BluePrintからアセットを指定した状態で

// header
UPROPERTY(EditDefaultsOnly)
TSoftClassPtr<ABulletClass> BulletAsset;

CPPのBeginPlayなどで以下のように呼び出す

// cpp
ABulletClass* bullet = GetWorld()->SpawnActor<ABulletClass>(BulletAsset.Get());

すると
LogSpawn: Warning: SpawnActor failed because no class was specified
エラーが発生する。

解決法

softrefで参照しているクラスを一度でもloadすると解消する問題のようです。
事前にLoadする処理を挟むか

// cpp
ABulletClass* bullet = GetWorld()->SpawnActor<ABulletClass>(BulletAsset.LoadSynchronous());

のように記述すれば解決。
事前にロードした場合UPROPERTYのついた変数にキャッシュしないとGCが走ったときにNullになる可能性があるので注意が必要そう。

Editorだと一度でもBPを開いたりしているとloadしなくても動作するので再起動したときに気がついて困ったりする。

[未解決] UScneComponentを継承したクラスの値がデフォルト値に戻る、UActorComponentを継承したクラスのコンポネントが消える

1.
USceneComponentを継承したクラスのコンポーネントの値を設定してもEditorを再起動したら継承元のデフォルト値にも戻る問題。
これと同じ症状
記事通りVS Codeでビルドし直したりしたが改善せず。

コンポーネントを削除して新しくアタッチしたら治った?っぽい
HOTRELOAD周りにはバグが多いようなのでヘッダーを変更したら再度作成してアタッチし直すのがベターか

2.
発生条件は不明だが、UActorComponentを継承したクラスのコンポーネントが消えて
BP内で参照が見つからないエラーが発生してしまうことがある。

ここと同じ症状っぽい
発生頻度が高くない & コンポーネントの名前を変更しなければ再度コンポーネントを追加するだけで問題なく動作するのでとりあえずスルー

UnrealでEditor拡張 メモ

EditorモジュールからRuntimeの方で定義しているクラスなどを#includeするとき
Editroモジュールの方のbuild.csに
PrivateDependencyModuleNames.AddRange(new string[] { ... "MyProject" });
を追加して

#include "UTestClass.h"
ではなく
#include "MyProject/private/UTestClass.h"
のように記述する必要がある
RiderEditor上だとエラーは出ないが
コンパイルに失敗する。

他のモジュールも同様のハズ

UnrealでEditor拡張 AssetActionUtility

この記事ではUnrealEngine5.3を使用しています。

AssetActionUtilityを使用してAssetを右クリックして項目を追加する拡張が便利だったので
C++で作成したクラスを継承してBluePrintで使おうとしたときに気がついが事をメモ。

RuntimeのクラスでAssetActionUtilityを継承しても
BluePrint側にParent対象のクラスとして出てこない

C++の新しいクラス追加時にAssetActionUtilityを親クラスに指定できますが
ここでRuntimeを指定して作ってしまうと
BluePrint側にParent対象のクラスとして出てきません。

これを解決するためにはEditorを指定する必要があります
新規プロジェクトで外部からプラグインなどを一切入れていない場合
Editorが選択肢に出てこない場合があります。

これを解決するためにEditorを指定したモジュールを追加する必要があります。

モジュールの追加について
株式会社ヒストリア様のこちらの記事が参考になりました。
[UE4] モジュールについて

Editorモジュールを追加後Blueprintから作成したクラスが指定できるようになりました。

余談
作成したBluePrintもEditorでしか使用しないのはどうやってマークするのだろうか…
UnityのEditorフォルダみたいな機能があるのか…