ジェネリックとは?

ジェネリック(Generics) は、型に依存しない汎用的なコードを記述するための仕組みです。

主なメリットは以下の通りです。

  • コードの再利用性が向上:異なる型でも同じロジックを使える
  • 型安全性が確保される:コンパイル時に型チェックが行われ、誤った型の使用を防げる

ジェネリックは、クラス・インターフェース・メソッド に適用でき、特に コレクション(List, Dictionary<TKey, TValue> など) でよく使われます。

ジェネリッククラスの例

以下はクラスの例です。

public class Data<T>
{
	private T _item;
	
	public T Item => _item;
	
	public void Data(T source)
	{
		_item = source;
	}
}

public void DataTest : MonoBehaviour
{
	private void Awake()
	{
		Data<int> intData = new Data<int>(123);
		Data<float> floatData = new Data<float>(100.5f);
		Data<string> stringData = new Data<string>("hoge");
	}
}

<T> の部分で型を指定することで、さまざまな型に対応できます。

例えば:

  • int を渡せば int 型に
  • float を渡せば float 型に
  • string を渡せば string 型に

Unity では GameObject や TransformSprite などを渡すことも可能です。

これにより、汎用的な処理を共通化し、型ごとにコードを重複させる必要がなくなります。

複数のパラメータを指定したい場合は、以下の様に複数指定することも出来ます。

public class Data<T1, T2>
{
		private T1 _item1;
		private T2 _item2;
}

インターフェイスやメソッドについても同様にジェネリックを使用できます。

実は使っているジェネリック

C#を使ってゲームを作っている場合、コレクションを使用することがありますよね?

List<int> userIdList = new List<int>();

List<GameObject> objectList = new List<GameObject>();

Dictionary<string, Texture> textures = new Dictionary<string, Texture>();

これらの機能もジェネリックを使って実装されています。

そのため、任意の型を指定して安全に使用できます。

Unityのジェネリック

Unityの機能にもジェネリックが使われています。

例えば、以下のようなメソッドがあります。

  • GetComponent<T>()
  • AddComponent<T>()
  • Resource.Load<T>()
  • Object.Instantiate<T>()
  • GameObject.FindObjectOfType<T>()

Unity初心者でも、ジェネリックを意識せずにこれらのメソッドを使ったことがあるのではないでしょうか。

まとめ

今回はジェネリックについて簡単に解説しました。 Unityの機能やコレクションを通じてジェネリックの利便性をご紹介しましたが、自分でジェネリックを活用したコードを書くことも可能です。

似たようなコードを繰り返している場合、ジェネリックを活用すれば、クラスやメソッドを効率的にまとめられるかもしれません。

Unityの機能でその便利さを体感したら、ぜひ自分のプロジェクトでも応用してみてください。

最初は少し難しく感じるかもしれませんが、使いこなすことで開発効率が大幅に向上します。

柔軟で再利用可能なコードを目指し、ジェネリックを活用してみましょう!