public override void OnInspectorGUI()
        {
            TerrainSegment terrain = (TerrainSegment)target;

            DrawDefaultInspector();

            if (terrain.GetMesh() == null || terrain.GetComponent <EdgeCollider2D>() == null || terrain.GetComponent <MeshFilter>() == null || terrain.GetComponent <MeshRenderer>() == null)
            {
                SetupTerrainEditor(terrain);
            }
            else
            {
                RunTerrainEditor(terrain);
            }
        }
        /// <summary>
        /// Allows the user to edit the length, depth and hill curves of the terrain
        /// </summary>
        private void RunTerrainEditor(TerrainSegment terrain)
        {
            // Terrain Curve
            terrain.terrainDescription = EditorGUILayout.CurveField("Terrain Description", terrain.terrainDescription);
            EditorGUILayout.Separator();

            // Terrain Size Parameters
            terrain.baseDepthOfTerrain = EditorGUILayout.FloatField("Terrain Depth", terrain.baseDepthOfTerrain);
            Vector2 terrainSize = EditorGUILayout.Vector2Field("Terrain Scaler", new Vector2(terrain.unitScale, terrain.maxHeight));

            terrain.unitScale  = terrainSize.x;
            terrain.maxHeight  = terrainSize.y;
            terrain.trimOffset = EditorGUILayout.FloatField("Trim Offset", terrain.trimOffset);
            EditorGUILayout.Separator();

            // Terrain UVs and vertices
            terrain.uvMode = (UVMappingMode)EditorGUILayout.EnumPopup("UV Mapping Mode", terrain.uvMode);
            if (terrain.uvMode == UVMappingMode.TILING)
            {
                terrain.pixelsPerUnit = EditorGUILayout.IntField("Pixels per Unit", terrain.pixelsPerUnit);
            }
            int originalVertexDensity = terrain.numberOfPoints;

            terrain.numberOfPoints = EditorGUILayout.IntField("Vertex Density", terrain.numberOfPoints);
            EditorGUILayout.Separator();

            // Terrain Materials
            terrain.SetMaterial((Material)EditorGUILayout.ObjectField("Terrain Material", terrain.GetMaterial(), typeof(Material), true));
            terrain.SetTrimMaterial((Material)EditorGUILayout.ObjectField("Trim Material", terrain.GetTrimMaterial(), typeof(Material), true));

            // Recalculate Terrain Mesh
            if (terrain.numberOfPoints != originalVertexDensity)
            {
                terrain.Setup(terrain.numberOfPoints, terrain.createEdge, 0);
            }
            terrain.RecalculateTerrainFromCurve();
        }
        /// <summary>
        /// Called if the terrain hasn't been setup yet or
        /// if the terrain GameObject is missing any components
        /// </summary>
        private void SetupTerrainEditor(TerrainSegment terrain)
        {
            if (terrain.gameObject.name == "GameObject")
            {
                terrain.gameObject.name = "Terrain";
            }

            if (terrain.GetComponent <EdgeCollider2D>() == null)
            {
                terrain.gameObject.AddComponent <EdgeCollider2D>();
            }
            if (terrain.GetComponent <MeshFilter>() == null)
            {
                terrain.gameObject.AddComponent <MeshFilter>();
            }
            if (terrain.GetComponent <MeshRenderer>() == null)
            {
                MeshRenderer newRenderer = terrain.gameObject.AddComponent <MeshRenderer>();
                newRenderer.receiveShadows = false;
                //newRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
            }

            terrain.Setup(terrain.numberOfPoints, terrain.createEdge, 0);
        }