[Unity] Entfernen von auf Terrain gewachsenem Gras aus Skripten.


Ich habe dies getestet, weil es notwendig war, das Gras, das auf TERRAIN wächst, in dem ZOMBIE-Inhalt, an dem ich arbeite, teilweise löschen zu können.

Platzieren Sie zunächst einen transparenten Würfel auf dem Feld und setzen Sie den Kollider auf „ist ausgelöst“.

Platzieren Sie den Würfel an der entsprechenden Stelle, so dass er die Grasfläche in TERRAIN überlappt.

Als nächstes erstellen Sie ein neues Skript und verbinden es mit dem Würfel. Das Skript wird entsprechend benannt.

Im Folgenden finden Sie den Code zum Entfernen des Grases aus dem Bereich, der mit dem Würfel in Kontakt steht.

    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);
    }

Wenn es sich um dasselbe Terrain wie das Zielterrain in ontriggerenter handelt, wird die Funktion cleargrass aufgerufen.

Der grassClearRadius ist der Radius, in dem das Gras gerodet wird. detailLayer ist die Grasschicht.

Die Originaldaten des Terrains werden beim Start nicht zerstört. Wenn Sie dies nicht angeben, werden die Daten nach Beendigung der Ausführung ebenfalls bearbeitet.

Bei ClearGrass wird das Gras im angegebenen Bereich um die Position des Würfels gelöscht.