[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 中,方块位置指定范围内的草会被删除。




![[Unity] 在 Photon 的 PUN2 中任意时间执行方法。](https://kuroko-labo.com/wp/wp-content/themes/kuroko3/images/noimage.png)
![[Unity]我用 Gaia Pro 2023 制作了一块田地。](https://kuroko-labo.com/wp/wp-content/uploads/2025/01/image06.png)
![[Unity]我买了一个旧电视滤波器。](https://kuroko-labo.com/wp/wp-content/uploads/2019/11/image05.png)
![[Unity]尝试创建一个圆规,当鼠标点击时,圆规会向前移动。](https://kuroko-labo.com/wp/wp-content/uploads/2019/07/circle.fw_.png)
![[Unity]使用 localPosition 创建类似传送带的系统。](https://kuroko-labo.com/wp/wp-content/uploads/2019/06/image01-1.png)
![[Unity]获取并显示鼠标坐标](https://kuroko-labo.com/wp/wp-content/uploads/2019/03/image02.png)