public void SetTempContainerToScriptable(LevelDataWall scriptable, LevelDataWallContainer container)
 {
     scriptable.Tiles          = container.TileList.ToArray();
     scriptable.Walls          = container.WallList.ToArray();
     scriptable.Size           = container.Data1;
     scriptable.StartPositionX = container.Data2.Item1;
     scriptable.StartPositionY = container.Data2.Item2;
     EditorUtility.SetDirty(scriptable);
 }
    void OnGUI()
    {
        EditorWindow window = this;

        prefabSettings = (PrefabSettingsWall)EditorGUILayout.ObjectField(
            "Prefab Settings Wall:", prefabSettings, typeof(PrefabSettingsWall), false);


        if (UseSingle)
        {
            GUILayout.Label("Convert CSV level files to Target type");

            CsvFile = (TextAsset)EditorGUILayout.ObjectField(
                "SourceCSV: ", CsvFile, typeof(TextAsset), false);

            LevelData = (LevelDataWall)EditorGUILayout.ObjectField(
                "Existing Target:", LevelData, typeof(LevelDataWall), false);

            CreateNewScriptableObject =
                EditorGUILayout.Toggle("CreateNewTarget:", CreateNewScriptableObject);
            ScriptableObjectName = EditorGUILayout.TextField("NewSOName", ScriptableObjectName);

            if (GUILayout.Button("CONVERT"))
            {
                LevelDataWallContainer container = ParseCsv(CsvFile);

                if (CreateNewScriptableObject)
                {
                    LevelData = (LevelDataWall)ScriptableObject.CreateInstance(typeof(LevelDataWall));

                    AssetDatabase.CreateAsset(LevelData,
                                              $"{ParentFolderPath}/{ScriptableObjectName}.asset");
                }

                SetTempContainerToScriptable(LevelData, container);
                EditorUtility.SetDirty(LevelData);

                this.Close();
            }
        }
        else
        {
            GUILayout.Label("Convert list of CSV files to Target type ");
            ScriptableObjectBaseName =
                EditorGUILayout.TextField("TargetBaseName", ScriptableObjectBaseName);

            ScriptableObjectNameFirstNumber =
                EditorGUILayout.IntField("StartNumberingFrom...", ScriptableObjectNameFirstNumber);

            ScriptableObject   target           = this;
            SerializedObject   so               = new SerializedObject(target);
            SerializedProperty CsvFilesProperty = so.FindProperty("CsvFiles");
            EditorGUILayout.PropertyField(CsvFilesProperty, true);
            so.ApplyModifiedProperties();


            if (GUILayout.Button("CONVERT"))
            {
                int i = 0;
                foreach (var file in CsvFiles)
                {
                    LevelDataWallContainer container = ParseCsv(file);

                    LevelData = (LevelDataWall)ScriptableObject.CreateInstance(typeof(LevelDataWall));

                    AssetDatabase.CreateAsset(LevelData,
                                              $"{ParentFolderPath}/{ScriptableObjectBaseName}{ScriptableObjectNameFirstNumber + i}.asset");

                    SetTempContainerToScriptable(LevelData, container);
                    i++;
                }

                this.Close();
            }
        }
    }
    public LevelDataWallContainer ParseCsv(TextAsset csvFile)
    {
        char splitter = ';';
        LevelDataWallContainer cont = new LevelDataWallContainer();

        string[] lines = csvFile.text.Split('\n');
        cont.Data1 = int.Parse(lines[0].Split(splitter)[1]); // Size
        string[] line1Arr = lines[1].Split(';');
        cont.Data2 = new Tuple <int, int>(int.Parse(line1Arr[1]), int.Parse(line1Arr[2]));

        char[] levelObjectChars = prefabSettings.TileCharList;
        char[] wallChars        = prefabSettings.WallCharList;

        int wallSectionStart = 2 + cont.Data1;
        int wallSectionEnd   = wallSectionStart + 1 + cont.Data1 * 2;

        for (int i = 2; i < wallSectionStart; i++)
        {
            string[] aLine = lines[i].Split(splitter);
            for (int j = 0; j < cont.Data1; j++)
            {
                if (string.IsNullOrEmpty(aLine[j]))
                {
                    throw new Exception("Empty block in Tile section J=" + j);
                }
                char c = aLine[j].ToCharArray()[0];
                for (int k = 0; levelObjectChars.Length > k; k++)
                {
                    if (c == levelObjectChars[k])
                    {
                        cont.TileList.Add(k);
                    }
                }
            }
        }

        for (int i = wallSectionStart; i < wallSectionEnd; i++)
        {
            string[] aLine = lines[i].Split(splitter);
            for (int j = 0; j < cont.Data1 + 1; j++)
            {
                if (string.IsNullOrEmpty(aLine[j]))
                {
                    cont.WallList.Add(-1);
                }
                else
                {
                    char c = aLine[j].ToCharArray()[0];
                    for (int k = 0; wallChars.Length > k; k++)
                    {
                        if (c == wallChars[k])
                        {
                            cont.WallList.Add(k);
                        }
                    }
                }
            }
        }

        return(cont);
    }