cyphen156
Unity6 레벨디자인 기초 본문
레벨 디자인이라 함은 씬 하나를 기준을 삼아 게임 플레이에 필요한 리소스들을 모두 저장소에서 메모리로 가져오기 위한 일종의 프로젝트 패키징 이라고 볼 수 있다.
다른말로는 맵이라고도 불리고 있으며, 게임을 진행할 때 로딩중...이라고 뜰 경우가 레벨 디자인(씬 또는 맵)이 변경되어 메모리에 적재되어가는 과정이라고 할 수 있다.
레벨 디자인에 포함되는 것은 씬 내의 지형, NPC와 같은 인스턴스들, 캐릭터 오브젝트들 그리고 UI와 같은 플레이할 때 사용자의 경험에 직 간접적으로 적용되는 모든것들에 대한 디자인을 포괄한다.
에셋 스토어 사용법에 대한 것은 이전 포스팅에서 다뤘으니 오늘은 에셋의 이름 정도만을 언급하고 넘어가겠다.
이전과는 다르게 3D Core(URP)프로젝트를 levelDesign이라는 이름으로 생성한다.
우선 에셋 스토어에 Unity Technologies라는 퍼블리셔를 검색해 free로 제공되는 에셋들중 다음 에셋들을 myAssets에 추가하고 다운로드하자.
로봇 카일은 사용하고싶다면 사용해도 좋다.
Terrain(지형)
씬을 만들 때 가장 먼저 하게되는것이 바로 지형지물을 만들어 사용자가 플레이하게될 공간을 구성하는 것이다. 기본적으로 디자이너가 2D원화로 만들면 3D 모델러가 세세한 지형지물 모델을 만들어서 클라이언트 프로그래머에게 전달하는 방식으로 일을 하게 된다고 생각해보자자
클라이언트 프로그래머가 해야 할 일은 전달 받은 모델들을 씬안에 집어넣고, 개발 기획에 맞춰 씬을 구성하고, 사용자가 씬을 플레이 할때 프레임 드랍이나, 이상한 버그 및 오작동을 경험하지 않도록 씬을 최적화 하는것이 될 것이다.
여기서 Terrain시스템이 빛을 발한다.
Terrain은 현실적으로 개발에 연관된 구성원들이 모든 사물에 대한 모델링을 만들 수 없고, 시간이 오래 걸리니 이를 최대한 줄여 비슷한 객체, 또는 동일한 객체를 씬 안에 넣는 대신 제각각 크기와 중량, 일부 구성물이 랜덤하게 변형되어 적용되도록 만들어 반복작업을 줄여 전체 프로젝트의 작업시간을 줄여주는 역할을 한다.
하지만 이 또한 화면 내에 렌더링될 요소이기 때문에 너무 많은 지형지물은 프레임 드랍을 유발 할 수 있다는 것을 유의하고 작업해야 한다.
우선 지형을 만들려면 GameObject, 3D Object - Terrain항목을 통해 불러와야 한다.
기본적으로 Terrain은 1000X1000의 크기를 가지고 있는데 1은 미터단위를 가지고 있으므로 1키로미터제곱의 넓이를 가지고 있으며, 오른 상단의 Transform을 통해 좌표, 회전각을 조정할 수 있다.
지형의 최대 크기는 Terrain컴포넌트의 맨 오른쪽 버튼(Terrain setting)을 누르면 그 안에 mesh Resolution이 있고, 여기서 조정할 수 있다. height는 지형이 갖을 수 있는 최대 높으로 지금은 보이지 않지만 나중에 산과 같은 지형지물을 만들게 되면 그 이상으로는 객체가 안만들어지는것을 통해 알 수 있다.
맨 왼쪽의 create neighbor terrain을 통해 옆의 지형을 추가, 삭제할 수 있다.
두 번째 버튼인 Paint Terrain을 통해 지형을 생성할 수 있다.
Brush Size를 잘 조절하여 원하는 범위를 맞춘 후 그림을 그리듯이 지형을 생성하자.
옵션중 Raise or Lower Trerrain은 지형을 올리거나 ctrl를 누르면 지형을 낮출 수 있으며, 여러 옵션중 Smooth Height의 경우 주변 지형과 높이 차를 부드럽게 만들어주는 역할을 한다.
Stamp는 도장찍듯이 원형 범위 전체를 끌어 올리거나 내릴 수 있으며, Set은 특정 높이로 고정하는 역할을 한다.
한가지 유의해야 할점은 Terrain은 음수 값을 갖지 않기 때문에 만약 움푹 파인 지형을 표현하고 싶다면 기본 Terrain의 높이를 전체적으로 올리거나 주변 지형을 상대적으로 높여 음푹 파인 지형을 만들 수 있다.
Paint Hole의 경우 안으로 밀어 넣는 것이 아닌 지형을 삭제하여 빈 공간으로 만들어 버리는 옵션이다.
Texture(질감)
만들어진 지형에 질감을 넣어 원하는 색상과 재질을 어느정도 표현할 수 있다. 텍스쳐는 리소스로 따로 제공되어야 하며, 기본적으로 제공되는 옵션이 몇가지 있다.
다음과 같이 브러쉬 하위 옵션중에 레이어가 존재한다. 레이어는 일종의 층수 개념으로 1층 위에 2층이 있듯, 레이어 위에 다른 레이어로 덮어 씌운다는 개념으로 보면 편하다. 이렇게 레이어를 통해 여러가지 색상의 텍스쳐를 동시에 지형에 입히는 것이 가능하다.
Paint Tree로 나무 배치하기
나무 배치의 경우 현재 지형이 너무 커서 잘 보이지 않는다. 보통 1~2M사이즈를 가지고 있고, density를 통해 지형 안에 생성되는 밀도를, Tree Height를 통해 크기를 조정할 수 있다.
풀과 같은 기타 지형지물의 경우 네번째 버튼인 Details에서 추가할 수 있다.
바람에 흩날리는 효과의 경우 다음과 같이 추가할 수 있다.
카메라 구도가 개판인건 감안하고 보세요 그냥
하늘 추가하기
하늘을 Skybox라고 부르며, 메테리얼과 셰이더를 통해 하늘을 구성할 수 있지만 이건 디자이너가 할 일이고, 보통은 에셋이나 외부 파일을 통해 하늘 프리펩을 다운받아 적용시키기만 하면 된다. 마침 우리는 DemoScene에 존재하는 Skybox에셋을 통해 하늘을 추가해 보겠다.
+++Maya, C4D같은 프로그램에서는 Background라고도 부른다.
현재는 다음과 같이 하늘이 그냥 푸른 화면으로 표현되어 있고 지면은 바둑판으로 되어있다.
다음과 같이 에셋 안에 다양한 배경 효과가 존재한다. 그냥 끌어서 넣으면 된다.
또는 다음과 같이 Window-Rendering-Lighting Settings에서 전역조명효과를 같이 생성할 수도 있다. 안개 효과를 적용했을때 파란색으로 표시되는 이유는 내 노트북이 성능이 안좋아서 그렇다....TT
오브젝트 충돌체 처리
오브젝트의 컴포넌트 옵션중에는 콜리전이라는것이 존재한다.
이것은 사물간의 충돌에 대해 처리하는 옵션인데 이것이 없다면 오브젝트들은 그냥 홀로그램처럼 서로 겹쳐지게된다.
오브젝트를 선택한 상태에서 Inspector창의 Addcomponent나 상단의 컴포넌트 창에서 Physics/Physics2D를 생성하면 된다. 옵션중 메쉬 콜라이더는 재질 자체에 충돌체를 설정하기 때문에 헤어나 옷감 같은 부드러운 객체의 표현을 처리할 때 좋지만 그만큼 연산범위가 작게 세분화되어 처리량이 매우 많아지니 조심해서 쓰도록하자.
isTrigger옵션은 물리적 이벤트 대신 이벤트 상호작용이 동작하도록 설정한다.
Provides Contacts 옵션은 물체가 충돌했는지 이벤트 발생 여부를 알려주는 옵션이다.
강체 설정 (Rigidbody)
충돌체 설정 외에도 오브젝트에는 다른 중요한 옵션이 남아있다. 강체 설정이다.
강체는 중력의 영항을 받도록 하고 실제 물리적인 효과를 적용하는 옵션으로 오브젝트의 상호작용에 관여하는 옵션이다.
강체 설정을 하고 충돌체를 만든다면 두 오브젝트는 지형에 부딛히면서 땅속으로 떨어지지 않을 것이다. (박스)
만약 강체설정만 하고 충돌 처리를 설정하지 않았다면 지형에 가로막히지 않고 끊임없이 아래로 떨어지는 것을 볼 수 있다.(타원)
그리고 두 오브젝트 모두 충돌체를 설정했다면 다음과 같이 물리 효과가 적용된다.
조명과 그림자효과, 라이트맵, 반사광 그리고 포스트 프로세싱/레이트레이싱과 같은 빛에 관련된 옵션들이 존재하지만 지금까지 배운것들만으로 기초 프로그래밍 하기엔 충분하기 때문에 이 옵션들은 DX11에 가서 렌더링 기법에 대해 배울 때 자세히 다루도록 하겠다.
예제 코드는 한빛 아카데미 예제 소스
IT CookBook, 게임 제작으로 배우는 유니티 (hanbit.co.kr)
IT CookBook, 게임 제작으로 배우는 유니티
게임을 만들면서 유니티를 배우려는 모든 독자층을 대상으로 합니다. 유니티의 설치 방법과 기본 사용법을 먼저 설명한 다음 유니티에서 그래픽 리소스를 설정하고 스크립트를 코딩하는 과정
www.hanbit.co.kr
또는 다음 레포지토리에 업로드 될 예정입니다. 유니티 프로젝트는 용량이 너무 거대한 관계로 제가 짠 스크립트만을 업로드하고 나머지는 링크형식으로 제공하겠습니다.
GitHub - cyphen156/Unity: UnityProject
GitHub - cyphen156/Unity: unity
unity. Contribute to cyphen156/Unity development by creating an account on GitHub.
github.com
'프로젝트 > 유니티' 카테고리의 다른 글
Unity 2D 게임 개발하기/리소스 추출 (2) | 2024.12.16 |
---|---|
유니티의 C# 스크립팅 시스템 (6) | 2024.09.25 |
유니티의 렌더링 파이프라인들 (Built-in-pipeline/URP/HDRP) (1) | 2024.09.19 |
Unity6 에셋 패키지 & 프리펩 (2) | 2024.09.10 |
Unity 5 책으로 공부하는 Unity 6 (13) | 2024.09.06 |