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