読者です 読者をやめる 読者になる 読者になる

【Unity】全ての子オブジェクトをGameObject[]型で取得する

全ての子オブジェクトをGameObject型で取得するサンプルです。
・すべての子オブジェクトを名前から検索する
・すべての子オブジェクトからコンポーネントを拾ってくる
・すべての子オブジェクトをTransform
型で拾ってくる
というのはネット上の記事に転がっていますが、今回はGameObject[]型で拾ってきます。
上記の方法についてはググれば出ると思います。

GameObject[] GetChildren(string parentName) {
        // 検索し、GameObject型に変換
        var parent = GameObject.Find(parentName) as GameObject;
        // 見つからなかったらreturn
        if(parent == null) return null;
        // 子のTransform[]を取り出す
        var transforms = parent.GetComponentsInChildren<Transform>();
        // 使いやすいようにtransformsからgameObjectを取り出す
        var gameObjects = from t in transforms select t.gameObject;
        // 配列に変換してreturn
        return gameObjects.ToArray();
}

例えば、UIを組む時にPanelの表示・非表示を切り替えたいときこのメソッドを使うとこんな感じで書けます。

var uiObjects = GetChildren("Panel");
foreach(var uiObject in uiObjects) uiObject.SetActive(false);

Panelの子を拾ってきて、SetActiveで表示・非表示を切り替えることができます。
uGUIで表示・非表示を切り替えるときどのパラメータをいじるのが適切なのか分かりませんが、とりあえずこれで実装可能


追記(2015/11/26) 読み返していて気づきましたが、一度SetActive(false);をしたあとにGameObject.Findを呼ぶと拾ってくれずにnullが返ってきます。よって、上の方法でUIの表示・非表示を切り替えるのはまずいです。注意してください(GameObject.Findで毎回親をさがすのでなく、親のインスタンスを変数で保持しておけば、あとは上の流れで大丈夫です)