[UE4]Path指定でAssetをLoadする

概要

    • Asset Registryを用いて、Contentディレクトリ以下のパス指定で任意のAssetをLoadする手法の一つについて記す。

    • 以下のような用途を想定している。

        • 特定のフォルダ以下のAsset情報をまとめて取得したい

            • AnimationやTextureを集めてList化する(このページで説明)

            • 特にどのオブジェクトも所有していないAssetを取得する

    • UE4.21.2で動作確認。

手法

Asset Managerから目的のAssetをAsset Registryに登録させておき、実行時にAsset情報を得る。

以下、Anim Sequenceを集める例を示す。

Primary Assetへ登録

    • 作りたい処理がEditor内でしか走らないなら、この手順は飛ばす。

        • Editorのコンテンツブラウザが全AssetをAsset Registryに登録してくれるので、自分でやる必要がない。

            • Blutility処理などは該当するだろう。

    • Project Setting -> Game -> AssetManager に設定を追加

        • 今回は指定ディレクトリ以下のアセットをまとめて登録している。

        • Specific Assetsを使えば、1つずつ登録指定できる。

C++で集める場合

FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");

TArray<FAssetData> AssetData;

AssetRegistryModule.Get().GetAssetsByPath("/Game/Dynamic/Actors/Animations", AssetData);

for (FAssetData asset : AssetData) {

// このGetAsset内で同期Loadされる

if (UAnimSequence* anim = Cast<UAnimSequence>(asset.GetAsset())) {

this->AnimSeqList.Add(anim);

}

}

BPで集める場合

注意

    • GetAsset内で同期読み込みされる。

        • 非同期に読み込みたい場合は別の手法を使う。

            • Async Load Primary Assetを使う(上記alwei先生の記事)

    • C++で実行する場合、インスタンスはUPROPERTY()修飾した変数に格納しておく。

        • Garbage Collection処理に「まだ参照している」と伝えるため。