Unity では、オブジェクトの子や親にアタッチされている任意のコンポーネントを検索するメソッドがあります。
子要素が持つコンポーネントを検索する場合は GetComponentInChildren(複数取得するときは GetComponentsInChildren)を使用します。
気をつけなければいけない点は、これらのメソッドは検索を開始するオブジェクトも検索対象となることです。
例えば、オブジェクトAの中にオブジェクトBとオブジェクトCがあり、全てのオブジェクトに X というコンポーネントがついているとします。
- A(X)
- B(X)
- C(X)
このとき A から GetComponentsInChildren を呼び出し、B と C が持っている X を取得しようとすると、親である A の X も取得されますので、結果として3つのXを含む配列が返されます。
検索元のコンポーネントを取り除く
状況によっては、検索元(親)のコンポーネントは取得対象から外したいということがあるかもしれません。
そういったときは、以下のように System.Linq > Enumerable に定義される Skip を利用して、取得した配列の最初の要素を取り除くことで望む結果が得られます。
MyUtil.cs
using System.Linq; public static class MyUtil { // 子要素にのみアタッチされている任意のコンポーネントを取得 public static T[] GetComponentsOnlyChildren<T>(this Transform t) { return t.GetComponentsInChildren<T>().Skip(1).ToArray<T>(); } }
このスクリプトは Transform のメソッドとして GetComponentsOnlyChildren を追加しますので、以下のように使用できます。
void Test(Transform target) { X[] ChildrenX = target.GetComponentsOnlyChildren<X>(); }
これによって、子要素だけのコンポーネントを配列として取得できます。
以上、自身を除いた子要素のコンポーネントのみを取得する方法についてでした。