[Unity] Suppression de l’herbe poussant sur le terrain dans les scripts.
Je l’ai testé car il était nécessaire de pouvoir effacer partiellement l’herbe cultivée sur TERRAIN dans le contenu ZOMBIE sur lequel je travaille.
Tout d’abord, placez un cube transparent dans le champ et réglez le collider sur ‘is trigger’.
Placez le cube à l’endroit approprié de manière à ce qu’il recouvre la zone herbeuse de TERRAIN.
Ensuite, créez un nouveau script et attachez-le au cube. Le script est nommé de manière appropriée.
Vous trouverez ci-dessous le code permettant d’enlever l’herbe de la zone en contact avec le cube.
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); }
S’il s’agit du même terrain que le terrain cible dans ontriggerenter, la fonction cleargrass est appelée.
grassClearRadius est le rayon auquel l’herbe est nettoyée. detailLayer est la couche d’herbe.
Les données originales du terrain ne sont pas détruites au démarrage. Si vous ne l’indiquez pas, les données seront également modifiées après la fin de l’exécution.
Dans ClearGrass, l’herbe située dans l’intervalle spécifié par rapport à la position du cube est supprimée.