【Unity】非MonoBehaviorのクラスや構造体をインスペクタから編集する方法

Tips
スポンサーリンク

非MonoBehaviorのクラスや構造体はインスペクタ表示されない

Unityで自作クラスや構造体を定義してプロパティとして持たせても、
そのままではインスペクタには表示されません。

public class MyClass
{
    [SerializeField] private string _name;
    [SerializeField] private int _value;
}

public struct MyStruct
{
    [SerializeField] private string _name;
    [SerializeField] private int _value;
}

public class Test : MonoBehaviour
{
    [SerializeField] private MyClass _myClass;
    [SerializeField] private MyStruct _myStruct;
}

MonoBehaviorを継承したクラスは表示されます。

public class MyMonoBehaviourClass : MonoBehaviour
{
    [SerializeField] private string _name;
    [SerializeField] private int _value;
}

public class Test : MonoBehaviour
{
    [SerializeField] private MyMonoBehaviourClass _myMonoBehaviourClass;
}

非MonoBehaviorのクラスや構造体をインスペクタに表示する方法

[System.Serializable]をクラスや構造体の定義の前に付けます。

using System;
using UnityEngine;

[Serializable]
public class MyClass
{
    [SerializeField] private string _name;
    [SerializeField] private int _value;
}

[Serializable]
public class MyMonoBehaviourClass : MonoBehaviour
{
    [SerializeField] private string _name;
    [SerializeField] private int _value;
}

[Serializable]
public struct MyStruct
{
    [SerializeField] private string _name;
    [SerializeField] private int _value;
}

public class Test : MonoBehaviour
{
    [SerializeField] private MyClass _myClass;
    [SerializeField] private MyMonoBehaviourClass _myMonoBehaviourClass;
    [SerializeField] private MyStruct _myStruct;
}

このように非MonoBehaviorクラスや構造体の中身がインスペクタ上で編集できるようになります。
ただし、MonoBehaviorクラスに関しては上記画像の通り、[Serializable]属性を付けても中身は直接編集できません。

解説

Unityでは、データ構造やゲームオブジェクトの状態を Unity が保存して後で再構築できる形式に変換する自動処理のことを「シリアル化」と呼んでいます。

[Serializable]属性を付けることでこの「シリアル化」の対象となり、インスペクタ上から編集が可能になります。
実際にファイルの中身を見てみると分かりやすいです。

先ほどのクラスをアタッチしたオブジェクトをプレハブ化して中身を見てみると、
[Serialize]属性を付けた非MonoBehaviorクラスと構造体が
[SerializeField]を付けたプロパティと一緒にそのまま値が保存されている
のが分かります。

逆にMonoBehaviorの継承クラスのプロパティに関しては、
guidで管理されて、直接値を持つのではなくインスタンスへの参照を持つ形のため、直接値を編集することが出来ない
ようになっているのが分かります。

[Serializable]を外すと非MonoBehaviorクラスや構造体の値は消えていますね。

「シリアル化」についての公式ドキュメントはこちらをご確認ください。

スクリプトのシリアル化 - Unity マニュアル
シリアル化 (シリアライゼーション) は、データ構造やゲームオブジェクトの状態を Unity が保存して後で再構築できる形式に変換する自動処理です。
Tips小ネタ&小技
スポンサーリンク
フーシャ

主にUnityを触ってるクライアントエンジニア。
学部の情報工学科卒業後、
スマホ向けゲームの開発/運営会社に新卒で入社して現在5年目の社会人です。

フーシャをフォローする
フーシャをフォローする

コメント

タイトルとURLをコピーしました