【Unity】インターフェースを使ってみる

この記事は、次のリンクの学習を終えた方がさらに進んだ設計技術を身につける意図で書いています

ジェネリックの活用(事前に読み解いておきましょう)

インターフェースの活用

Unityでのinterfaceの活用例として、特にゲーム開発においてよく使われるパターンに関連付けて説明します。例えば、記事で扱われている「シーン管理」や「キャラクターの動作」などのコンテキストでinterfaceを活用すると理解しやすくなります。

UnityでのInterfaceの活用例

Interfaceの定義 まず、共通の動作を定義するinterfaceを作成します。例えば、ゲーム内で異なる種類の敵キャラクターに共通の動作(移動、攻撃など)を持たせる場合です。

public interface IEnemy
{
    void Move();
    void Attack();
}

具体的なクラスの実装 次に、このinterfaceを実装する具体的なクラスを作成します。これにより、異なる敵キャラクターが同じinterfaceを持つことになります。

public class Goblin : MonoBehaviour, IEnemy
{
    public void Move()
    {
        // ゴブリンの移動ロジック
        Debug.Log("Goblin is moving");
    }

    public void Attack()
    {
        // ゴブリンの攻撃ロジック
        Debug.Log("Goblin is attacking");
    }
}

public class Orc : MonoBehaviour, IEnemy
{
    public void Move()
    {
        // オークの移動ロジック
        Debug.Log("Orc is moving");
    }

    public void Attack()
    {
        // オークの攻撃ロジック
        Debug.Log("Orc is attacking");
    }
}

Factoryクラスの実装 Factoryパターンを使って、適切な敵キャラクターのインスタンスを生成します。

public class EnemyFactory
{
    public static IEnemy CreateEnemy(string type)
    {
        switch (type)
        {
            case "Goblin":
                return new GameObject("Goblin").AddComponent<Goblin>();
            case "Orc":
                return new GameObject("Orc").AddComponent<Orc>();
            default:
                throw new ArgumentException("Invalid enemy type");
        }
    }
}

ゲーム内での使用 ゲーム内で、生成された敵キャラクターを操作します。

public class GameController : MonoBehaviour
{
    void Start()
    {
        IEnemy goblin = EnemyFactory.CreateEnemy("Goblin");
        goblin.Move();
        goblin.Attack();

        IEnemy orc = EnemyFactory.CreateEnemy("Orc");
        orc.Move();
        orc.Attack();
    }
}

Interfaceの使い道とメリット

使い道

  • 共通の動作を持たせる:異なる種類のキャラクターやオブジェクトに共通の動作を持たせることで、コードの再利用性が高まります。
  • 依存性の逆転:クラス同士の依存を減らし、柔軟で拡張性のある設計を実現します。

メリット

  • 拡張性:新しい敵キャラクターを追加する際に、既存のコードに影響を与えずにinterfaceを実装するだけで済みます。
  • テスト容易性:モックオブジェクトを使ってテストを行うことが容易になります。
  • コードの整合性:統一されたインターフェースにより、コードの読みやすさと保守性が向上します。

このように、Unityにおいてinterfaceを活用することで、ゲーム開発における設計の柔軟性や拡張性が向上し、初心者にも使い道が理解しやすくなります。