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