🐈

Unityで[System.Serializable]を使ってMonoBehaviourを継承しないクラスをインスペクターに表示させる術

2024/03/23に公開

はじめに

Unityを使っていると、コンポーネントをインスペクターに表示させるためには多くの場合MonoBehaviourを継承する必要があります。しかし、すべてのクラスがMonoBehaviourを継承する必要はありません。この技術記事では、[System.Serializable]属性を活用してMonoBehaviourを継承しないクラスをインスペクター上で扱う方法を紹介します。

[System.Serializable]とは?

[System.Serializable]は、C#で用意されている属性の1つで、クラスがシリアライズ可能であることを指定します。この属性を使用すると、Unityエディターのインスペクター上で、そのクラスのインスタンスを編集可能になります。

[System.Serializable]
public class PlayerData {
    public int level;
    public string name;
}

使いどころ:MVPパターンの例

MVPパターンにおけるModelは、通常MonoBehaviourを継承しません。Modelはデータやロジックを管理する為、UnityのUIやゲームオブジェクトと直接の関連性を持たないず、Monobehaviourの機能が必要ない場合が多いからです。

実装手順

  1. MonoBehaviourを継承しておらず、インスペクターに表示したいクラスに[System.Serializable]属性を追加します。
  2. MonoBehaviourを継承する別のクラスで、そのクラスのインスタンスをpublicなフィールドとして定義します。
    これによって、PlayerPresenterのplayerModel変数の中身を、インスペクターに表示させることができます。
[System.Serializable]
public class PlayerModel {
    public int level;
    public string name;
}

public class PlayerPresenter : MonoBehaviour {
    public PlayerModel playerModel;
}

まとめ

[System.Serializable]を活用することで、MonoBehaviourを継承しないクラスをUnityのインスペクターで編集できます。これにより、より綺麗でメンテナンスしやすいコードが書けるようになります。

Discussion