お世話になっております。
UObject数の削減のためにBlueprintReadWrite、BlueprintReadOnlyに設定されていたけど実際のBPにアクセスされていないUPropertyを洗い出すツールを試しに作ってみましたけど、同じUPropertyのリファレンス数が変わることがあるので、質問させていただきます。
なお「実際のBPにアクセスされていないUProperty」をエディタ上でリファレンスを全検索して結果が見つからないUPropertyと定義しています。
現在使っているツールの処理は以下の通りになります:
// FAssetRegistryModuleからチェックするBPアセットを取得済み
// アセット情報からBPのGeneratedClassを取得して読み込み
if (auto generatedClass = checkAsset.TagsAndValues.Find(TEXT("GeneratedClass")))
{
const FString classPath = FPackageName::ExportTextPathToObjectPath(*generatedClass);
FString className = FPackageName::ObjectPathToObjectName(classPath);
UClass* bpClass = LoadClass(nullptr, *classPath, nullptr, LOAD_None, nullptr);
if (bpClass)
{
UClass* parentClass = bpClass->GetSuperClass();
if (parentClass && parentClass->IsNative())
{
for (TFieldIterator currentIter(bpClass); currentIter; ++currentIter)
{
// BPで見えるもののみチェックする
if (!currentIter->HasAnyPropertyFlags(CPF_BlueprintVisible))
continue;
// アプリ側で定義したUPROPERTYのみをチェックする
UClass* ownerClass = currentIter->GetOwnerClass();
if (ownerClass && !ownerClass->GetName().Contains(FString("チェックするクラス名"), ESearchCase::CaseSensitive))
continue;
FReferencerInformationList referencers;
currentIter->RetrieveReferencers(&referencers.InternalReferences, &referencers.ExternalReferences);
// NativeClassが必ずExternalReferencesに入るのでリファレンス1個以下のUPROPERTYを出力
if (referencers.ExternalReferences.Num() <= 1 && referencers.InternalReferences.Num() <= 0)
{
self.AddWarning(FString::Printf(TEXT("Property [%s] in Class [%s] is Not Used in Blueprint!"), *currentIter->GetName(), *parentClass->GetName())); // AutomationTestのWarningとして出力
}
}
}
}
}
この処理に関して質問は2点あります。
- 処理を組み込んだテストを実行するときの挙動が固定していません。チェックするBPアセットをエディタ上に開いていない場合は予想通りの出力をしてくれますが、そのBPアセットをエディター上で開いた後でテストを実行すると一切出力しなくなります。ブレークポイントを張って調べた結果、BPアセットを開いたとき、取得したリファレンスの配列に「BlueprintVariableNodeSpawner_XXXX」からの参照が2つ追加されたことを判明しました。このように参照の数が変わると判定がし辛くなりますので、UPropertyのリファレンスを取得する際はRetrieveReferencers()を使うのが正しいでしょうか?
- UPropertyをチェックするときに参照しているフラグは「CPF_BlueprintVisible」を使っていますが、そうするとEditDefaultsOnlyでしか設定していないUPropertyもそれに該当するので余分の結果が出力されます。BlueprintReadWriteとBlueprintReadOnlyが設定されているUPropertyだけをチェックするにはフラグ設定をどういう風に変更すればいいのでしょうか?
長文で失礼しました。
よろしくお願いいたします。