インスペクタにC#クラスのインスタンスを表示する

2021年3月4日

ゲームオブジェクトにEnemyスクリプトをアタッチします。
Enemyスクリプト内で、別のC#クラスのインスタンスを更新、確認することができるようにします。

インスペクターに表示されるスクリプト

サンプルコード

using UnityEngine;
 
// このクラス(Item)は、別ファイルにすることができます。
// また、ゲームオブジェクトにアタッチする必要もありません。
 
// ↓ ここから
using System;
 
[Serializable]
public class Item
{
    // アイテム名
    public string name;
    // 攻撃力
    public int offensivePower;
    // 防御力
    public int defensiveAbility;
}
// ↑ ここまで

public class EnemySample : MonoBehaviour
{
    [SerializeField]
    Item item;
 
    void Start()
    {
        item.name = "Sord";
        Debug.Log(item.name);
    }
}

ポリモーフィズムをインスペクタで更新、確認できるようにするには(2019.3以降のバージョン)

参照としてフィールドをシリアル化するようUnityに指示します。

Unityがオブジェクトをシリアル化するとき、フィールドタイプが[UnityEngine.Object]から派生しない限り、すべてのフィールドを値タイプとしてシリアル化します。デフォルトでは、ポリモーフィックフィールドはサポートされておらず、グラフなどの参照ベースのトポロジはネイティブに表現できません。

通常は最高のパフォーマンスが得られるため、ScriptableObjectからフィールドタイプを派生させることをお勧めします。

ただし、ScriptableObjectsを使用すると容認できない複雑さが加わる場合、[SerializeReference]でフィールドを修飾すると、Unityは「値」ではなく「参照」でフィールドをシリアル化するように指示されます。

注:
-フィールドタイプは、UnityEngine.Objectに特化したタイプであってはなりません。
-フィールドタイプは抽象的です。
-フィールドタイプはインターフェイスにすることができます。
-[SerializeReference]で装飾された汎用リストと配列フィールドは、リスト/配列インスタンス自体ではなく、リスト/配列の要素に属性を適用します。
-参照された値はUnityEngine.Objectインスタンス間で共有できません。たとえば、2つのMonoBehavioursは、参照によってシリアル化されたオブジェクトを共有できません。代わりにScriptableObjectsを使用してデータを共有します。
-フィールド値はnullにできます。

using UnityEngine;

// このクラス(Item)は、別ファイルにすることができます。
// また、ゲームオブジェクトにアタッチする必要もありません。

// ↓ ここから
using System;
using System.Collections.Generic;
 
interface IItem
{
    string GetItem();
}
 
[Serializable]
public class Item : IItem
{
    // アイテム名
    public string name;
    // 攻撃力
    public int offensivePower;
    // 防御力
    public int defensiveAbility;

    public string GetItem()
    {
        // アイテム取得処理
        return "何か・・";
    }
}
// ↑ ここまで
 
[ExecuteInEditMode]
public class Enemy : MonoBehaviour
{
    [SerializeReference]
    List<IItem> items = new List<IItem>();

    private void OnEnable()
    {
        items.Clear();
        items.Add(new Item { name = "Bar" });
    }
}

C#,Unity

Posted by hidepon