- Home /
How to make custom 2 dimensional enum array class
I wanted to know how I can make my own custom 2 dimensional enum array class. I found a similar article online and here's what I've come up with:
 public enum myEnum { value1, value2, value3, value4, value5 };
 
 [System.Serializable]
 public class myClass {
 
     public int columns = 9;
     public int rows = 9;
     public myEnum[] myArray = new myEnum [ columns * rows ];
 
     public myEnum this [ int x, int y ] {
         get {
             return myArray [y * columns + x];
         } set { 
             myArray  [y * columns + x] = value;
         }
     }
 }
Now I can call my array like this:
 myClass myNewClass = new myClass ();
 myNewClass [2,5] = myEnum.value3 // Set value
Instead of using myNewClass [2,5] I wanted to use myNewClass.myArray [2,5]. How do I go about doing that? I don't want to use Unity's original multidimensional method since it doesn't serialize in the inspector.
Answer by Bunny83 · Mar 31, 2018 at 08:31 PM
That's not possible unless your "myArray" is actually a custom class / struct which provides an indexer. Indexer can only be defined in classes / structs.
You can create a class like this:
 [System.Serializable]
 public class Serializable2DimArray<T>
 {
     private int m_Columns = 1;
     [SerializeField]
     private T[] m_Data;
     public T this [ int aCol, int aRow ]
     {
         get { return m_Data[aRow * m_Columns + aCol]; }
         set { m_Data[aRow * m_Columns + aCol] = value; }
     }
     public int Columns {get { return m_Columns; }}
     public int Rows { get { return m_Data.Length / m_Columns; }}
     public Serializable2DimArray(int aCols, int aRows)
     {
         m_Columns = aCols;
         m_Data = new T[aCols * aRows];
     }
 }
With this struct you can simply declare a serializable 2-dimensional array for any type. Something like this:
 [System.Serializable]
 public class MyEnum2DimArray : Serializable2DimArray<myEnum> { }
This "type" can be used in any other serializable class just like a normal 2 dim array. The only exception is that you would create an array with "method brackets" instead of index brackets:
 public MyEnum2DimArray myArray = new MyEnum2DimArray(2, 3);
Of course when you want to edit this array in the inspector you most likely need a propertydrawer for this class. The array length always has to be a multiple of the column count. Though it's not clear for what purpose you actually need this 2dim array. It's difficult to actually display a 2dim array if you have a large column count
That's good knowledge. I'm just curious to see how Unity sets up their 2D array and how I can customize my own. I've already set up my own table in the inspector for such a class. I'm just wondering how unity does theirs.
Your answer
 
 
              koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                