LoginSignup
1
0

Monobehaviorを継承したインターフェースを[SerializeField]で渡す

Posted at

SerializeReference属性を利用すれば抽象型やインタフェース型のフィールドをシリアライズできます。
しかし、Monobehaviorを継承していない場合に限るので少々使い勝手が悪いです。
そこで、Monobehaviorを継承したクラスのインターフェースを[SerializeField]で渡すための仲介クラスを作っていきます

InterfaceMediater クラス

C#
public class InterfaceMediater<TInterface>
{
    [SerializeField] GameObject _objectI;
    TInterface _interface;
    public TInterface Interface()
    {
        if (_objectI)
        {
            _objectI.TryGetComponent<TInterface>(out _interface);
        }
        return _interface;
    }
}

Unity2020.1からGenericな型がシリアライズ可能になっていますので、Monobehaviorを継承しないこのクラスを作成し、受け取り側でInterfaceMediater型の変数を宣言し使います。

使い方

Itestインターフェースには”取得完了”とだけ表示するTest()関数が定義されています

C#
public class CodeReadTestScript : MonoBehaviour
{
    [SerializeField] InterfaceMediater<ITest> _tsetInterface;
    private void Start()
    {
        var testI = _tsetInterface.Interface();
        testI.Test();
    }
}

[SerializeField]属性を付けてInterfaceMediater型の変数をインターフェース名を指定しながら宣言します
その変数からアクセスできるInterface()関数は指定したインターフェースのみを返します。
スクリーンショット (1322).png
インスペクターにはこのように表示されており、このObject I に取得したいインターフェースを持ったオブジェクトをアタッチすることでInterface()関数を通してインターフェースのみを取得できます。
スクリーンショット (1323).png

実行結果

スクリーンショット (1324).png

このように取得したインターフェースを経由して関数を実行することが出来ます。

終わりに

インターフェースを利用し依存性の逆転を行うことで疎結合を実現できます。
今回は、せっかく実現したその疎結合を[SerializeField]でGameObjectをアタッチするなどして台無しにしないように、Monobehaviorを継承したクラスのインターフェースのみを[SerializeField]で受け渡す方法を記事にしました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0