던전 룸 템플릿을 만들기 전에 먼저 레이어와 정렬 레이어들에 대해서 정확히 이해하고 개발하자.
레이어는 유니티에서 오브젝트가 어떤 게임 오브젝트, 컴포넌트와 상호작용 할 것인지를 정의하는 개념이다. 일반적인 용도는 특정 레이어의 개체만 렌더링하도록 카메라에 레이어가 사용되기도 한다. 저번 개발에서 설정한 Camera의 Culling Mask가 그러한 레이어를 설정한 것이라고 할 수 있다.
여기서 Camera2, Minimap, Camera3는 선택되지 않은 레이어로 메인 카메라는 해당 레이어는 렌더링하지 않는다. 이처럼 레이어는 카메라가 특정 항목만 렌더링하는데 사용하기도 한다. 또한 레이어간의 충돌도 설정할 수 있다.
프로젝트 설정의 Physics 2D에서 레이어 간의 물리적 충돌을 활성화하거나 서로 상호작용하지 않고 물리적 충돌을 아예 비활성화 할 수도 있다.
또한 특정 클래스의 메소드들을 'Layer Mask'를 통해 특정 레이어의 오브젝트에만 해당 메소드가 적용되도록 할 수 있다.
Sorting Layer, 정렬 레이어는 스프라이트 렌더러(스프라이트 렌더러, 타일맵 렌더러)에 사용된다. 레이어와 동일하게 'Layers'를 드롭 다운해서 생성하고 관리할 수 있다.
개발할 게임의 정렬, 타일맵 렌더러는 아래 사진과 같다.
위 사진을 보면 벽의 윗부분은 Front 정렬 레이어에 그려지기 때문에 instance 정렬 레이어인 캐릭터는 벽 뒤에 나타난다. 그에 반해 캐릭터가 벽 앞에 있을때는 아래 사진과 같다.
캐릭터가 벽 앞으로 오면 벽이 Groud 정렬 레이어로 그려지면서 instance의 뒤, 즉 캐릭터의 뒤에 벽이 위치하게 된다. 이처럼 정렬 레이어를 통해 렌더링할 레이어의 순서를 지정하고 관리할 수 있다.
빈 오브젝트 RoomTemplate를 생성해준다. Layer를 Room으로 설정한다.
box collider 2D를 추가해주고 is Trigger를 체크한다. 이렇게 룸 템플릿에 박스 콜라이더 2D(Is Trigger)를 추가해준 이유는 플레이어가 해당 룸에 들어갔는지를 인식하기 위해서이다.
그 다음 RoomTemplate 자식으로 Rectangular 타일맵을 하나 생성해주고 추가해준다.
이때 Tilemap1_Ground라는 이름으로 Rename해주고 Tag와 Sorting Layer를 Ground(Tilamap)로 설정해주고 Order in Layer를 1로 설정한다. 이러한 방식으로 Decoration1, Decoration2, Front, Collision, minimap을 생성해준다. 자세한 Tag, Layers, Sorting Layer, Order in Layer는 아래 사진처럼 설정해준다.
Collision Tilemap에는 Tilemap Collider 2D, Rigidbody 2D, Composite Collider 2D를 추가해주고 Tilemap Collider 2D의 Used By Composite를 체크, Rigidbody2D의 Body Type을 Static으로, Composite Collider 2D의 Geometry Type을 Polygons로 설정해준다.
생성한 모든 Tilemap을 선택한 후에 Tilemap Renderer의 Material을 DungeonLightShader_Dimmed로 설정한다.
이 셰이더는 플레이어가 방문하는 방의 밝기와 밝기를 조절할 때 사용할 예정이다.
Collision Tilemap을 Tile Palette로 살펴보면 초록색, 보락색(+반쪽) 타일이 있는데 보라색 타일은 충돌 타일이고 초록색 타일은 알고리즘에 사용할 것이다. 타일맵에 표시해서 적이 걸어갈 수 있는 경로를 표시할 것이다.
Collision Tile을 Sprite Editor로 열어서 Custom Physics shape를 선택하면 충돌 타일을 위해 정의된 형태를 확인할 수 있다.
환경 오브젝트(꽃병, 술통, 책상)가 위치할 빈 오브젝트 Environment를 RoomTemplate 자식으로 생성해준다.
이제 만든 Room Template를 Assets > Prefabs > Dungeon > Rooms 경로에 프리팹화 시켜준 후에 삭제한다.
이제 룸 템플릿이 완성됐다.