GetComponentsInChildrenとは
GetComponentsInChildrenとは何かですが名前を見れば分かるかと思いますが、子オブジェクトにくっついているコンポーネントを一括で取得してくる関数のことです。
GetComponentsInChildrenの使い方
子オブジェクトにくっついているTextコンポーネントを一括で取ってくるサンプルです。
仮に下記のような構造があったとします。
Parentオブジェクトの下にそれぞれChild1、Child2、Child3の子オブジェクトが3つぶら下がる構造になっています。
更に、Parentを含めてすべてのオブジェクトにTextコンポーネントをアタッチしてそれぞれに以下の文言を入れています。
Parent:親です
Child1:子ども1
Child2:子ども2
Child3:子ども3

子オブジェクトにあるTextコンポーネントを一括で取ってくるには下記のようにするといいでしょう。
さって突然ですがクイズです。こちらのコードを実行するとどのような結果が返ってくるか考えてみてください。
using UnityEngine;
using UnityEngine.UI;
public class GetComponentsInChildrenTest : MonoBehaviour
{
[SerializeField] GameObject parent;
void Start()
{
foreach (Text child in parent.GetComponentsInChildren<Text>())
{
Debug.Log(child.text);
}
}
}
GetComponentsInChildrenは自分自身も含めて取得してくる
実はこのGetComponentsInChildrenで取得できるのは子オブジェクトだけではありません。なんと自分自身も含めて取得してくるような仕様になっています。これには最初は散々悩んでいました。〜InChildrenという名前になっていますから当然、子オブジェクトからしか取得しないと思うわけじゃないですか!
上記の例でいうと、このような結果になります。

ParentにもTextコンポーネントが付いていることから、自分自身(つまりParent)のTextコンポーネントも取得してくるようになっていることが分かりますね。ん〜ちょっと困りましたね。子オブジェクトだけを対象にしたい場合はどうしたらいいでしょうか?
子オブジェクトだけを対象に取得してくる方法
やり方は2通りあります。どちらの方法でも同じ結果が得られます。

方法1:親オブジェクト(自分自身)から該当のコンポーネントを取り外す
今回の例でいうと、ParentにあるTextコンポーネントを取り外す方法です。
そうすれば当然ながら自分自身にはTextコンポーネントがないワケですから取得できようがありません。ただし、この方法の欠点は本当にTextコンポーネントが必要だった場合、この方法は使えません。
方法2:ロジックで自分自身を除外してやる
ロジックで自分自身を除外する方法です。コードを見てみましょう。
using UnityEngine;
using UnityEngine.UI;
public class GetComponentsInChildrenTest : MonoBehaviour
{
[SerializeField] GameObject parent;
void Start()
{
foreach (Text child in parent.GetComponentsInChildren<Text>())
{
// 自分自身の場合は処理をスキップする
if (child.gameObject == gameObject) continue;
Debug.Log(child.text);
}
}
}
foreachで回しながら、自分自身なら処理をスキップしましょう。
まとめ
- GetComponentsInChildrenはコンポーネントを子オブジェクトから一括で取得してくる関数です。
- コンポーネントは親(自分自身)にもあると一緒に取得してくる仕様になっています。
- 親オブジェクト(自分自身)を除いて取得したい場合はコンポーネントを外すか、コードで自分自身を除外する処理を書きましょう。
コメント