そもそも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にリポジトリとして公開してあります。