Unity - Make Terrain 설명문서

허재성·2024년 1월 1일
0

Unity

목록 보기
1/1

구현 주제

실외 자연 지형(Terrain)을 직접 만들고, 탈것을 이용한 플레이어 조작을 통해 제작된 지형을 구경
할 수 있도록 한다.
태양의 움직임을 조절하여서, 낮과 밤을 구현하고, 많은 조명 시스템을 추가하고 조명 프로브 와 반사 프로브 등을
적용하여 프레임의 성능을 높인다.

개발 내용

0. Make Terrain

0-1. 지형 제작

Terrain 객체를 생성하여 지형을 제작하기 시작했습니다. 평평한 Plane 형태에서
‘Raise or Lower Terrain’ 과 ‘Set Height’, ‘Smooth Height’ 기능을 활용하여 적절한
고도의 형태와 자연스러운 곡선의 형태를 나타내었습니다.
Brush Tool을 다양하게 사용하기 위해서, ‘Terrain Sample Asset Pack’을 Unity
Asset Store 에서 import 하여 사용하였습니다. 해당 Asset에는 더 다양한 Brush
Tool 과 지형에 활용할 적절한 Texture를 제공해주어, 원활한 지형 제작 작업을
할 수 있었습니다.

0-2. 텍스처 매핑

텍스처 매핑을 위해서, ‘Paint Texture’ 기능을 활용하였으며, Layer Palette에 여러
가지 텍스처 레이어를 두고 Base Texture 부터 다양한 Detail Texture까지 Stroke
를 조절하면서 적절하게 그려주었습니다.

Base Texture위에 이동 경로를 알아볼 수 있도록 표현해주었고, 그 밖에도, 지형
에 붙어있는 바위, 자갈에는 Normal Map을 활용하여 Normal Scale을 조정하여서
좀더 입체적인 질감을 표현했습니다.

또한 물의 경계 근처의 땅은 일부 텍스처의 Smoothness를 높게 조절하여서 젖은
땅의 질감이 느껴지도록 표현하였습니다.

0-3. 나무 배치

허전한 지형을 채우기 위한 첫 번째 작업으로 나무를 배치해 주었습니다. 나무는
Unity Asset Store에서 Import 하여, ‘Paint Tree’ 기능을 선택 후, 총 3가지 종류의
나무를 추가하여 활용하였으며, 나무의 높이는 랜덤으로 설정하여 ‘Mass Place
Trees‘ 기능을 활용하여, 맵 전체에 골고루 분포 시킨 후, 이동 경로에 따라 잘못
배치되어있는 나무들을 제거해주는 방식으로 배치하였습니다. 고루 배치되지 않
은 부분들은 Brush를 통해 수작업으로 배치해주었습니다.

0-4. 잔디 배치

텍스처만으로 지형의 바닥을 표현하기에 부족했기에, Unity Asset Store에서 잔디
Asset을 가져와 배치해주었습니다.
잔디는 ‘Paint Detail’ 기능을 선택 후, 잔디 텍스처를 리스트에 추가시킨 후, Base
Grass Texture를 먼저 그려준 후, 크기와 색감이 튀는 조화들을 곳곳에 같은 자리
에 배치해주었습니다.
‘Opacity’ 와 ‘Target Strength’를 조절해주어, 잔디가 한 곳에 너무 촘촘하게 배치
되는 것을 방지하였습니다.

지형 구조 결과

1. Post-Processing

Post-Processing의 기능 중 다음과 같은 기능들을 적용해주어, 추가적인 시각효과를
입히고, 그래픽의 품질을 향상시켰습니다.

1. 블룸

높은 밝기의 영역 주변에 빚을 만들어주어 물체 주위에 빛이 반사됨을
표현했습니다.

2. DOF(Depth of Field)

플레이어 시점을 기점으로 거리에 따라 전경이나
배경을 흐리게 만들어주었습니다.

3. 모션 블러

물체나 카메라의 움직임에 따라 그 움직임에 대한 흔들리는
효과를 부여하여 자연스러움을 높혔습니다.

4. 안티 앨리어싱

그림자에 따른 계단현상이나 주변의 경계를 부드럽게하여,
부드러움과 자연스러움을 높혔습니다.

2. Light-Probe (Baked Light Map)

동적인 조명계산을 빠르게 갱신하고, 런타임시 불필요한 조명 계산을 피하고 성능을
최적화하기 위해,조명 프로브를 적용하였습니다.
조명이 많이 필요한 환경을 갖추기 위해서, 마을을 배치하고 곳곳마다 다량의
조명들을 추가시켜주었습니다.
정적인 객체들을 런타임시에 실시간으로 조명연산을 할 필요가 없었고, FrameRate
측면에서도 안좋은 성능을 보였습니다.

Light Probe Group을 생성하여, Probe들을 반경에 맞게 복사 배치해주고 Baked
하기전, 정적인 객체들은 static 속성을 가지도록 inspector 창에서 체크를
해주었으며, 낮과 밤에 따라 그림자나 조명연산이 매 프레임마다 바뀌는 지형이나,
플레이어와 같은 동적인 객체들은 static 속성을 해제해주었습니다.
맵에 있는 모든 조명들은 Baked 모드로 설정해주었고, Baked Shadow Radius도
적절하게 설정해주었습니다.
이제, 모든 프로브들을 배치해주고 Rendering->Lighting 속성에서 새로운 Lighting
Setting Asset을 만들고, Bake 해주었습니다.
하지만, Bake 할 때 굽는 시간이 너무 많은 3-4일 정도의 예상 시간이 떴습니다.. 그
원인을 계속 찾아보았고 원인은, 지형에 나무나 잔디같은 요소들은 Bake 대상에
포함시키지 말아야 했습니다.
때문에 Terrain 속성에서, Bake Light Probes For Trees 를 해제하고 굽기를
시도했더니 1시간 ~ 30분 정도로 굽는시간이 줄어들었습니다.

구운 이후, Baked Lightmaps 창에는, Lighting Data Asset 이 생성되었습니다.
모든 과정을 마친 이후, 런타임시에 그 전보다 프레임 성능이 향상된 면을
보였습니다.

3. Reflection-Probe

조명 뿐만아니라, 많은 연산처리를 하며, 반사되는 물 객체들에도 반사 프로브를
적용해주었습니다. 과제2에서 반사프로브를 넣어주었지만 잘못 적용되고 있었음을
볼 수 있었고, 그 부분들을 이번 과제 때 올바르게 구워주어 연산량을 줄였습니다.

4. Day & Night

마지막으로 낮 밤을 구현했습니다. 태양의 움직임을 스크립트로 작성하고. 태양의
X축 회전값에 따라서, 낮 밤을 판별하고 Fog의 값과 SkyBox의 Exposure 값을
조절해주면서 낮과 밤을 표현했습니다.
시간은 게임에 맞게 적절하게 시간을 변환해주었습니다.

Night

Day

profile
초짜 개발자

0개의 댓글