Reputation: 1040
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
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