Monthly Archives: 8月 2024

UE5 Unload Stream Level の完了が呼ばれなかった問題

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

動的にLevelを切り替える際に使用するLoadStreamLevel,UnloadStreamLevelノードですが
UnloadStreamLevelノードのCompleteまで処理が走らない問題に遭遇したので原因をメモ。

症状

以下のようにノードを組んだ際に
Unload Stream Levelノードまでは実行されるがCompleteが呼ばれない状態。

この質問と同じ状態ですが解決策がない
https://forums.unrealengine.com/t/unload-stream-level-does-not-continue-and-hangs-on-streaming-level/405656

解決策

この記事に解決策が書いてありました。
https://forums.unrealengine.com/t/bug-unload-stream-level-node-never-completes/373379/4

このノードを組んでいるActorがUnloadするLevelに含まれているためにCompleteまで呼ばれないのが原因でした。
他のLevelに移動したり、PersistantLevelにいれると問題が解消しました。

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内で参照が見つからないエラーが発生してしまうことがある。

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