[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.