20
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-04-06

そもそも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になりました。

スクリーンショット 2021-04-06 022237.jpg

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

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

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

スクリーンショット 2021-04-06 022708.jpg

GitHub

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

20
13
2

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
20
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?