コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】MonoBehaviour の参照を Interface で Inspector に設定できる「Serializable Interface」紹介

はじめに

「Serializable Interface」を Unity プロジェクトに導入することで
MonoBehaviour の参照を Interface で Inspector に設定できるようになります

使用例

public interface ICharacter
{
    void Log();
}

たとえば ICharacter インタフェースが存在し、

using UnityEngine;

public class Player : MonoBehaviour, ICharacter
{
    public void Log() => Debug.Log( "Player" );
}
using UnityEngine;

public class Enemy : MonoBehaviour, ICharacter
{
    public void Log() => Debug.Log( "Enemy" );
}

ICharacter インタフェースを実装した
Player と Enemy という MonoBehaviour が存在し、

Player と Enemy がそれぞれアタッチされたゲームオブジェクトがシーンに存在しており
これらを ICharacter インタフェースで Inspector に設定できるようにしたい場合、

using TNRD;
using UnityEngine;

public class Example : MonoBehaviour
{
    public SerializableInterface<ICharacter> m_character;

    private void Awake()
    {
        m_character.Value.Log();
    }
}

上記のように SerializableInterface<ICharacter> という型でフィールドを定義します

すると ICharacter インタフェースを実装している MonoBehaviour を
Inspector で設定できるようになります

Player コンポーネントを設定した場合は Player.Log が、
Enemy コンポーネントを設定した場合は Enemy.Log が
ICharacter インタフェース経由で呼び出されることが確認できます