How does one create an enum multidimensional array in Unity Inspector and make it serializable so I can call it from a different script?
public enum colors {red, blue, green, yellow, cyan, white, purple};
public int rows = 7;
public int column = 4;
public colors[,] blockColors;
private void Awake() {
blockColors = new colors[rows, column];
}
For me to manually type all 28 colors in the script is time consuming, especially, when I have to do this for hundreds of levels. Is there a way to create a table in the Inspector to make workflow faster?
I tried making blockColors
a [Serializefield]
but it doesn't work.
I've never tried coding a chart for the inspector before. Can someone please direct me to a tutorial that can help me understand how to code a chart like in the picture?
Thanks to all the answers provided I have come up with this solution:
Levels.cs
using UnityEngine;
public enum BlockColors {blank, red, blue, green, yellow, cyan, white, purple};
[System.Serializable] public class level {
#if UNITY_EDITOR
[HideInInspector] public bool showBoard;
#endif
public int rows = 9;
public int column = 9;
public BlockColors [,] board = new BlockColors [columns, rows];
}
public class Levels : MonoBehaviour {
public Level[] allLevels;
}
Editor/LevelEditor.cs
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(Levels))]
public class LevelEditor : Editor {
public bool showLevels = true;
public override void OnInspectorGUI() {
Levels levels = (Levels)target;
EditorGUILayout.Space ();
showLevels = EditorGUILayout.Foldout (showLevels, "Levels ("+levels.allLevels.Length+")");
if (showLevels) {
EditorGUI.indentLevel++;
for (ushort i = 0; i < levels.allLevels.Length; i++) {
levels.allLevels[i].showBoard = EditorGUILayout.Foldout(levels.allLevels[i].showBoard, "Board");
if (levels.allLevels [i].showBoard) {
EditorGUI.indentLevel = 0;
GUIStyle tableStyle = new GUIStyle ("box");
tableStyle.padding = new RectOffset (10, 10, 10, 10);
tableStyle.margin.left = 32;
GUIStyle headerColumnStyle = new GUIStyle ();
headerColumnStyle.fixedWidth = 35;
GUIStyle columnStyle = new GUIStyle ();
columnStyle.fixedWidth = 65;
GUIStyle rowStyle = new GUIStyle ();
rowStyle.fixedHeight = 25;
GUIStyle rowHeaderStyle = new GUIStyle ();
rowHeaderStyle.fixedWidth = columnStyle.fixedWidth - 1;
GUIStyle columnHeaderStyle = new GUIStyle ();
columnHeaderStyle.fixedWidth = 30;
columnHeaderStyle.fixedHeight = 25.5f;
GUIStyle columnLabelStyle = new GUIStyle ();
columnLabelStyle.fixedWidth = rowHeaderStyle.fixedWidth - 6;
columnLabelStyle.alignment = TextAnchor.MiddleCenter;
columnLabelStyle.fontStyle = FontStyle.Bold;
GUIStyle cornerLabelStyle = new GUIStyle ();
cornerLabelStyle.fixedWidth = 42;
cornerLabelStyle.alignment = TextAnchor.MiddleRight;
cornerLabelStyle.fontStyle = FontStyle.BoldAndItalic;
cornerLabelStyle.fontSize = 14;
cornerLabelStyle.padding.top = -5;
GUIStyle rowLabelStyle = new GUIStyle ();
rowLabelStyle.fixedWidth = 25;
rowLabelStyle.alignment = TextAnchor.MiddleRight;
rowLabelStyle.fontStyle = FontStyle.Bold;
GUIStyle enumStyle = new GUIStyle ("popup");
rowStyle.fixedWidth = 65;
EditorGUILayout.BeginHorizontal (tableStyle);
for (int x = -1; x < levels.allLevels [i].columns; x++) {
EditorGUILayout.BeginVertical ((x == -1) ? headerColumnStyle : columnStyle);
for (int y = -1; y < levels.allLevels [i].rows; y++) {
if (x == -1 && y == -1) {
EditorGUILayout.BeginVertical (rowHeaderStyle);
EditorGUILayout.LabelField ("[X,Y]", cornerLabelStyle);
EditorGUILayout.EndHorizontal ();
} else if (x == -1) {
EditorGUILayout.BeginVertical (columnHeaderStyle);
EditorGUILayout.LabelField (y.ToString (), rowLabelStyle);
EditorGUILayout.EndHorizontal ();
} else if (y == -1) {
EditorGUILayout.BeginVertical (rowHeaderStyle);
EditorGUILayout.LabelField (x.ToString (), columnLabelStyle);
EditorGUILayout.EndHorizontal ();
}
if (x >= 0 && y >= 0) {
EditorGUILayout.BeginHorizontal (rowStyle);
levels.allLevels [i].board [x, y] = (BlockColors)EditorGUILayout.EnumPopup (levels.allLevels [i].board [x, y], enumStyle);
EditorGUILayout.EndHorizontal ();
}
}
EditorGUILayout.EndVertical ();
}
EditorGUILayout.EndHorizontal ();
}
}
}
}
}
My main problem now is it won't serialize. Any change I made to the level will automatically reset on Play. How can I serialize the custom array setup from the Inspector?