めいくりぷとのブログ

技術的なことやゲームのことやら・・・

StaticClass

UObject* GetInstanceOf(_In_ UClass *pClass)
{
	if (UObject::GObjObjects() != NULL)
	{
		for (int i = 0; i < UObject::GObjObjects()->Num(); i++)
		{
			UObject *pObject = UObject::GObjObjects()->Data[i];
			if (pObject != NULL &&
				pObject->IsA(pClass))
			{
				if (!strstr(pObject->GetFullName(), "Default"))
				{
					return pObject;
				}
			}
		}
	}

	return NULL;
}

UWorld *pWorld = reinterpret_cast<UWorld*>(GetInstanceOf(UWorld::StaticClass()));

ってな感じで当該のインスタンスは取れるものの、非常にパフォーマンス悪いと思うんですよ。
Defaultクラスじゃないので、もちろんこのポインタは変わるから正直アレなんですよ。

ゲームエンジンもわざわざこんな処理実行して、既存のインスタンスなんて探さないし、
まずメモリのどこかに格納されてるんだから、そこから取ればいいよねって思うんです。

全部が全部って訳ではないけど、Defaultクラスから現在のインスタンス取得する関数も用意されてるんだから、そこからも取れるよねって。

UWorld *pWorld = reinterpret_cast<UWorld*>(GetInstanceOf(UWorld::StaticClass()));
if (pWorld && pWorld->IsA(UWorld::StaticClass()))

海外フォーラム見て思ったんだけど、こういうコードがあって、IsA(...) とかやるだけ無駄だよねって。
まず、IsAって元のインスタンスが継承先のインスタンス(元のインスタンス含む)を持ってるかどうかのチェックじゃねえの・・・と。
コピペは良くないと思います。I want to your nice code.. (笑)