【Unity】インターフェースとは?クラス設計を管理しやすくする仕組み

インターフェースとは? Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「インターフェースってなに?」

「インターフェースはどうやって使うの?」

というお悩みの方に向けた内容となっています。

インターフェースは、継承を前提としている型で、派生クラスに対して機能(メソッド)を強制的に持たせることができるクラス設計における仕組みのことです。

このインターフェースの仕組みを使うことで、より良いクラス設計を作っていくことができ、プログラムの管理が非常に効率化していきます。

例えば、プレイヤーが敵にダメージを与えるという処理を作りたいときに、インターフェースを使うと、敵の種類が増えても手間がかからなくなります。

そこで、このページでは、Unityで使うことができるインターフェースがどういうものなのか、特徴や使い方までをまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

インターフェースとは?

まずは、インターフェースがどういう機能なのかを紹介していきます。

派生先のクラスに機能を強制的に実装させる役割

インターフェースは、他のクラスに継承させることを前提とした型のことで、派生クラスにメソッドを必ず実装させることができます。

もう少し詳しく解説していくと、まず継承とは、クラス内で定義したメンバ変数やメンバメソッドを派生先のクラスに引き継ぐことができる仕組みのことです。

そして、インターフェースで定義したメソッドも同じように派生クラスに引き継がせていくのですが、この定義したメソッドは全て抽象メソッドというものになります。

抽象メソッドは、元のクラス内ではメソッドの定義だけを行い、具体的な処理を派生したクラス側で必ず記述する必要があるメソッドのことです。

そのため、インターフェースを使って継承させることで、派生クラスに対して強制的にメソッドを持たせることができるようになります。

複数の継承を行うことができる

インターフェースの大きな特徴として、一つのクラスに対して複数の継承を行うことができます。

例えば、基本となるクラスを二つ作成して、それを一つのクラスにどちらも継承させようとすると、エラーが発生してできません。

そのため、通常の継承ではどちらか片方のクラスしか引き継げませんが、インターフェースでは複数の継承ができるので、同じように二つ作成して継承させるといったことができるようになります。

インターフェースの使い方

ここからは、実際にどうやってインターフェースを使っていくのか、使い方をまとめていきます。

インターフェースを作成する

インターフェースを作成する場合は、新しくスクリプトを作ってインターフェースを書いていきます。

public interface IReceiveDamage // インターフェースの定義
{
    void Damage(int damage);  // ダメージを受ける処理
}

1行目のように、

interface インターフェース名 
{
}

と書いて、インターフェースを作ります。

このインターフェース名は、頭に大文字の「I」を付けてインターフェースであることを分かるようにしておくのが一般的です。

ここでは、ダメージを受ける機能として、「IReceiveDamage」という名前を付けています。

そして、インターフェースの中の3行目でメソッドを定義していきます。

このメソッドは抽象メソッドになるので、インターフェースの中では定義だけをして具体的な処理は派生クラスで書いていくことになります。

インターフェースを継承して機能を実装する

インターフェースを作成できたら、派生クラスを作って継承していきます。

using UnityEngine;

public class Enemy : MonoBehaviour, IReceiveDamage
{
    int hp = 100;

    public void Damage(int damage)
    {
        hp -= damage;
        Debug.Log("残りHPは" + hp);
    }
}

派生クラスに継承する場合は、3行目でUnityのデフォルトのMonoBehaviourの後ろに「,」を付けて、インターフェース名を記述します。

複数のインターフェースを継承する場合は、この「,」で繋げていくことで継承できます。

インターフェースを継承できたら、インターフェースで定義したメソッドの処理を書いていきます。

7行目でダメージを受ける処理として体力からダメージ分を減らす処理を作っていますが、必ず最初にpublicの修飾子を付けておく必要があります。

なお、インターフェースで定義したメソッドの処理が書いていないとエラーが発生することになるので、注意しておきましょう。

GetComponentから取得してメソッドの処理を行える

派生クラスにインターフェースを実装出来たら、実際にプレイヤーなどのダメージを与える側に処理を書いていきましょう。

ここでは、プレイヤーが「IReceiveDamage」のインターフェースを持つオブジェクトと衝突した場合に、そのオブジェクトにダメージを与えるという処理を作っていきます。

using UnityEngine;

public class player : MonoBehaviour
{
    void OnTriggerEnter2D(Collider2D collision) // オブジェクトと衝突した場合
    {
        IReceiveDamage damageObj = collision.gameObject.GetComponent<IReceiveDamage>();   // インターフェースを取得する
        if (damageObj != null )
        {
            damageObj.Damage(15);  // Damageメソッドを呼び出す
        }
    }
}

5行目で衝突した際の処理としてOnTriggerEnter2Dメソッドを使っていて、このメソッド内で、GetComponentで衝突したオブジェクトのインターフェースを取得しています。

インターフェースを取得できた場合は、10行目で定義していたDamageメソッドを呼び出すことで、ダメージを与えるという処理を行っています。

試しに、

と3つのオブジェクトを配置して衝突させてみると、

インターフェースを持つオブジェクトにだけダメージを与えることができています。

まとめ

このページでは、Unityで使うことができるインターフェースについて、どんな機能なのか、特徴や使い方までをまとめていきましたが、いかがでしたでしょうか?

インターフェースは、定義したメソッドを派生クラスで強制的に実装することができる機能です。

このインターフェースを使うことで、敵にダメージを与える際などに敵の種類が増えても、管理が複雑化せずに設定していくことができます。

また、インターフェースは複数個の継承を行うことができるので、様々な機能を付けていくのに便利です。

最後までお読みいただきまして、ありがとうございました!

コメント