public void OnEnable()
        {
            TileableTerrainMaker targetScript = (TileableTerrainMaker)target;
            GameObject           gO           = targetScript.gameObject;

            baseTerrain = gO.GetComponent <Terrain>();
            if (baseTerrain == null)
            {
                EditorUtility.DisplayDialog("Error", "This script only works with terrains!", "OK");
                DestroyImmediate(targetScript);
            }
            else
            {
                effectedRegionWidth = serializedObject.FindProperty("effectedRegionWidth");
                columns             = serializedObject.FindProperty("columns");
                rows     = serializedObject.FindProperty("rows");
                terrains = serializedObject.FindProperty("terrains");

                showFoldout    = serializedObject.FindProperty("showFoldout");
                onlyTileInner  = serializedObject.FindProperty("onlyTileInner");
                onlyTileOuter  = serializedObject.FindProperty("onlyTileOuter");
                emptyLocations = serializedObject.FindProperty("emptyLocations");
                smoothEdges    = serializedObject.FindProperty("smoothEdges");

                targetScript.terrains[0] = baseTerrain;
                maxWidth = baseTerrain.terrainData.heightmapResolution / 2;
            }
        }
        private void RestoreAlphaMaps()
        {
            TileableTerrainMaker targetScript = (TileableTerrainMaker)serializedObject.targetObject;

            if (targetScript.backupAlphaMap == null)
            {
                EditorUtility.DisplayDialog("Error", "No backup alphamaps were found.", "OK");
            }
            else
            {
                targetScript.backupAlphaMap.RestoreAlphaMaps();
            }

            targetScript.backupAlphaMap = null;
        }
        void MakeAlphaMapTileable()
        {
            PortionToTile portionToTile = DeterminePortionToTile(onlyTileInner.boolValue, onlyTileOuter.boolValue);

            Terrain[,] terrains2D = GetTerrainsFromTerrainsProperty();

            TerrainErrorChecker errorChecker = new TerrainErrorChecker(terrains2D, portionToTile, emptyLocations.boolValue);

            if (!errorChecker.ProceedWithAlphamapTiling())
            {
                return;
            }

            TerrainData[,] data = EditorTerrainTools.Get2DTerrainDataArrayFrom2DTerrainArray(terrains2D);

            //Can only occur when the alpha maps are of equal size/resolution, so don't worry about error checking
            TileableTerrainMaker targetScript = (TileableTerrainMaker)serializedObject.targetObject;

            targetScript.backupAlphaMap = new AlphamapBackupController(data);

            AlphamapTiler alphaTiler = new AlphamapTiler(data, effectedRegionWidth.intValue);

            alphaTiler.TileAlphamaps(portionToTile);
        }