UE5でも文字列からクラスを取得したい
エディタ上でなにかやる時に、文字列からクラスを取りたいシチュエーションってありますよね。
しかしながら、UE5では、以前投稿したこれはコンパイルが通りません。
なぜでしょうか、我々の愛したANY_PACKAGEが死んだからです。
対応版
ロード済みを探す→リダイレクタを探す→パッケージロードを試す→_CをつけてBPの可能性を探る。
と、いう流れは前回と同じです。
ANY_PACKAGEを渡していたFindObjectをTryFindTypeSlowとFindFirstObjectSafeに置き換えています。
UClass* FindClassByName(const FString& name) {
auto getClass = [&](const auto& inName) {
// ロード済みを探す.
UClass* ret = UClass::TryFindTypeSlow<UClass>(inName);
if (ret == nullptr) {
// リダイレクタ.
UObjectRedirector* redirector = FindFirstObjectSafe<UObjectRedirector>(*inName);
if (redirector != nullptr) {
ret = Cast<UClass>(redirector->DestinationObject);
}
if (ret == nullptr) {
// パッケージロード.
if (UPackage* pkg = LoadPackage(nullptr, *inName, LOAD_Verify | LOAD_NoWarn)) {
pkg->FullyLoad();
ret = FindObject<UClass>(pkg, *inName);
}
}
}
return ret;
};
UClass* result = getClass(name);
if (result == nullptr) {
// BPの可能性.
result = getClass(name + FString(TEXT("_C")));
}
return result;
}
※注意
コンパイルすら出来なかった物を通るようにはしましたが、最適な方法なのかどうかは詳しく検証できていません。
もし、何かあればご指摘いただければと思います。