public static float DrawCircle(PolyLine line, Vector3 center, float radius, Color color, Vector3[] corners, List <Terrain> terrains, List <Rect> terrainRects, Transform parent = null) /// It will return an average height BTW almost for free :) { int numCorners = corners.Length; float step = 360f / (numCorners - 1); Terrain prevTerrain = null; Rect prevRect = new Rect(); for (int i = 0; i < corners.Length; i++) { //corner initial position Vector3 corner = new Vector3(Mathf.Sin(step * i * Mathf.Deg2Rad), 0, Mathf.Cos(step * i * Mathf.Deg2Rad)) * radius + center; //checking if the corner lays within the same terrain first Terrain terrain = null; if (prevRect.Contains(new Vector2(corner.x, corner.z))) { terrain = prevTerrain; } //finding proper terrain in all terrains in it's not in rect else { int rectsCount = terrainRects.Count; for (int r = 0; r < rectsCount; r++) { if (terrainRects[r].Contains(new Vector2(corner.x, corner.z))) { terrain = terrains[r]; prevTerrain = terrains[r]; prevRect = terrainRects[r]; break; } } } //sampling height corners[i] = corner; if (terrain != null) { corners[i].y = terrain.SampleHeight(corner); } } line.DrawLine(corners, color, lineThickness, zMode: PolyLine.ZMode.Overlay, offset: 0, parent: parent); //Handles.DrawAAPolyLine(lineThickness, corners); //adjusting center height float heightSum = 0; for (int i = 0; i < corners.Length; i++) { heightSum += corners[i].y; } return(heightSum / (corners.Length - 1)); }