エディターでは、多くの場合、すべての 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 实际逻辑
}
基本的に、コード内のクラス名は何ですか? U
montage など、その前にある を削除してUAnimMontage
、AnimMontage
に変更するだけです。または、UE コンテンツ ブラウザ内で直接クリックしますFilters
。内部の名前はクラス名です (スペースを削除します)。
- アニメーション シーケンス -
UAnimSequence
-AnimSequence
- スキルBP -
UGameplayAbilityBlueprint
-GameplayAbilityBlueprint
二、Material Instance
実際に使用する過程で、Material Instance
すべてを横断したい状況Fillters
に遭遇しました。
ただし、どちらの方法でも AssetRegistry 経由で取得することはできません。
見つけるには3 番目のパラメータを選択する必要がありますbSearchSubClasses
。コードから見つけることができます。
コンテンツ ブラウザでマテリアルを右クリックして選択するとCreate Material Instance
、作成されるのはUMaterialInstanceConstant
type( MIC
) で、この型は継承されるUMaterialInstance
ため、UMaterialInstance
クラスを検索するだけでは見つかりません。。
- さらに、
MIC には というフレンド クラスがありUMaterialEditorInstanceConstant
、これは MIC の編集に使用されます。
エディタ上でMICのパラメータを変更するUMaterialInstanceConstant::PostEditChangeProperty
とUMaterialEditorInstanceConstant::PostEditChangeProperty
実行され、ロジックを確認することができます。