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回

C#,Unity,継承

Posted by hidepon