バナナラボ

Vtuber美作ワニのブログです

【実装のヒント】ジェネリック型を活用しよう!【Unity】

バナナラボのワニです。 今日はジェネリックについて紹介したいと思います!

ジェネリックとはうんたらかんたらです。

docs.microsoft.com

概要をみるとこんな感じですが、ぶっちゃけ普通の人が見てもなんのこっちゃってなるやつですね。

ひとまず実装例を出そうと思います。

実装例

クラスでの実装例

public class Unit<T> where T : ICharacter
{
    private T Character { get; }

    public Unit(T character)
    {
        Character = character;
    }
}

上記である場合、ICharacterで実装された型をTに指定することができます。

var unit = new Unit<Char>(new Char());
// ジェネリックの指定を省略することもできる
// var unit = new Unit(new Char());

こうすることで機能によって振る舞いを変えて実装したい場合に便利だったりします。今回の参考例の場合だと以下のようにも実装できます。

public class Unit
{
    private ICharacter Character { get; }

    public Unit(ICharacter character)
    {
        Character = character;
    }
}

インターフェースで実装しているのであえてジェネリック型でやる必要性はないかもしれませんが、ジェネリック型の場合は複数の型を指定したりとインターフェース以上に幅広い実装を実現することができます。

メソッドでの実装例

メソッドにもジェネリック型を指定することができます。

public class Sample
{
    public T Get<T>(string path) where T : UnityEngine.Object
    {
        return Resources.Load<T>(path);
    }

    public void Test<T>(T value)
    {
    }

    public void Test<T1, T2>(T1 value, T2 value)
    {
    }
}

メソッド単体にも指定が可能で、複数の型を指定することもできます(これはクラスも同様)。

継承やインターフェースをうまく使って実装すると実装量を大きく減らしたりすることができます。

問題点

実はジェネリック型はインスタンス生成で引数の指定ができないという問題があります。

そのため、パラメータを渡したいケースにおいては一工夫して実装する必要があります。

宣伝

YouTubeでゲーム実況・ゲーム開発の動画投稿および配信をやっています! もしご興味があればチャンネル登録・高評価よろしくおねがいします!

www.youtube.com