- Home /
Custom Inspector: nested lists not serializing with Editor.target
Hello. I'm trying to make a custom inspector, which let me show Lists of Lists on my way. I have a problem with serialization those, because when I hit play or exit Unity I lost my inpected data. I know that Unity doesn't serialize nested Lists, so I've tried many solutions posted in other questions or forums (like this: http://answers.unity3d.com/questions/784507/add-list-to-serialized-list.html). Unfortunately, any of those solutions doesn't work and I don't have any more ideas how to fix it. Can you help me?
I don't want to support multi-editing, so I didn't use SerializedObject/Property and using those is difficult to work with Lists (even more with nested lists). To watch if something was serialized or not I got a counter .Count.
Here's my code (you can copy-paste it, it will work): Main class:
[CustomEditor(typeof(GeneratorData))]
public class GeneratorDataEditor : Editor
{
GeneratorData generatorData;
int selectedLevel;
private void OnEnable()
{
generatorData = (GeneratorData)target;
}
public override void OnInspectorGUI()
{
EditorGUILayout.BeginVertical();
{
DrawGeneretableDataStatesOnLevels();
}
EditorGUILayout.EndVertical();
EditorUtility.SetDirty(generatorData);
}
private void DrawGeneretableDataStatesOnLevels()
{
EditorGUILayout.BeginHorizontal();
{
selectedLevel = EditorGUILayout.IntField("Selected level:", selectedLevel);
if (selectedLevel < 0)
{
selectedLevel = 0;
}
else if (generatorData.generetableDataStates.Count > 0 && selectedLevel > generatorData.generetableDataStates.Count)
{
selectedLevel = generatorData.generetableDataStates.Count;
}
else if (generatorData.generetableDataStates == null || generatorData.generetableDataStates.Count == 0)
{
selectedLevel = 0;
}
if (GUILayout.Button(new GUIContent("Add level", "Add new level")))
{
generatorData.generetableDataStates.Insert(selectedLevel, new GeneratableStates());
//generatorData.generetableDataStates.Add(new List<GeneratorData.GeneratableState>());
}
if (GUILayout.Button(new GUIContent("Remove level", "Remove selected level")))
{
if (selectedLevel >= generatorData.generetableDataStates.Count)
{
selectedLevel = generatorData.generetableDataStates.Count - 1;
}
if (generatorData.generetableDataStates[selectedLevel] != null && generatorData.generetableDataStates.Count != 0)
{
generatorData.generetableDataStates.RemoveAt(selectedLevel);
}
}
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.TextArea("Count levels:" + generatorData.generetableDataStates.Count);
}
}
And other classes:
[CreateAssetMenu(fileName = "New GeneratorData", menuName = "Generator/GeneratorData", order = 1011)]
public class GeneratorData : ScriptableObject
{
public List<GeneratableStates> generetableDataStates = new List<GeneratableStates>();
}
public class GeneratableStates
{
public List<GeneratableState> generatableStatesList = new List<GeneratableState>();
public GeneratableStates()
{
generatableStatesList = new List<GeneratableState>();
}
}
public class GeneratableState
{
public GeneratableData gd;
public float perc;
}
[System.Serializable]
public class GeneratableData {
public GeneratableData(GameObject prefab, float minScale, float maxScale, Rect boundingRect)
{
this.prefab = prefab;
this.minScale = minScale;
this.maxScale = maxScale;
this.boundingRect = boundingRect;
}
public GameObject prefab;
public float minScale;
public float maxScale;
public Rect boundingRect;
public float GetAverageArea()
{
return (boundingRect.height * boundingRect.width) * ((minScale + maxScale) / 2);
}
}
Your answer
Follow this Question
Related Questions
Custom Editor: Weird reset when clicking Play 1 Answer
how can I create a new Object from custom Editor 0 Answers
Custom inspector variable resets automatically 1 Answer
Nested Dictionary data lost after playmode 0 Answers
Is it possible to display a List of GameObject List in a Custom Inspector? 1 Answer