본문 바로가기

에셋을 사용하는 레벨 디자인 기초

에셋을 배치·변형해 플레이어 동선과 시각적 초점을 설계하고 반복 제작과 성능을 고려한 레벨 초안을 만듭니다.

에셋을 가져오고, 정리하고, 최적화하는 방법을 익혔다면 이제 그 에셋으로 실제 플레이 공간을 만들 차례입니다. 레벨 디자인(level design)은 에셋을 보기 좋게 늘어놓는 일이 아니라, 플레이어가 어디로 움직이고 무엇을 보며 어떤 순서로 경험할지를 함께 설계하는 일입니다. 같은 에셋을 써도 배치에 따라 길을 잃기 쉬운 공간이 되기도 하고, 자연스럽게 목표로 이끄는 공간이 되기도 합니다.

이 글에서는 레벨 디자인의 목표를 먼저 정리하고, 에셋을 배치하고 복제하는 방법을 익힙니다. 그다음 많은 액터를 다룰 때 쓰는 그리드 스냅과 그룹, 아웃라이너 폴더, 부착(attach)을 구분하고, 큰 레벨을 나눠 불러오는 레벨 스트리밍과 시각적으로 고려할 점을 살펴봅니다.


레벨 디자인이 하는 일

레벨(level)은 언리얼 엔진에서 게임이나 콘텐츠가 펼쳐지는 3D 공간의 단위입니다. 레벨마다 고유한 지형과 건물, 소품, 캐릭터, 조명, 사운드가 있고, 레벨 디자인은 이 요소들을 배치하고 서로 반응하게 만들어 플레이어가 몰입할 수 있는 경험을 만드는 과정입니다.

레벨 디자인에는 네 가지 목표가 있습니다. 먼저 플레이어가 레벨에서 무엇을 보고 듣고 느끼며, 어떤 상호작용을 할지 계획합니다. 다음으로 시각적 단서와 공간 구성으로 플레이어가 목표를 향해 나아가도록 게임 플레이의 흐름을 이끕니다. 또 에셋 배치와 조명으로 레벨의 분위기를 만들고, 마지막으로 설계 단계부터 에셋의 배치와 복잡도를 조절해 성능 문제를 줄입니다. 그래서 레벨 디자인에서 에셋은 장식이 아니라 이동 경로와 시선, 상호작용을 만드는 재료입니다.


에셋 배치하고 복제하기

콘텐츠 브라우저에서 레벨로 끌어다 놓아 액터로 만들 수 있는 에셋은 스태틱 메시와 스켈레탈 메시, 배치할 수 있는 블루프린트, 사운드 같은 것입니다. 텍스처나 재질 같은 에셋은 레벨에 직접 놓는 것이 아니라, 액터의 속성이나 컴포넌트에 연결해 씁니다.

콘텐츠 브라우저에서 끌어다 놓기

가장 기본적인 배치 방법입니다. 콘텐츠 브라우저에서 SM_으로 시작하는 스태틱 메시나 BP_로 시작하는 액터 블루프린트 클래스처럼 배치할 에셋을 찾고, 마우스 왼쪽 버튼으로 누른 채 뷰포트 안의 원하는 위치에 놓습니다. 놓은 액터는 자동으로 선택되므로, 바로 이동(W), 회전(E), 크기 조절(R) 기즈모로 위치와 방향, 크기를 맞춥니다.

추가 버튼으로 기본 액터 놓기

툴바의 추가(Add) 버튼을 누르면 엔진이 기본으로 제공하는 액터를 빠르게 놓을 수 있습니다. 기본 도형(Shapes)에는 큐브, 구, 원기둥 같은 메시가 있어서 시제품을 만들거나 공간의 크기를 가늠할 때 씁니다. 조명(Lights)에서는 포인트 라이트, 스포트 라이트, 디렉셔널 라이트 같은 조명을 놓으며, 조명은 기본 조명 설정과 환경 조정에서 자세히 다룹니다. 이 밖에 시네마틱이나 시각 효과 같은 분류의 액터도 필요에 따라 놓을 수 있습니다.

액터 복제하기

이미 배치한 액터를 복제하면 같은 오브젝트를 빠르게 여러 개 놓을 수 있습니다. 액터를 선택하고 Ctrl+C로 복사한 뒤 Ctrl+V로 붙여 넣으면 원본 액터가 있던 위치에 새 액터가 생기고, Ctrl+D를 누르면 선택한 액터가 바로 복제됩니다. 또 액터를 선택한 채 Alt 키를 누르고 이동 기즈모를 끌면, 끄는 방향으로 원본이 복제되어 따라옵니다. 기둥이나 울타리처럼 같은 오브젝트를 일렬로 늘어놓거나 일정한 간격으로 배치할 때 특히 편합니다.


먼저 단순한 도형으로 공간 잡기

최종 에셋부터 놓기 시작하면, 장식을 다 배치한 뒤에야 문이 좁거나 점프가 닿지 않는다는 것을 알게 되는 일이 많습니다. 그래서 먼저 큐브 같은 단순한 도형으로 공간의 큰 틀을 잡는 블록아웃(blockout)을 만듭니다. 블록아웃 단계에서 캐릭터의 크기와 문의 폭, 점프 거리, 카메라가 지나가는 길을 확인하고, 이동이 성립한 다음 도형을 최종 에셋으로 바꿉니다. 그러면 장식 때문에 동선을 다시 만드는 일을 줄일 수 있습니다.

그리드 스냅으로 정확하게 맞추기

깔끔하게 배치하려면 그리드 스냅(grid snap)을 씁니다. 뷰포트 위쪽의 이동, 회전, 크기 조절 도구 옆에 있는 격자, 각도, 비율 아이콘을 눌러 스냅을 켜고 끄며, 스냅 간격도 고릅니다.

그리드 스냅은 건물이나 바닥 타일처럼 일정한 간격으로 이어 붙여야 하는 오브젝트를 배치할 때 특히 쓸모가 있습니다. 이때 메시의 피벗(pivot) 위치와 모듈 크기가 스냅 간격과 맞아야 틈이나 겹침이 생기지 않습니다. 예를 들어 폭이 400 cm인 벽 모듈은 피벗이 모서리에 있고 스냅 간격이 그 크기를 나누어떨어지게 할 때 빈틈없이 이어집니다. 다만 겉보기에 이어 붙었다고 해서 라이트맵 품질까지 맞는 것은 아니므로, 미리 계산한 조명을 쓴다면 UV와 라이트맵 해상도, 조명 설정은 따로 점검합니다.


폴더, 그룹, 부착 구분하기

레벨에 액터가 많아지면 여러 액터를 묶어서 다룰 방법이 필요합니다. 언리얼 에디터에는 묶는 방법이 세 가지 있는데, 겉으로는 비슷해 보여도 하는 일이 다릅니다.

아웃라이너에서 이름 붙이고 폴더로 정리하기

아웃라이너는 레벨에 배치된 모든 액터의 목록이라 액터 관리의 중심입니다. 액터를 선택하고 F2를 누르면 이름을 바꿀 수 있는데, SM_Door_Main이나 BP_Lever_Entrance처럼 의미 있는 이름을 붙여 두면 나중에 아웃라이너의 검색으로 쉽게 찾을 수 있습니다. 또 아웃라이너에서 폴더를 만들어 관련된 액터를 모아 둘 수 있습니다.

그룹으로 함께 편집하기

그룹(group)은 여러 액터를 에디터에서 한 번에 선택하고 변형하기 위해 묶는 기능입니다. 묶을 액터를 모두 선택하고 오른쪽 클릭 메뉴의 Group에서 그룹을 만들거나 Ctrl+G를 누릅니다. 그룹을 풀 때는 같은 메뉴의 Ungroup이나 Shift+G를 씁니다. 그룹을 잠그면(Lock) 그룹 안의 개별 액터는 선택되지 않고 그룹 전체만 선택되며, 잠금 해제(Unlock)로 다시 개별 액터를 고를 수 있습니다. 그룹 단위 선택은 에디터의 Allow Group Selection 설정이 켜져 있어야 동작합니다.

부착으로 함께 움직이게 하기

부착(attach)은 한 액터를 다른 액터의 자식으로 붙이는 기능입니다. 아웃라이너에서 자식으로 만들 액터를 부모 액터 위로 끌어다 놓으면 붙습니다. 블루프린트 안에서 컴포넌트 계층을 만드는 것도 같은 관계이며, 이 계층은 블루프린트 교재의 블루프린트 컴포넌트의 사용법에서 자세히 다룹니다. 부착된 자식은 위치를 부모 기준의 상대 변환(relative transform)으로 가지므로, 부모가 움직이면 게임 실행 중에도 함께 움직입니다.

OUTLINER · EDITOR GROUP · ATTACH

폴더 정리, 그룹 편집, 부착은 서로 다른 관계입니다

화면의 트리에서 함께 보이는 것만으로 부모의 변환을 상속하지는 않습니다. 무엇을 묶었는지와 함께 움직이는 조건을 구분합니다.

세 가지 묶음의 관계폴더 영역 안의 문과 조명은 목록 소속이다. 그룹 영역 안의 문과 조명은 에디터에서 함께 선택하고 변형하는 대상이다. 부착 영역의 플랫폼에서 조명으로 향하는 화살표는 상대 변환 전달이며 실행 중 부모를 따라 이동한다. 폴더나 에디터 그룹에는 부착 간선을 그리지 않는다.Outliner 폴더목록 소속Props 폴더문 액터조명 액터에디터 그룹함께 선택·편집선택 영역문 액터조명 액터부모에 Attach상대 변환 계층플랫폼부모조명자식변환 전달
세 가지 묶음의 관계폴더 영역 안의 문과 조명은 목록 소속이다. 그룹 영역 안의 문과 조명은 에디터에서 함께 선택하고 변형하는 대상이다. 부착 영역의 플랫폼에서 조명으로 향하는 화살표는 상대 변환 전달이며 실행 중 부모를 따라 이동한다. 폴더나 에디터 그룹에는 부착 간선을 그리지 않는다.Outliner 폴더목록 소속Props 폴더문 액터조명 액터에디터 그룹함께 선택·편집선택 영역문 액터조명 액터부모에 Attach상대 변환 계층플랫폼부모조명자식변환 전달

점선 영역은 폴더 소속 또는 에디터 선택 범위입니다. 부착의 화살표만 부모의 상대 변환을 자식에게 전달합니다. 폴더와 그룹은 런타임 부착 관계를 만들지 않습니다.

원하는 동작에서 선택하기

목록 정리는 폴더, 에디터에서 일괄 변형은 그룹, 실행 중 함께 이동할 변환 계층은 부착을 사용합니다.

부착 예는 상대 변환을 쓰는 경우입니다. 컴포넌트의 절대 변환 옵션 등 실제 변환 설정도 확인합니다.

위 그림은 이 세 가지 묶음을 나란히 비교합니다. 왼쪽의 아웃라이너 폴더는 문 액터와 조명 액터를 Props 폴더 안에 넣은 목록상의 소속일 뿐입니다. 가운데의 에디터 그룹은 같은 문과 조명을 에디터에서 함께 선택하고 편집하는 범위입니다. 오른쪽의 부착에서만 플랫폼(부모)에서 조명(자식)으로 향하는 화살표가 있는데, 이 화살표가 부모의 상대 변환을 자식에게 전달하는 관계입니다.

그림의 설명처럼 점선으로 그린 폴더와 그룹은 소속이나 선택 범위를 나타낼 뿐이고, 실행 중에 함께 움직이는 관계를 만들지 않습니다. 그래서 고르는 기준은 원하는 동작입니다. 목록을 정리하려면 폴더를, 에디터에서 한꺼번에 옮기거나 돌리려면 그룹을, 게임 실행 중에도 함께 움직일 변환 계층이 필요하면 부착을 씁니다. 그림 아래의 주석이 짚듯이, 부착의 예는 자식이 상대 변환을 쓰는 경우이므로, 컴포넌트에 절대 위치 옵션이 켜져 있지 않은지 같은 실제 변환 설정도 확인합니다.

부착한 위치를 계산해 보기

상대 변환은 계산해 보면 분명해집니다. 플랫폼의 월드 X가 100 cm이고, 그 플랫폼에 붙인 조명의 부모 기준 상대 X가 50 cm라고 합시다. 플랫폼이 회전하지 않았고 크기가 1이며, 조명에 절대 위치 옵션을 쓰지 않았다면, 조명의 월드 X는 100 + 50 = 150 cm입니다. 이제 플랫폼을 X = 200 cm로 옮기면, 조명은 상대 X 50 cm를 그대로 유지하므로 월드 X가 250 cm가 됩니다.

반면 조명을 플랫폼과 같은 아웃라이너 폴더에 넣기만 했다면, 플랫폼을 옮겨도 조명은 150 cm에 그대로 남습니다. 폴더는 이런 계산 관계를 만들지 않기 때문입니다. 또 이 계산이 단순한 덧셈으로 끝난 것은 부모가 회전하지 않고 크기가 1이라는 조건 덕분입니다. 부모가 회전하거나 크기가 다르면 상대 위치도 함께 회전하고 늘어나므로, 전체 변환을 확인해야 합니다.


큰 레벨을 나눠 불러오기

큰 레벨의 에셋을 한 번에 모두 불러오면 메모리 사용량과 로딩 시간이 크게 늘어납니다. 레벨 스트리밍(level streaming)은 필요한 레벨 데이터만 골라 불러오고, 필요 없어진 데이터는 내리는 기능입니다. 플레이어가 특정 볼륨에 들어가거나 블루프린트의 조건이 맞을 때 레벨을 불러오게 할 수 있습니다.

UE5의 오픈 월드 레벨이 쓰는 월드 파티션(World Partition)은 레벨을 격자로 나눠 두고, 플레이어 같은 스트리밍 소스(streaming source)의 위치를 기준으로 가까운 격자를 불러옵니다. 넓은 맵에서 성능을 안정시키면서 로딩 화면 없이 이동하게 하는 기술이므로, 지금은 필요한 부분만 불러온다는 기본 개념을 익혀 두면 됩니다. 레벨 구조는 기본 레벨 생성 및 구조 설정에서 다시 다룹니다.


배치한 뒤 플레이 시점에서 확인하기

에셋을 많이 배치할수록 화면을 꾸미는 일과 플레이 동선을 지키는 일이 섞이기 쉽습니다. 그래서 배치한 뒤에는 에디터 카메라가 아니라 실제 플레이 시점에서 확인합니다.

먼저 캐릭터의 캡슐 충돌과 카메라가 문, 계단, 좁은 길을 지나갈 수 있는지 봅니다. 다음으로 목표 지점과 상호작용할 대상이 조명이나 형태, 색으로 주변과 구별되는지 확인합니다. 반복해 놓은 소품에 회전이나 크기, 재질을 바꿔 변화를 줬다면, 그 변화가 동선과 충돌을 해치지 않는지도 봅니다. 마지막으로 플레이어가 주로 보게 될 시야에서 메시와 재질 슬롯, 그림자의 비용이 목표 프레임 예산 안에 들어오는지 확인합니다.


시각적으로 고려할 점

레벨 디자인은 기능을 만드는 데서 끝나지 않고, 보기 좋고 몰입할 수 있는 공간을 만들어야 합니다.

조명은 레벨의 분위기를 정하고, 오브젝트의 형태를 드러내고, 플레이어의 시선을 이끕니다. 재질은 오브젝트의 질감과 색을 정하며, 장면에 어울리는 재질은 몰입감을 높입니다. 레벨 전체의 색 조합인 컬러 팔레트(color palette)를 정해 두면 일관되고 조화로운 분위기를 만들 수 있습니다.

공간은 플레이어가 자연스럽게 움직이고 탐험할 수 있게 구성하고, 중요한 지점으로 가는 길을 분명하게 만듭니다. 그다음 빈 공간에 알맞은 소품이나 식물을 배치해 레벨을 풍성하게 채웁니다. 처음에는 작은 공간부터 시작해 점차 복잡도를 높여 가는 것이 좋습니다.


정리

  • 레벨 디자인은 에셋을 늘어놓는 일이 아니라, 플레이어의 경험과 흐름, 분위기, 성능을 함께 설계하는 일입니다.
  • 스태틱 메시와 액터 블루프린트는 끌어다 놓거나 추가 버튼으로 배치하고, Ctrl+C와 Ctrl+V, Ctrl+D, Alt를 누른 채 끌기로 복제합니다.
  • 최종 에셋 전에 단순한 도형으로 블록아웃을 만들어 크기와 동선을 확인하고, 그리드 스냅은 피벗과 모듈 크기가 맞을 때 빈틈없이 이어 줍니다.
  • 아웃라이너 폴더는 목록 정리, 그룹은 에디터에서 함께 편집, 부착은 실행 중에도 함께 움직이는 상대 변환 관계입니다.
  • 회전 없이 크기가 1인 부모에 붙인 자식의 월드 위치는 부모의 월드 위치에 상대 위치를 더한 값입니다.
  • 레벨 스트리밍과 월드 파티션은 필요한 부분만 불러오며, 배치한 뒤에는 플레이 시점에서 충돌, 구별, 비용을 확인합니다.

연습 문제

1. 상대 위치를 바꾸면

플랫폼의 월드 X는 200 cm이고, 회전 없이 크기가 1입니다. 여기에 붙인 조명의 상대 X를 −30 cm로 바꾸면 조명의 월드 X는 얼마일까요? 플랫폼이 Z축으로 90도 회전해 있다면 같은 덧셈이 성립할까요?

해설 보기

부모의 X 200 cm에 상대 위치 −30 cm를 더한 170 cm입니다.

플랫폼이 회전해 있다면 상대 위치도 부모의 회전에 맞춰 함께 회전하므로, 상대 X −30 cm가 월드의 X 방향이 아니라 다른 방향으로 놓입니다. 그래서 X 값만 더하는 계산은 성립하지 않고, 부모의 회전과 크기를 포함한 전체 변환을 확인해야 합니다.

2. 움직이는 엘리베이터에 붙인 조명

엘리베이터 액터가 게임 실행 중에 위아래로 움직입니다. 엘리베이터 안의 조명이 함께 움직이게 하려고 두 액터를 같은 아웃라이너 폴더에 넣고 그룹으로도 묶었는데, 플레이하면 조명이 제자리에 남습니다. 왜 그럴까요?

해설 보기

폴더는 목록상의 소속이고, 그룹은 에디터에서 함께 선택하고 편집하는 범위일 뿐이라 게임 실행 중에 함께 움직이는 관계를 만들지 않습니다.

실행 중에 함께 움직이게 하려면 조명을 엘리베이터에 부착해 상대 변환 계층을 만들어야 합니다. 그러면 엘리베이터가 움직일 때 조명도 상대 위치를 유지하며 따라갑니다. 조명이 움직이므로 조명의 이동성 설정도 움직일 수 있는 값인지 확인합니다.

3. 장식을 다 놓은 뒤 발견한 좁은 문

최종 에셋으로 방을 다 꾸민 뒤 플레이해 보니, 캐릭터가 문을 지나가지 못합니다. 문틀과 벽, 소품을 모두 다시 배치해야 할 상황입니다. 다음 레벨에서는 작업 순서를 어떻게 바꾸면 좋을까요?

해설 보기

최종 에셋을 놓기 전에 큐브 같은 단순한 도형으로 블록아웃을 먼저 만들고, 캐릭터의 크기와 문의 폭, 점프 거리, 카메라가 지나가는 길을 플레이 시점에서 확인합니다.

이동이 성립한 다음 도형을 최종 에셋으로 바꾸면, 문을 넓히는 일은 도형 하나의 크기를 바꾸는 것으로 끝납니다. 장식을 놓은 뒤에 동선을 고치는 것보다 훨씬 비용이 적습니다.

다음 글 마켓플레이스 활용법에서는 외부에서 만든 에셋을 찾아 프로젝트에 추가하는 방법과, 라이선스와 버전을 확인하는 기준을 살펴봅니다.