Custom Editor Dynamic 2D array

I have a 2D grid that needs to be filled with numbers. I searched and tried multiple solutions online but they either deleted or did not work.

In the first image, when I select Grid Size to be small then I get 4 by 4 matrix or 16 intFields in total.

160505-2020-05-27-12-57-36-mail.png

In the second image, when I select Grid Size to be huge then I get 7 by 7 matrix

160506-2020-05-27-12-57-51-mail.png

The scripts are level and levelEditor. The level script is a scriptable object whereas levelEditor is a custom editor.

The problem here is that the intFields are generated by the levelEditor and they aren’t linked to level since I am not knowing how to do it. The second problem is whenever I write anything into the fields , it is stuck to 0.

Here is the code for level script:

using UnityEngine;


[CreateAssetMenu(fileName = "New Level", menuName = "Levels/level", order = 1)]
public class Level: ScriptableObject
{

    public int number;
    public Constants.Difficulty difficulty;
    public Constants.GridSize gridSize;
   // tried different things here like list of list, 2d arrays and a class (row) of cols then an array of rows 

}

Here is the code for the levelEditor:

using System;
using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(Level))]
public class LevelEditor : Editor
{
    public override void OnInspectorGUI()
    {

        Level l = (Level) target;

        int[,] fieldsArray = new int[0, 0];

        EditorGUILayout.BeginHorizontal();
            GUILayout.Label("Number");
            GUILayout.Label("Difficulty");
            GUILayout.Label("Grid Size");
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
            l.number = EditorGUILayout.IntField(l.number);
            l.difficulty = (Constants.Difficulty) EditorGUILayout.EnumPopup(l.difficulty);
            l.gridSize = (Constants.GridSize)EditorGUILayout.EnumPopup(l.gridSize);
        EditorGUILayout.EndHorizontal();
        

        int gridSize = 4;
        if (l.gridSize == Constants.GridSize.Medium) gridSize = 5;
        else if (l.gridSize == Constants.GridSize.Large) gridSize = 6;
        else if (l.gridSize == Constants.GridSize.Huge) gridSize = 7;

        //below is of interest, also tried a lot of solutions 
        GUILayout.Label("Equation");

        if (gridSize != fieldsArray.GetLength(0) || gridSize != fieldsArray.GetLength(1))
        {
            fieldsArray = new int[gridSize, gridSize];
        }

        for (int j = 0; j < gridSize; j++)
        {
            EditorGUILayout.BeginHorizontal();
            for (int i = 0; i < gridSize; i++)
            {
                fieldsArray[i, j] = EditorGUILayout.IntField(fieldsArray[i, j]);
            }
            EditorGUILayout.EndHorizontal();
        }

    }
}

int[,] fieldsArray = new int[0, 0];

it is called each frame in GUI, so created each frame and destroyed at the end of function. just put it outside ? XD