Unityで継承クラスのフィールドをインスペクターに表示する方法
目次
TL;DR
- Unity のインスペクターにカスタムクラスを表示したい場合は [Serializable] 属性を使う
- MonoBehaviour を継承していないクラスは、そのままではインスペクターに表示されない
- 親クラスのフィールドもインスペクターに出したい場合は、親クラスにも [Serializable] を付ける
- public 修飾子の不一致に注意(CS0052 エラーの原因になる)
サンプルコード全体
using System;
using UnityEngine;
[Serializable]
public class Car
{
public string maker; // 親クラスのフィールドもInspectorに表示したいなら必要
public virtual void Run()
{
Debug.Log("走るよ!");
}
public void Stop()
{
Debug.Log("止まるよ!");
}
}
[Serializable]
public class SportCar : Car
{
public int maxSpeed; // インスペクターに表示したいフィールド
public override void Run()
{
Debug.Log("超早く");
base.Run();
}
}
public class CarTestBehaviour : MonoBehaviour
{
// Inspectorに展開される
public SportCar sportCar;
void Start()
{
sportCar.Run(); // 「超早く」「走るよ!」
sportCar.Stop(); // 「止まるよ!」
Debug.Log($"最高速度: {sportCar.maxSpeed}");
}
}
ポイント解説
1. なぜ [Serializable] が必要か?
Unity のインスペクターは MonoBehaviour や ScriptableObject を自動的に扱えますが、
通常の C# クラスはそのままでは展開されません。
[Serializable] を付けることで、インスペクターがそのクラスの中身を表示できるようになります。
2. 親クラスと子クラスの両方に付けるべき?
- 親クラスのフィールドも表示したい場合 → 両方に [Serializable] を付ける
- 子クラスのフィールドだけで十分な場合 → 子クラスだけ [Serializable] を付ける
3. アクセス修飾子の不一致エラー(CS0052)
error CS0052: Inconsistent accessibility:
field type 'SportCar' is less accessible than field 'CarTestBehaviour.sportCar'
これは以下の状況で起こります:
- CarTestBehaviour が public クラス
- そのフィールド sportCar も public
- なのに SportCar が internal(アクセス修飾子なし)
👉 解決方法:SportCar を public にする。
同様に、必要なら Car も public に揃えましょう。
実際のInspector表示
上記コードを CarTestBehaviour にアタッチすると、インスペクターに以下が表示されます:

Car Test Behaviour (Script)
Sport Car
Maker [テキスト入力欄]
Max Speed [数値入力欄]
- Car クラスの maker
- SportCar クラスの maxSpeed
両方のフィールドを入力できるようになります。
まとめ
- [Serializable] を付けることで、非MonoBehaviourのクラスでもインスペクターに表示可能
- 親クラスのフィールドも出したければ、親クラスにも [Serializable] を付ける
- public 修飾子を忘れると CS0052 エラーが出るので注意
訪問数 17 回, 今日の訪問数 17回
ディスカッション
コメント一覧
まだ、コメントがありません