やりたいこと
表題の通りです。アクティブ・非アクティブにかかわらず、シーン(ヒエラルキー)上に存在する特定のコンポーネントを全て取得したい。(Prefabなどシーン上に無いものは含まない)
Unityで任意のコンポーネントがアタッチされているGameObjectを取得する方法はいくつかありますが、表題の目的を満たすものがありません。
・GameObject.FindObjectsOfType<T>() → Activeなオブジェクトしか取得できない
・Resources.FindObjectsOfTypeAll(typeof(T)) → シーン(ヒエラルキー上)に無いPrefabまで取得されてしまう。
よろしくお願いいたします。
やってみたこと
① Resources.FindObjectsOfTypeAll(typeof(T))で(Prefabも含めて)全てのオブジェクトを取得し、オブジェクトがヒエラルキー上にあるかをhideFlagsで判定する方法。
こちらはエディター上でのシミュレーション時にはうまく動くのですが、ビルドするとPrefabのhideFlagsがシーン上のオブジェクトと同じNoneになり、判別ができなくなってしまいました。
C#
1using UnityEngine; 2using UnityEditor; 3using System.Collections.Generic; 4 5public static class Utils{ 6 public static List<T> FindObjectsOfAllInHierarchy<T>() where T : MonoBehaviour{ 7 var all_objs = Resources.FindObjectsOfTypeAll(typeof(T)) as T[]; 8 // hideFlagsでヒエラルキー上のオブジェクトを判別 9 List<T> components = all_objs.Where( c => (c.hideFlags != HideFlags.NotEditable) && (c.hideFlags != HideFlags.HideAndDontSave) && (c.hideFlags != HideFlags.HideInHierarchy) ).ToList(); 10 // 確認用の出力(Editor上で実行時はPrefabのhideFlagsはHideInHierarchyだったが、ビルド後はNoneになっていた。) 11 foreach(T obj in all_objs){ 12 Debug.Log("Name = "+obj.name+", Hide Flags = "+obj.hideFlags.ToString()); 13 } 14 return components; 15 } 16}
② Resources.FindObjectsOfTypeAll(typeof(T))で(Prefabも含めて)全てのオブジェクトを取得し、オブジェクトのパスから、シーンに取り込まれているか否かを判別する方法。
こちらはUnityEditor.GetAssetOrScenePath()を使ているので、Buildできません。(エディタ拡張用の機能なのかな?)
C#
1using UnityEngine; 2using UnityEditor; 3using System.Collections.Generic; 4 5public static class Utils{ 6 public static List<T> FindObjectsOfAllInHierarchy<T>() where T : MonoBehaviour{ 7 List<T> components = new List<T>(); 8 foreach (T obj in UnityEngine.Resources.FindObjectsOfTypeAll(typeof(T))) 9 { 10 // アセットからパスを取得.シーン上に存在するオブジェクトの場合,シーンファイル(.unity)のパスを取得. 11 string path = AssetDatabase.GetAssetOrScenePath(obj); 12 // シーン上に存在するオブジェクトかどうか文字列で判定. 13 bool isScene = path.Contains(".unity"); 14 // シーン上に存在するオブジェクトならば追加 15 if (isScene) 16 { 17 components.Add(obj); 18 } 19 } 20 return components; 21 } 22}

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/04 02:49