2
1

エディタ環境で文字列からクラスを取得する(UE5版)

Posted at

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;
}

※注意

コンパイルすら出来なかった物を通るようにはしましたが、最適な方法なのかどうかは詳しく検証できていません。
もし、何かあればご指摘いただければと思います。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1