インスペクタにC#クラスのインスタンスを表示する
ゲームオブジェクトに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" });
}
}
ディスカッション
コメント一覧
まだ、コメントがありません