[Unity] 移除腳本中長在地形上的草。
我之所以測試這個功能,是因為在我正在製作的 ZOMBIE 內容中,必須能夠部分刪除 TERRAIN 上長出的草。
首先,在欄位中放置一個透明立方體,並將碰撞器設定為「是觸發」。
將立方體放置在適當的位置,使其與 TERRAIN 中長草的區域重疊。

接下來,建立一個新的指令碼並附加到立方體上。腳本的名稱要適當。
以下是將草從與立方體接觸的區域移除的程式碼。
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 是草地的層數。
地形的原始資料在 start 時不會被破壞。如果您不放入這項,執行完成後的資料也會被編輯。
在 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)