[Unity] Terrain에 심은 풀을 스크립트에서 지우기


지금 만들고 있는 좀비비기 콘텐츠 중 지형에 자란 풀을 부분적으로 지울 수 있도록 해야 할 필요성이 생겨서 테스트해봤습니다.

먼저 투명한 큐브를 필드 내에 배치하고, 콜리더를 ‘is trigger’로 설정합니다.

적당한 위치에 큐브를 배치하고, 지형에 풀이 자라고 있는 곳에 겹치도록 배치합니다.

그런 다음 새 스크립트를 만들어 큐브에 붙인다. 스크립트의 이름은 적당히 지어줍니다.

아래는 큐브에 닿는 부분의 풀을 지우는 코드입니다.

    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에서 대상 terrain과 동일한 terrain이면 cleargrass 함수를 호출한다.

grassClearRadius는 풀을 지울 반경, detailLayer는 풀의 레이어.

start에서 terrain의 원본 데이터를 파괴하지 않도록 하고 있습니다. 이 함수를 넣지 않으면 실행 종료 후 데이터도 편집된 기억이 있습니다.

ClearGrass에서 큐브의 위치에서 지정한 범위의 풀을 삭제하고 있습니다.