こちらのブログにて、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()というメソッドもあるので、未ロードのシーン内も取得したいなら、そちらを使うのも良さそうです。