拡張メソッド

Unityで

「一つ下の子要素のコンポーネントを全てとってきたいけど、GetComponentsInChildren()を使うと孫要素以下まで再帰的にとってきちゃう。一つ下だけでいいのに!」

というような、ありそうで微妙にない関数が欲しいというような時は、C#の拡張メソッドの機能で定義してやると便利です。

internal static class TransformExtension
{
    public static List<T> GetComponentsInFirstChildren<T>(this Transform transform) where T : MonoBehaviour
    {
        var list = new List<T>();
        for (var i = 0; i < transform.childCount; ++i)
        {
            var c = transform.GetChild(i).GetComponent<T>();
            if (c != null)
            {
                list.Add(c);
            }
        }

        return list;
    }
}

こういうのを適当なところ(自分はExtensions.csというファイルにまとめてます)に書くと、呼び出し側は

var components = transform.GetComponentsInFirstChildren<SomeClass>();

という感じ。スッキリ書ける。

インデックスバリデーション付きのListとか、色々なところで使いそうなやつは積極的に定義しとくと良さそう。