本日はUnityの小ネタ枠です。
SerializableInterfaceを使ってInspectorでインタフェースを指定する方法です。
Unity3D-SerializableInterface
Unity3D-SerializableInterfaceは個人の方が公開しているインターフェイスをシリアル化できるようにするパッケージです。
本パッケージを利用するとInspectorからインタフェースを指定してコンポーネントの参照を設定できます。
github.com
本パッケージをインポートして以下のようにSerializableInterfaceでインタフェースを指定したプロパティを作成します。
[SerializeField]
private SerializableInterface<IMyInterface> mySerializableInterface;
SerializableInterfaceのインポート
SerializableInterfaceはOpenUPMで公開されているのでそこからダウンロード可能です。
メニューから[Edit -> Project Settings..]を開き、[Package Manager]タブを開きます。

[New Scope Registry]にOpenUPMの参照先のURLとSerializableInterfaceのScopeを設定して[Save]します。
Name:任意の名前 URL:https://package.openupm.com Scope:net.tnrd.serializableinterface

次にメニューから[Window -> PackageManager]を選択して PackageManager ウィンドウを開きます。

[Packages]から[My Registries]を選択します。

SerializableInterfaceのパッケージが表示されるので選択して[install]を実行します。

これでSerializableInterfaceをインポートできました。

サンプルスクリプト
試しに以下の同じインタフェースを持つ2つのコンポーネントとそれをInspectorから指定するコンポーネントを作成しました。
共通インタフェース
public interface IDebugMessage { void ShowDebugMessage(); }
インタフェースを持つコンポーネント
using UnityEngine; public class DebugMessageEn : MonoBehaviour, IDebugMessage { public void ShowDebugMessage() { Debug.Log("Hello, World!"); } }
using UnityEngine; public class DebugMessageJa : MonoBehaviour, IDebugMessage { public void ShowDebugMessage() { Debug.Log("こんにちは、世界!"); } }
SerializableInterfaceを利用するコンポーネント
using TNRD; using UnityEngine; public class SerializableInterfaceTest : MonoBehaviour { [SerializeField] // SerializableInterface<T>を使ってインターフェースをシリアライズする private SerializableInterface<IDebugMessage> debugMessage; void Start() { // インスタンス.Valueでインターフェースの実装を取得できる debugMessage.Value.ShowDebugMessage(); } }
以下のようにシーンにコンポーネントを配置しました。

以下の通りInspectorから共通のインタフェースでコンポーネントの参照を設定できます。

