[Unity] 从脚本中移除生长在地形上的草。


我之所以测试这个功能,是因为在我正在制作的 “僵尸 “内容中,有必要部分清除 “土地 “上生长的草。

首先,在场地中放置一个透明立方体,并将碰撞器设置为 “是触发器”。

将立方体放置在适当的位置,使其与《土地》中长满草的区域重叠。

接下来,创建一个新脚本并将其附加到立方体上。脚本的名称要恰当。

下面是删除与立方体接触区域的草的代码。

    public float grassClearRadius = 5f;
    public int detailLayer = 0;

    private Terrain terrain;

    void Start()
    {
        terrain = Terrain.activeTerrain;



        TerrainData runtimeData = Instantiate(terrain.terrainData);
        terrain.terrainData = runtimeData;


    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject == terrain.gameObject)
        {
            ClearGrass(transform.position, grassClearRadius);
        }
    }

    void ClearGrass(Vector3 pos, float radius)
    {
        if (terrain == null) return;

        TerrainData data = terrain.terrainData;
        int detailResolution = data.detailResolution;

        Vector3 terrainPos = pos - terrain.transform.position;
        int centerX = (int)(terrainPos.x / data.size.x * detailResolution);
        int centerY = (int)(terrainPos.z / data.size.z * detailResolution);
        int size = Mathf.CeilToInt(radius / data.size.x * detailResolution);

        int[,] cleared = new int[size, size];
        data.SetDetailLayer(centerX - size / 2, centerY - size / 2, detailLayer, cleared);
    }

如果地形与 ontriggerenter 中的目标地形相同,则会调用 cleargrass 函数。

grassClearRadius 是清除草地的半径。 detailLayer 是草地的层数。

在启动过程中,地形的原始数据不会被破坏。如果不输入,执行结束后的数据也会被编辑。

在 ClearGrass 中,方块位置指定范围内的草会被删除。