【UE4】AssetManagerを使用したレベルストリームの高速化

UE4.17から正式に利用可能な状態になっているAssetManagerを使用したレベルストリームの高速化の方法を簡単に紹介しようと思います。

今回紹介する内容をザックリ説明すると

ストリームするレベルブループリントを、ストリーム実行前にメモリに確保しておく(裏読み、非同期読み込み)と言うことです。

設定と確認
Editボタンを押しましょう次にProjectSettingsボタンを押しましょう

ProjectSettingsのウィンドウが開くので、次にAsset Managerボタンを押します

Primary Asset Types To Scanの▷を押すと配列の詳細が出てきます。更に0と1の▷を押して詳細が表示されます。

詳細の説明をします

①Primary Asset Type・・・これは任意の名前をつけれるタグみたいなものです。

➁Asset Base Class・・・これはAssetManagerで操作(ロードアンロード)する対象になるclassを設定する所です。

配列0番目に設定されているWorldって言うのは、要するにレベルってことですね。

➂Is Editor Only・・・デフォルトでチェックが入っていますが、実際使う場合はチェックを外しましょう。その名の通りチェックが入っているとプレイインエディタの時のみ有効になってしまうので。 ちなみに、大切な事を伝えてませんでした。AssetManagerの効果測定はPKGかStantAloneで行ってください。 エディタだとキャッシュが残っていたりするので、正確な効果測定ができませんでした。

④Directories ・・・これはAsset Base Classのファイルパス指定になります。

他にも設定項目はありますが、今回は簡単な説明になるので、ここまでになります。

Blueprint実装
今回の検証にはEpic Games Launcherのラーニングから落とせるインフィルトレーラーを使います。
次に肝心のBPノードです。とりあえずこの四つを覚えておけばサッと使えると思います。

今回使うのはAsyncLoadPrimaryAssetListとUnloadPrimaryAssetListです。

こんな感じに非同期読み込み(裏読み)したいレベルを配列で指定します

次に非同期読み込み(裏読み)無しでインフィルトレーラーのLevelをStreamをします。

次に非同期読み込み(裏読み)ありでインフィルトレーラーのLevelをStreamをします。

約24秒短縮できました。

こんな簡単に24秒の短縮が実現しました。

具体的な使い方の一例としてTriggerVolumeのBeginOverlapを検出したらAsyncLoadPrimaryAssetListを呼び出してEndOverlapを検出したらUnloadPrimaryAssetListを呼ぶ・・・なんて方法も思いつきますよね。なので、さっと作ってみましたが、こんなで実装できました。これだとプレイヤー以外がVolumeに入って来ても裏読みが始まってしまいますが。。

まだまだAssetManagerは機能を持っていますが、今回は入門とシンプルな効果測定の紹介なので、ここまでになります。