Hierarchy上のゲームオブジェクトを全て取得したい!

buravo46.hatenablog.com

こちらのブログにて、Object.FindObjectsOfTypeを使う方法とResources.FindObjectsOfTypeAllを使う方法が紹介されていました。

私の場合、ActiveでないGameObjectも取得したかったのでResources.FindObjectsOfTypeAllを使っていたのですが、これですとシーン上に存在しないオブジェクトも拾ってしまいます。

ブログの方ではstring path = AssetDatabase.GetAssetOrScenePath(obj);を使って判断をしていますが、AssetDatabaseはUnityエディタ上でしか使えません。

悩んでいたところ、gameObject.scene.isLoadというプロパティを教えていただきました!

これがtrueならシーン内にある、つまりHierarchy上にあるということになります!

例えば、こんな感じに使えます。

foreach( GameObject obj in UnityEngine.Resources.FindObjectsOfTypeAll<GameObject>() )
{
	if( obj.scene.isLoad )
	{
		Debug.Log( "私はヒエラルキーにいる" + obj.name + "と申します。" );
	}
}

SceneにはIsValid()というメソッドもあるので、未ロードのシーン内も取得したいなら、そちらを使うのも良さそうです。