【Unity】子オブジェクトを取得できるGetChildメソッド

GetChildメソッド Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「スクリプトから子オブジェクトに処理を行いたい!」

「全ての子オブジェクトを一括で取得できないの?」

というお悩みの方に向けた内容となっています。

Unityでは、スクリプトから子オブジェクトを取得したい場合に、GetChildメソッドが便利に使えます。

このGetChildとは、Transformコンポーネントで定義されているメソッドで、子オブジェクトのTransformを取得することができます。

また、for文と組み合わせることで、複数の子オブジェクトのTransformを一括で取得することができるようになります。

そこで、このページでは、Unityで子オブジェクトを取得する際に使えるGetChildメソッドについて、仕様や使い方、また一括で子オブジェクトを取得する方法までをまとめていきます。

なお、

Windows11
Unity Hub3.11.0
Unity6

のバージョンで解説しています。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

GetChildとは?子オブジェクトのTransformを取得できるメソッド

GetChildメソッドは、冒頭でも解説した通り、Transformコンポーネントで定義されている子オブジェクトのTransformを取得できるメソッドです。

もう少し詳しく説明すると、特定の親オブジェクトのTransformに対してGetChildを使うことで、その階層の配下にある子オブジェクトを指定して、そのTransformを取得することができます。

GetChildメソッドで子オブジェクトのTransformを取得できれば、スクリプトから子オブジェクトに対して、様々な処理を加えることができるようになります。

また、GetChildメソッドは、ヒエラルキーにおいて一つ下にある階層のオブジェクトを取得することになります。

そのため、子オブジェクトのさらに下の孫オブジェクトを取得したい場合は、GetChildメソッドで子オブジェクトのTransformを取得した後に、もう一度GetChildメソッドを使うことで、孫オブジェクトを取得することができます。

なお、子オブジェクトだけでなく孫オブジェクトまでを一括で取得するような場合は、GetComponentsInChildrenというメソッドも活用できます。

GetChildの使い方

ここからは、GetChildメソッドの使い方について紹介していきます。

引数で子オブジェクトの位置を指定する

GetChildメソッドを使う場合は、以下のように引数で子オブジェクトの位置を番号で指定して記述します。

Transform.GetChild(index);

index:取得したい子オブジェクトの位置(int型)

子オブジェクトの位置は、ヒエラルキーウィンドウで上から順番に0から始まる整数で指定することができます。

例えば、Parentという親オブジェクトの中に、4つの子オブジェクトを配置していたとします。

そして、スペースキーを押したら、一番下の子オブジェクトが非表示になるという処理を作ってみます。

ここでは、空のオブジェクトを一つ作成して、以下のスクリプトをアタッチしていきます。

using UnityEngine;

public class Test : MonoBehaviour
{
    public Transform parent;    // 親のTransformを取得する変数
    Transform child;            // 非表示にさせる子のTransform

    void Start()
    {
        child = parent.GetChild(3); // 上から4番目の子オブジェクトのTransformを取得
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            child.gameObject.SetActive(false);  // 取得した子オブジェクトを非表示にする処理
        }
    }
}

まず、5行目で親のTransformコンポーネントを取得するための変数をpublicで宣言して、インスペクターウィンドウから親のTransformを入れておきます。

次に、10行目でGetChildメソッドを使って、「3」の位置にある子オブジェクトを取得して、Transform型の変数に代入しています。

そして、スペースキーを押した場合の中で、取得した子オブジェクトのTransformから、17行目にGameObjectで定義されているSetActiveメソッドを使って、子オブジェクトを非アクティブにする処理を行っています。

これでゲームを実行してスペースキーを押してみると、

一番下の子オブジェクトだけを非表示にできているのが分かります。

for文を使って全ての子オブジェクトを取得できる

GetChildは、指定した子オブジェクトのTransformを1つ取得できるメソッドですが、for文と組み合わせることで、複数の子オブジェクトを一括して取得することができます。

ここでは、以下のようにParentという四角の親オブジェクトの中に、複数の丸い子オブジェクトを配置しておきます。

そして、空オブジェクトを作成して、以下のスクリプトをアタッチしていきます。

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour
{
    public Transform parent;    // 親のTransformを取得する変数
    Transform[] childs;         // 子のTransformを取得する配列の変数

    void Start()
    {
        childs = new Transform[parent.childCount];  // 配列の初期化で要素数に子のオブジェクト数を指定

        for (int i = 0; i < childs.Length; i++)
        {
            childs[i] = parent.GetChild(i);         // 子オブジェクトを配列に入れる処理を繰り返す
        }
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(Move());     // コルーチンを開始する処理
        }
    }

    IEnumerator Move()
    {
        foreach (Transform child in childs)
        {
            child.gameObject.SetActive(false);      // 子オブジェクトを非アクティブにする処理
            yield return new WaitForSeconds(1.0f);  // 1秒停止する処理
        }
    }
}

7行目で子オブジェクトを入れるためのTransform型の配列を宣言していて、11行目で初期化する際の要素数に「childCount」の変数を使って、子オブジェクトの数を指定しています。

次に、13行目でfor文を使って、配列にGetChildで取得した値を代入する処理を繰り返し行うことで、全ての子オブジェクトのTransformを上から順番に取得することができます。

あとは、取得した子オブジェクトに対して、スペースキーを押すと、子オブジェクトが順番に非表示にされるという処理を作ってみます。

スペースキーを押した場合の中の23行目で、StartCoroutineメソッドでコルーチンを開始する処理を行っています。

そして、定義したコルーチンの中で、foreach文を使って配列にある子オブジェクトに対して、1秒おきに非アクティブにする処理が行われるように記述しています。

これでゲームを実行してみると、

スペースキーを押すと、子オブジェクトを非表示にする処理が順番に行われているのが分かります。

まとめ

このページでは、Unityで子オブジェクトを取得できるGetChildメソッドについて、どんなメソッドなのか、また使い方までをまとめていきましたが、いかがでしたでしょうか?

GetChildは、Transformコンポーネントで定義されているメソッドで、子オブジェクトのTransformを取得することができます。

GetChildを使う際は、引数に子オブジェクトの位置を番号で指定してあげることで、その子オブジェクトを取得できるようになります。

また、for文と組み合わせて使うことで、全ての子オブジェクトを一括で取得することができるようになります。

最後までお読みいただきまして、ありがとうございました!

コメント