[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先生の記事)
StreamableManagerを使う
C++で実行する場合、インスタンスはUPROPERTY()修飾した変数に格納しておく。
Garbage Collection処理に「まだ参照している」と伝えるため。