【Unity】【C#】シーン(ヒエラルキー)のルートにある Transform を全て取得する(非アクティブも含む) 
2020/11/02 Mon [edit]
ちょっとした便利メソッド。まぁ、ググればすぐにできるものだけど、毎回調べるのが面倒なので、静的メソッドにでもしておこうかと(笑)。
ヒエラルキーにあるそれぞれの GameObject のルート Transform は Transform.root プロパティで十分だけど、現在のシーンで一度に取得するには SceneManager を使うのが便利だね。ただそれをまとめただけの超簡単なもの(笑)。
(※) Unity 2019.4.13f1 / Windows10(x64) で確認
●現在のシーン(ヒエラルキー)のルートにある Transform を全て取得する
using System.Linq;
using UnityEngine;
using UnityEngine.SceneManagement;
/// <summary>
/// 現在のシーンのルートにある Transform を全て取得 (非アクティブも含む)
/// 2020/11/02 Fantom (Unity 2019.4)
/// http://fantom1x.blog130.fc2.com/blog-entry-377.html
/// </summary>
/// <returns>ルートにある Transform 全て</returns>
public static Transform[] GetRootTransforms()
{
var scene = SceneManager.GetActiveScene();
var objects = scene.GetRootGameObjects();
return objects.Select(go => go.transform).ToArray();
}
●使用例(メインコード等)
using UnityEngine;
var roots = GetRootTransforms();
foreach (var tr in roots)
{
Debug.Log(tr.name);
}

非アクティブなものでも取得できるのが少し便利。SceneManager.GetActiveScene() で現在のシーンからのみ取得してるので、対象外のシーンからは取得できないので注意。
ちなみに、エディタスクリプトでも使える。というより、エディタツール作るときに欲しかったんだよね(笑)。
少し古いやり方では、Object.FindObjectsOfType(アクティブなもののみ)や Resources.FindObjectsOfTypeAll(非アクティブも含む)でもできるね(ただし、負荷は高いのでランタイムで使うには注意)。
テラシュールさんにサンプルコードがあるので参考にするのも良いかも知れない。たぶん SceneManager (or メソッド) がまだ無かった時代のやり方だと思う。全てから transform.parent が null ならルートとして判定している。
非アクティブなものも取得したい場合、Resources.FindObjectsOfTypeAll を使えば良いが、このメソッドの場合、ヒエラルキーにないプレファブも取得してしまうんだよね。なので、ヒエラルキー以外を弾く処理を挟む必要があり、少し面倒くさい。必要なら以下に参考資料を載せておくので、試してみるのも良いだろう。
・シーンのルートにあるGameObjectを取得する
・【Unity】Hierarchy上のゲームオブジェクトを全て取得
(関連記事)
【Unity】【C#】非アクティブも含めて、全ての GameObject からコンポーネントを取得する
【Unity】【C#】Transfrom (GameObject) のパス名を取得する
【Unity】【C#】非アクティブも含めて、Transform (GameObject) をパス名で取得する
【Unity】【C#】ヒエラルキー(シーン)の全てのオブジェクト(Transform)をスキャンして処理をする
【Unity】【C#】RectTransform の矩形の実座標を取得する(GetWorldCorners)
- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/377-871ce624
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |