[Unity] Rimozione dell’erba cresciuta sul terreno dagli script.
L’ho provato perché era necessario poter cancellare parzialmente l’erba cresciuta sul TERRENO nel contenuto ZOMBIE a cui sto lavorando.
Per prima cosa, posizionate un cubo trasparente nel campo e impostate il collider su ‘is trigger’.
Posizionare il cubo nella posizione appropriata in modo che si sovrapponga all’area erbosa di TERRAIN.
Quindi, creare un nuovo script e collegarlo al cubo. Il nome dello script è appropriato.
Di seguito è riportato il codice per rimuovere l’erba dall’area a contatto con il cubo.
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); }
Se il terreno è uguale a quello di destinazione in ontriggerenter, viene richiamata la funzione cleargrass.
grassClearRadius è il raggio con cui l’erba viene cancellata. detailLayer è lo strato di erba.
I dati originali del terreno non vengono distrutti all’avvio. Se non si inserisce questo parametro, anche i dati al termine dell’esecuzione verranno modificati.
In ClearGrass, viene eliminata l’erba entro l’intervallo specificato dalla posizione del cubo.