【Unity】【C#】非アクティブも含めて、全ての GameObject からコンポーネントを取得する 
2020/11/07 Sat [edit]
前回の「シーン(ヒエラルキー)のルートにある Transform を全て取得する」の応用。ググってみたら、意外と色々面倒なことをやってる例が多かったので、シンプルなものがあっても良いかなと(笑)。
シーン全体からコンポーネントを取得するには Object.FindObjectsOfType() をよく使うけど、これってアクティブな GameObject からのみなんだよね。
非アクティブも含むなら、Resources.FindObjectsOfTypeAll() を使え、ともあるけど、このメソッドはエディタ上で使うと、プレファブからも取得してしまうので、フィルタをかける必要があり、少しコードが面倒くさくなる。
なので、あくまで現在のシーンからアクティブ・非アクティブに関わらず、簡単にコンポーネントを取得する静的メソッドを作っておくと便利だと思った。
もっと細かい条件付けで取得したいときは、以下に資料を載せておくので、各記事を参考にして欲しい。
(参考)
・【Unity】Hierarchy に存在するすべてのゲームオブジェクトを取得する方法
・【Unity】Hierarchy上のゲームオブジェクトを全て取得
・Hierarchy上のゲームオブジェクトを全て取得したい!
(※) Unity 2019.4.14f1 / Windows10(x64) で確認
●現在のシーン(ヒエラルキー)の全てのオブジェクトからコンポーネントを取得する(非アクティブも含む)
using System.Collections.Generic;
/// <summary>
/// 現在のシーン(ヒエラルキー)の全てのオブジェクトからコンポーネントを取得する(非アクティブも含む)
/// 2020/11/07 Fantom (Unity 2019.4)
/// http://fantom1x.blog130.fc2.com/blog-entry-378.html
/// </summary>
/// <typeparam name="T">取得するコンポーネントの型</typeparam>
/// <returns>取得した T の配列(無いときは、0 個の配列)</returns>
public static T[] GetComponentsAll<T>()
{
var list = new List<T>();
var roots = GetRootTransforms(); //ルートにある Transform 全て取得(非アクティブも含む)※前回の記事参照
//全てのルート Transform 以下に GetComponentsInChildren() する
foreach (var tr in roots)
{
var objects = tr.GetComponentsInChildren<T>(true); //非アクティブも含む取得
if (objects != null && objects.Length > 0)
{
list.AddRange(objects);
}
}
return list.ToArray(); //無いときは、0 個の配列(null にはならない)
}
●使用例(メインコード等)
using System.Linq;
using UnityEngine;
var transforms = GetComponentsAll<Transform>();
foreach (var tr in transforms)
{
Debug.Log(tr.name);
}
//GameObject にしたい場合は、LINQ を使うと簡単
var objects = transforms.Select(e => e.gameObject).ToArray();

GetRootTransforms() は前回の記事からコピペして欲しい。GetRootTransforms() では、SceneManager.GetActiveScene() で現在のシーンからのみ取得してるので、対象外のシーンからは取得できないので注意。
また利用の際は、GetComponentsInChildren() をルートにある Transform の数だけ繰り返すので、負荷には注意。ランタイム時には濫発しない方が良いだろう。エディタ上でなら思ったより速かったので、問題なく使えると思う。
(関連記事)
【Unity】【C#】シーン(ヒエラルキー)のルートにある Transform を全て取得する(非アクティブも含む)
【Unity】【C#】Transfrom (GameObject) のパス名を取得する
【Unity】【C#】非アクティブも含めて、Transform (GameObject) をパス名で取得する
【Unity】【C#】ヒエラルキー(シーン)の全てのオブジェクト(Transform)をスキャンして処理をする
- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/378-d9ffdb5b
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |