[UE4] AssetRegistry を使用してエディターですべての MI を取得する

エディターでは、多くの場合、すべての xx タイプのリソースを走査してから、BlendIn が 0 であるすべてのモンタージュや、Replicated が false であるすべてのアクターを検索するなど、何らかのロジックを実行する必要があります。

1.日常的な状況

  AssetRegistry を取得します。

FAssetRegistryModule* const AssetRegistryModule = FModuleManager::Get().GetModulePtr<FAssetRegistryModule>("AssetRegistry");
if (!AssetRegistryModule)
{
    
    
	return;
}
const IAssetRegistry& AssetRegistry = AssetRegistryModule->Get();

  AssetRegistry を使用すると、すべてのアセットを簡単に走査できます。

FARFilter AMFilter;
AMFilter.ClassNames.Add(UAnimMontage::StaticClass()->GetFName());
AMFilter.PackagePaths.Add(FName("/Game/xxx");

TArray<FAssetData> CurrentExistingAMs;
AssetRegistry.GetAssets(AMFilter, CurrentExistingAMs);

  または、クラス名を直接渡す方が便利です。

TArray<FAssetData> Assets;
AssetRegistry.GetAssetsByClass(FName("AnimMontage"), OUT Assets, false);

このようにして、すべてのディレクトリの下のフォルダー内のすべてのモンタージュ  を取得できContent(Gameつまり、Content) 、配列をトラバースして次のロジックにキャストできます。"xxx"UAnimMontage

for (FAssetData AssetData : CurrentExistingAMs)
{
    
    
	UAnimMontage* const Montage = Cast<UAnimMontage>(AssetData.GetAsset());
	if (!ensure(Montage))
	{
    
    
		continue;
	}
	
	// xxx 实际逻辑
}

  基本的に、コード内のクラス名は何ですか? Umontage など、その前にある を削除してUAnimMontageAnimMontageに変更するだけです。または、UE コンテンツ ブラウザ内で直接クリックしますFilters。内部の名前はクラス名です (スペースを削除します)。

  • アニメーション シーケンス - UAnimSequence-AnimSequence
  • スキルBP - UGameplayAbilityBlueprint-GameplayAbilityBlueprint

ここに画像の説明を挿入します

二、Material Instance

  実際に使用する過程で、Material Instanceすべてを横断したい状況Filltersに遭遇しました。
ここに画像の説明を挿入します

  ただし、どちらの方法でも AssetRegistry 経由で取得することはできません。
ここに画像の説明を挿入します

  見つけるには3 番目のパラメータを選択する必要がありますbSearchSubClasses。コードから見つけることができます。
ここに画像の説明を挿入します

  コンテンツ ブラウザでマテリアルを右クリックして選択するとCreate Material Instance、作成されるのはUMaterialInstanceConstanttype( MIC) で、この型は継承されるUMaterialInstanceため、UMaterialInstanceクラスを検索するだけでは見つかりません。

  • さらに、
      MIC には というフレンド クラスがありUMaterialEditorInstanceConstant、これは MIC の編集に使用されます。
    ここに画像の説明を挿入します

  エディタ上でMICのパラメータを変更するUMaterialInstanceConstant::PostEditChangePropertyUMaterialEditorInstanceConstant::PostEditChangeProperty実行され、ロジックを確認することができます。

おすすめ

転載: blog.csdn.net/Bob__yuan/article/details/122741220