public void CutGrassTree(Terrain t, FacilityGrid grid, float radius) { if (t == null) { t = Terrain.activeTerrain; } int TerrainDetailMapSize = t.terrainData.detailResolution; if (t.terrainData.size.x != t.terrainData.size.z) { return; } Vector3 position = grid.GetCenterPos(); float PrPxSize = TerrainDetailMapSize / t.terrainData.size.x; Vector3 TexturePoint3D = position - t.transform.position; TexturePoint3D = TexturePoint3D * PrPxSize; radius = radius * PrPxSize; float[] xymaxmin = new float[4]; Vector3 angleDeg = new Vector3(0f, 35f, 0f); xymaxmin[0] = TexturePoint3D.z + radius; xymaxmin[1] = TexturePoint3D.z - radius; xymaxmin[2] = TexturePoint3D.x + radius; xymaxmin[3] = TexturePoint3D.x - radius; Vector3 rt = ToolKit.GetRotatePosition(new Vector3(xymaxmin[0], 0, xymaxmin[2]), position, angleDeg); Vector3 lt = ToolKit.GetRotatePosition(new Vector3(xymaxmin[1], 0, xymaxmin[2]), position, angleDeg); Vector3 rb = ToolKit.GetRotatePosition(new Vector3(xymaxmin[0], 0, xymaxmin[3]), position, angleDeg); Vector3 lb = ToolKit.GetRotatePosition(new Vector3(xymaxmin[1], 0, xymaxmin[3]), position, angleDeg); xymaxmin[0] = ToolKit.GetMinMaxValue(new[] {rt.x, lt.x, rb.x, lb.x}, true); xymaxmin[1] = ToolKit.GetMinMaxValue(new[] {rt.x, lt.x, rb.x, lb.x}, false); xymaxmin[2] = ToolKit.GetMinMaxValue(new[] {rt.z, lt.z, rb.z, lb.z}, true); xymaxmin[3] = ToolKit.GetMinMaxValue(new[] {rt.z, lt.z, rb.z, lb.z}, false); int[,] map = t.terrainData.GetDetailLayer(0, 0, t.terrainData.detailWidth, t.terrainData.detailHeight, 0); for (int y = 0; y < t.terrainData.detailHeight; y++) { for (int x = 0; x < t.terrainData.detailWidth; x++) { Vector3 p = new Vector3(x, 0, y); p = ToolKit.GetRotatePosition(p, position, new Vector3(0, 35f, 0)); if (xymaxmin[0] > p.x && xymaxmin[1] < p.x && xymaxmin[2] > p.z && xymaxmin[3] < p.z) { map[x, y] = 0; } } } t.terrainData.SetDetailLayer(0, 0, 0, map); TreeInstance[] treeInstances = t.terrainData.treeInstances; List<int> removedIndex = new List<int>(5); List<TreeInstance> list = new List<TreeInstance>(5); for (int i = 0; i < treeInstances.Length; i++) { TreeInstance currentTree = treeInstances[i]; Vector3 currentTreeWorldPosition = Vector3.Scale(currentTree.position, t.terrainData.size) + t.transform.position; if (!grid.IsInGrid(currentTreeWorldPosition)) { list.Add(currentTree); } } t.terrainData.treeInstances = list.ToArray(); t.Flush(); }