[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에서 큐브의 위치에서 지정한 범위의 풀을 삭제하고 있습니다.