FC2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム » Unity »【Unity】【C#】非アクティブも含めて、全ての GameObject からコンポーネントを取得する

【Unity】【C#】非アクティブも含めて、全ての GameObject からコンポーネントを取得する  


 前回の「シーン(ヒエラルキー)のルートにある 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)をスキャンして処理をする


関連記事
スポンサーサイト



category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  Unityリファレンス  Transform 
tb: 0   cm: --


トラックバック

トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/378-d9ffdb5b
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop