删除格子里的草地和树

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();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值