【Unity】インターフェースをシリアライズ可能にするSerializeReferenceを便利にするSubclassSelector改


そもそもSerializeReference属性って?

Unity 2019.3から使用できるようになったSerializeReference属性によって、インターフェースや抽象クラスの参照がシリアライズできるようになりました。

Unityのエディターでインターフェースを編集できるようになる革命が起きたのです。

インターフェースを実装した型を選択するための SubclassSelector属性

とはいってもSerializeReference単体では、あまり使い勝手が良くありませんでした。

そこで、@tsukimi_nekoさんが作ってくださったSubclassSelector属性によって、エディターのポップアップからインターフェースを実装したクラスを指定できるようになりました。

こんな感じでインターフェースに対してSerializeReferenceとSubclassSelectorを付与することで、

using UnityEngine;

public class CommandTestClass : MonoBehaviour {
    [SerializeReference, SubclassSelector]
    ICommand command;
}

そのインターフェースを実装したクラスがポップアップで表示され、指定できるようになります。


https://qiita.com/tsukimi_neko/items/7922b2433ed4d8616cce

これがメチャクチャ便利!

SubclassSelectorを改良しました

実際にプロジェクトでSubclassSelectorを使用している中で、細かい使い勝手が気になったので、いくつかの改良を行いました。

型検索機能

ザックリとした型検索ができるようになりました。型が多くなってくると便利。
ついでにGameObjectのAddComponentメニュー準拠のUIになりました。

AddTypePopup属性による表示名の上書き機能

/をセパレータとして使用できるので、型をグループ分けして整理することができます。
UnityコンポーネントのAddComponentMenu属性に相当します。

// メニューを設定
[AddTypeMenu("Example/Add Type Menu Command")]
[Serializable]
public class AddTypeMenuCommand : ICommand {
    public void Execute () {
        Debug.Log("Execute AddTypeMenuCommand");
    }
}

GitHub

GitHubにリポジトリとして公開してあります。