Home > front end >  Serialize a custom class in a custom inspector in Unity
Serialize a custom class in a custom inspector in Unity

Time:10-27

I need to serialize a class in a custom inspector (using visually the Editor) like as doing in a Monobehaviour script like this:

[System.Serializable]
public class CustomClass
{
 int myInt
}
public class OtherClass : MonoBehaviour
{
 [SerializeField] CustomClass customClass;
}

which gives this result: result wanted and given using the code above, where DamageEffect = CustomClass and Damage = myInt

In my custom editor, I'd like something like this:


[CustomEditor(typeof(CardObject))]
class AnotherClassEditor : Editor
{
    public override void OnInspectorGUI()
    {
        [SerializeField] CustomClass customclass;                        
    }
}

but, as expected, it points out an error.

I also tried with EditorGUILayout.ObjectField() but I haven't been able to, I'm not so experienced so please try to keep the answers simple.

Actually, I need this serialization to happen only when an enum is equal to a certain value, the overall script is something like this:

using System.Collections.Generic;
using UnityEngine;

#if UNITY_EDITOR
using UnityEditor;
#endif

[CreateAssetMenu(fileName = "Card", menuName = "CardObject")]
public class CardObject : ScriptableObject
{
    public List<CardEffectType> effectsTypes;
    //other...
    [HideInInspector] public List<CardEffect> 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...
}

I found some workarounds but the result is not as when a class is serialized in a Monobehaviour.

CodePudding user response:

When you just want to show something like how Unity would, you can use EditorGUILayout.PropertyField(), but it asks for a SerializedProperty, what you need to get from the SerializedObject, not from the actual target. Something like this:

[CustomEditor(typeof(MyType))]
public class MyTypeEditor : Editor
{
    private SerializedProperty _variableIWantToShow;

    private void OnEnable()
    {
        _variableIWantToShow = serializedObject.FindProperty("<name-of-the-variable>");
    }

    public override void OnInspectorGUI()
    {
        // ...
        if (ShowVariable) EditorGUILayout.PropertyField(_variableIWantToShow);
        // ...
    }
}

You can manage collections (array, list, etc.) as SerializedProperty, but it adds some complexity.

https://docs.unity3d.com/ScriptReference/SerializedProperty.html https://answers.unity.com/questions/682932/using-generic-list-with-serializedproperty-inspect.html

CodePudding user response:

Just make your int myInt public, or add [SerializeField] attribute to it - inspector is only designed to work with serialisable fields (public fields are serialised by default in unity editor), currently your myInt is private hence only visible from within

As mentioned in an answer by h4i, proper way to display objects in the editor is using SerializedProperty, casting 'target' seems like a good idea at start but is only useful if you want to call methods on the object, it will fail in several other cases.

  • Related