- Home /
Enum drop down menu in inspector for nested arrays
Hi everyone,
I'm having an issue with enum values being reflected as their numeric values in the inspector when used in a nested array with Unity. Here's a cut down example of the code I'm trying to use.
public enum EnumType { Enum1, Enum2 }
public class ContainerClass : MonoBehavior { [Serializable] public class Constants { [Serializable] public class SubConstants { /.../ public EnumType EnumVals[] = null; }
public SubConstants SubConsts = new SubConstants();
}
[SerializeField]List<Constants> _Attributes = new List<Constants>();
}
So what I'm seeing is that I can create and modify the list of Constants but when I go to edit the array of EnumType in SubConstants, it only shows numeric values and not a drop down box of values. I've also tried making the List an array with no change.
Answer by yoyo · Apr 27, 2011 at 08:09 PM
Seems like the Unity Inspector has a bug with reflected type discovery. Rearranging the nesting of the classes as follows makes it work:
using System; using System.Collections.Generic; using UnityEngine;
public enum EnumType { Enum1, Enum2 }
[Serializable] public class SubConstants { /.../ public EnumType[] EnumVals = null; }
public class ContainerClass : MonoBehaviour { [Serializable] public class Constants { public SubConstants SubConsts = new SubConstants(); }
[SerializeField]List<Constants> _Attributes = new List<Constants>();
}
I just discovered the same thing - your post confirmed my suspicions/fears, thankyou! Did you report the bug to the devs? It's not a huge issue, but it would be nice to fix up!
Answer by TowerOfBricks · Sep 05, 2013 at 10:30 AM
In case the above does not work for you. It is possible to work around it using PropertyDrawers
Editor code
[CustomPropertyDrawer(typeof(EnumAttr))]
public class EnumEditor : PropertyDrawer {
public override void OnGUI (Rect position, SerializedProperty prop, GUIContent label) {
System.Enum v = EditorGUI.EnumPopup (position, label, (System.Enum)System.Enum.ToObject ((this.attribute as EnumAttr).enumType, prop.intValue));
prop.intValue = System.Convert.ToInt32 (v);
}
}
Class code
public class EnumAttr : PropertyAttribute {
public System.Type enumType;
public EnumAttr (System.Type enumType) {
this.enumType = enumType;
}
}
Then for a field which is an enum
[EnumAttr(typeof(Side))]
public Side side = Side.Side1;