Menu
CoddyTech

ジェネリックヘルパー

CoddyのUnityジャーニー「Unityのゲームアーキテクチャ」セクションの一部。レッスン 44/64。

ヘルパーの中には、どの型でも同じように使えるものがあります。コンポーネントを取得するか追加する処理や、配列からランダムな要素を選ぶ処理です。ジェネリックメソッドを使えば、型をパラメーター T として一度だけ記述でき、呼び出しごとに型が補われます。

public static class Helpers
{
    public static T GetOrAdd<T>(this GameObject go) where T : Component
    {
        if (!go.TryGetComponent(out T found)) found = go.AddComponent<T>();
        return found;
    }

    public static T RandomItem<T>(T[] items)
    {
        return items[Random.Range(0, items.Length)];
    }
}
Rigidbody body = crate.GetOrAdd<Rigidbody>();
Color paint = Helpers.RandomItem(colors);
GameObject enemy = Helpers.RandomItem(enemyPrefabs);

where T : Component は T についての制約で、メソッドが T に対して何をできるかを決めます。AddComponent が受け取れるのはコンポーネントだけなので、この制約がないとコンパイラーは go.AddComponent<T>() を拒否します。制約があれば、Unity の Rigidbody でも独自のスクリプトでも、どのコンポーネントでも使えます。この制約により、.transform や .gameObject など、Component のすべてのメンバーも T に対して使えるようになります。crate にすでに Rigidbody が付いている場合は、それが返され、新たに追加されることはありません。

RandomItem は T に触れないため、制約がありません。色、文字列、プレハブのいずれにも使えます。呼び出し時に型を指定することはほとんどありません。Color[] 型の colors から、コンパイラーは T が Color だと判断します。T[] の代わりに IEnumerable<T> を受け取るメソッドなら、配列と List の両方を受け取れます。これには FindObjectsByType<T> が返す配列も含まれます。

challenge icon

チャレンジ

中級

ショックタワーの木箱とランプに使う汎用ヘルパーを1つ作成します。

  1. Helpers.csで、コンポーネントを対象にするpublicなInRange<T>(IEnumerable<T> items, Vector3 center, float range)を持つstaticクラスHelpersを作成します。戻り値は、距離がrange以下の項目を含むList<T>です。
  2. Pulseで、Spaceキーを押したとき、範囲内のすべてのRigidbodyに上向きのliftの衝撃を与えます。
  3. 次に、範囲内のすべてのLampでTurnOn()を呼び出します。

「プレイ」を押してからSpaceキーを押すと、近くの木箱が跳ね上がります。その後、「確認」を押します。

自分で試してみよう

using System.Collections.Generic;
using UnityEngine;

// Helpers.InRange<T>: ある点から指定範囲内にある要素

Unityのゲームアーキテクチャのすべてのレッスン

自分で練習してみよう: Unityプレイグラウンド