Как сериализовать пользовательский класс в пользовательском инспекторе?C#

Место общения программистов C#
Anonymous
Как сериализовать пользовательский класс в пользовательском инспекторе?

Сообщение Anonymous »

Мне нужно сериализовать класс в пользовательском инспекторе (с помощью визуального редактора), как это делается в сценарии Monobehaviour, например:

Код: Выделить всё

[System.Serializable]
public class CustomClass
{
int myInt
}

Код: Выделить всё

public class OtherClass : MonoBehaviour
{
[SerializeField] CustomClass customClass;
}
что дает следующий результат:
результат требуется и дается с использованием приведенного выше кода, где DamageEffect = CustomClass и Damage = myInt
В моем пользовательском редакторе мне бы хотелось что-то вроде этого:

Код: Выделить всё

[CustomEditor(typeof(CardObject))]
class AnotherClassEditor : Editor
{
public override void OnInspectorGUI()
{
[SerializeField] CustomClass customclass;
}
}
но, как и ожидалось, он указывает на ошибку.
Я также пробовал использовать EditorGUILayout.ObjectField(), но мне не удалось, у меня не так много опыта, поэтому, пожалуйста, постарайтесь, чтобы ответы были простыми.
На самом деле мне нужно, чтобы эта сериализация происходила только тогда, когда перечисление равно определенному значению, общий сценарий выглядит примерно так:

Код: Выделить всё

using System.Collections.Generic;
using UnityEngine;

#if UNITY_EDITOR
using UnityEditor;
#endif

[CreateAssetMenu(fileName = "Card", menuName = "CardObject")]
public class CardObject : ScriptableObject
{
public List effectsTypes;
//other...
[HideInInspector] public List effects;

//other...
}

#if UNITY_EDITOR
[CustomEditor(typeof(CardObject))]
class CardObjectEditor : Editor
{
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
CardObject cardObject = (CardObject)target;

foreach(CardEffectType effectType in cardObject.effectsTypes)
{
switch (effectType)
{
case CardEffectType.DamageEffect:
{
//!!!
}
}
}
}
}
#endif

public enum CardEffectType
{
DamageEffect, //other...
}
Я нашел несколько обходных путей, но результат не такой, как при сериализации класса в моноповедении.

Вернуться в «C#»