[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 裡,立方體位置指定範圍內的草會被刪除。