SagiZiv
SagiZiv

Reputation: 1040

Serializable class is not shown in custom inspector

I am creating custom inspector for my ScriptableObjects in unity, and I have noticed that my Serializable class's properties aren't displayed

I have created a simple script to hold a character data, and one of it fields is a Serializable class. If I don't use custom inspector I can see the class in the inspector, but if I try to make one it automatically just displayes the field name in foldout view, and when I unfold it, it is empty.

My Class:

using UnityEngine;
[System.Serializable]
public class Skills
{
    [SerializeField, Tooltip("This character agility level")]
    private byte agility, strength;

}

My Data ScriptableObject:

using UnityEngine;
using Weapons.ScriptableObjects;
namespace Characters.ScriptableObjects
{
     [CreateAssetMenu(fileName = "New Character", menuName 
"Characters/Soldier")]
    public class SoldierData : CharacterData
    {
        public Weapon weapon;
        public float life = 100;
        public bool autoAttack = true;
        public Skills skills = new Skills();
    }
}

And finally my custom editor:

using UnityEditor;
namespace Characters.CustomEditors
{
    [CustomEditor(typeof(ScriptableObjects.SoldierData))]
    public class SoldierEditor : CharacterEditor
    {
        private SerializedProperty life, autoAttack, skills, weapon;
        private bool showBaseProperties = true, showWeaponProperties = false;

        private new void OnEnable()
        {
            base.OnEnable();
            life = serializedObject.FindProperty("life");
            autoAttack = serializedObject.FindProperty("autoAttack");
            skills = serializedObject.FindProperty("skills");
            weapon = serializedObject.FindProperty("weapon");
        }
        public override void OnInspectorGUI()
        {
            showBaseProperties = EditorGUILayout.Foldout(showBaseProperties, "Basic settings:");
            if (showBaseProperties)
            {
                base.OnInspectorGUI();
            }
            serializedObject.Update();
            showWeaponProperties = EditorGUILayout.Foldout(showWeaponProperties, "Weapon settings");
            if (showWeaponProperties)
            {
                EditorGUILayout.PropertyField(autoAttack);
                EditorGUILayout.PropertyField(life);
            }
            EditorGUILayout.PropertyField(skills);
            serializedObject.ApplyModifiedProperties();
            }
        }
    }

I want to see my Skills class's properties in the custom inspector

Upvotes: 0

Views: 3557

Answers (1)

Dmitri Veselov
Dmitri Veselov

Reputation: 447

It works for me

My Class:

[Serializable]
public class Skills
{
    [SerializeField]
    public byte[] m_Arr;
}

My Data ScriptableObject:

[CreateAssetMenu(fileName = "New Character", menuName =
"Characters/Soldier")]
public class SoldierData : ScriptableObject
{
    //public Weapon weapon;
    public float life = 100;
    public bool autoAttack = true;
    public Skills skills = new Skills();
}

And finally my custom editor:

[CustomEditor(typeof(SoldierData))]
public class SoldierEditor : Editor
{
    private SerializedProperty life, autoAttack, skills/*, weapon*/;
    private bool showBaseProperties = true, showWeaponProperties = false;

    private void OnEnable()
    {
        life = serializedObject.FindProperty("life");
        autoAttack = serializedObject.FindProperty("autoAttack");
        skills = serializedObject.FindProperty("skills");
        //weapon = serializedObject.FindProperty("weapon");
    }
    public override void OnInspectorGUI()
    {
        showBaseProperties = EditorGUILayout.Foldout(showBaseProperties, "Basic settings:");
        if (showBaseProperties)
        {
            base.OnInspectorGUI();
        }
        serializedObject.Update();
        showWeaponProperties = EditorGUILayout.Foldout(showWeaponProperties, "Weapon settings");
        if (showWeaponProperties)
        {
            EditorGUILayout.PropertyField(autoAttack);
            EditorGUILayout.PropertyField(life);
        }
        EditorGUILayout.PropertyField(skills);
        serializedObject.ApplyModifiedProperties();
    }
}

uncomment weapon add: put SoldierEditor in folder named "Editor"

Upvotes: 1

Related Questions