튜토리얼 시리즈의 이 섹션에서는 새 레벨을 생성하고, 오브젝트를 배치 및 트랜스폼하고, 다양한 뷰포트 모드로 작업하고, 아웃라이너를 사용하여 체계적으로 정리하는 방법을 비롯해 언리얼 에디터의 기초를 익혀 봅니다.
또한 스케일, 수직성, 오클루전, 대비, 안내선 같은 레벨 디자인 콘셉트를 적용하면서 단순한 셰이프를 사용하여 아이디어의 윤곽을 잡는 방법도 알아봅니다. 이러한 툴은 모두 플레이어가 레벨을 이동하고 경험하는 방식에 영향을 미칩니다.
이 단계가 끝나면 트랙의 다음 섹션에서 만들 게임플레이의 토대가 되는 플레이 가능 공간이 생깁니다.
시작하기 전에
에픽게임즈 런처와 언리얼 엔진을 설치했는지 확인합니다.
이 튜토리얼을 따라 하려면 언리얼 에디터 툴바, 패널, 뷰포트 컨트롤의 기초를 이해해야 합니다. 자세한 내용은 이 튜토리얼을 시작하기 전에 신규 사용자를 위한 언리얼 엔진 문서의 다른 페이지를 참조하세요.
아이디어 스케치
에디터에서 제작을 시작하기 전에 먼저 10~20분을 투자하여 종이에 아이디어를 글로 작성하거나 스케치합니다. 이 초기 반복작업은 다음과 같은 이점을 제공합니다.
레벨의 기본 게임플레이 비트와 콘셉트 생각해 내기
에디터에서 제작에 시간을 투자하기 전에 게임플레이 아이디어가 잘 진행되고 범위에 맞는지 확인하기
작업 세션 사이에 아이디어 상기하기
게임플레이 메커니즘을 주도하거나 레벨 디자인을 주도하는 등 다양한 방식으로 이 초기 디자인에 접근할 수 있습니다. 제작 중인 게임 타입과 개인 취향에 따라 레벨 디자인 기법을 선택하거나 결합할 수 있습니다. 게임 디자인에 대한 올바른 접근법이 하나만 있는 것은 아닙니다. 중요한 것은 결과입니다. 레벨 디자인과 게임플레이가 서로를 뒷받침해 주는 게임은 보다 일관성이 있으며 플레이어에게 더 몰입감 있고 매력적인 경험을 제공합니다.
한 가지 기법인 노드 매핑은 원과 선의 단순화된 추상 다이어그램을 그려 레벨의 여러 공간, 해당 공간에서 일어나는 일, 플레이어가 공간에서 공간으로 전환하는 방식을 보여줍니다. 노드 매핑은 게임플레이 속도, 분기 경로, 플레이어 선택에 초점을 맞춥니다. 하나의 노드는 하나의 플레이어 액션 또는 이벤트를 나타냅니다. 이 이벤트는 해당 공간의 셰이프에 영감을 줄 수 있습니다.
이 튜토리얼에서는 일련의 방을 사용하여 플레이어를 잠긴 문과 키로 제한하고, 플레이어에게 대미지를 줄 수 있는 장애물을 생성하고, 이러한 장애물을 물리칠 플랫폼과 스위치를 추가하는 등 일반적인 게임플레이 오브젝트를 구현하는 방법을 보여줍니다. 노드에서 이러한 레벨 아이디어를 스케치한 모습은 다음과 같습니다.
또 다른 기법은 톱다운, 측면 또는 직교 뷰에서 레벨의 실제 레이아웃의 시각적 스케치를 그리는 것입니다. 여기서는 게임플레이가 아닌 레벨 디자인에 초점을 맞춥니다. 레벨 공간의 셰이프는 플레이어의 액션과 이벤트에 영감을 줄 수 있습니다.
튜토리얼 레벨에서 방과 복도 디자인을 처음 스케치한 모습은 다음과 같습니다.
점프, 달리기, 숨기, 잡기, 제작, 사격, 근접전, 대화와 같이 게임에서 플레이어가 할 수 있는 액션이나 플레이어 동사를 사용하여 디자인할 수도 있습니다. 이렇게 하면 월드의 사물에서 플레이어가 상호작용하고 있는 대상으로 초점을 옮길 수 있습니다. 이러한 사고 방식은 레벨의 몰입도와 재미, 속도를 높이는 데 도움이 될 수 있습니다.
레벨의 공간을 디자인할 때 플레이어 동사를 의미 있게 사용할 수 있는 기회를 어디에 추가할지 생각해 보세요. 동사는 공간의 디자인을 알릴 수 있습니다. 예를 들어 동사가 점프인 경우 교차할 간격, 일부 플랫폼, 수직 공간 또는 점프하여 넘어갈 적이나 위험 요소를 추가할 수 있습니다. 게임플레이를 새롭고 적절한 속도로 유지하기 위해 공간마다 이러한 동사를 다양하게 사용합니다.
레벨과 게임플레이를 디자인할 때 어떤 접근 방식을 취하든 항상 플레이어가 무엇을 하고 있는지 고려해야 합니다.
프로젝트 생성하기
시작하려면 1인칭 템플릿을 사용하여 새 프로젝트를 생성합니다. 템플릿에는 레벨 디자인을 빠르게 처리하는 데 유용한 메시, 게임플레이 오브젝트, 플레이어 캐릭터 등 사전 제작된 에셋이 포함되어 있습니다.
메시는 3D 모델 또는 3D 모델을 생성하는 폴리곤 세트입니다. 스태틱 메시는 레벨에서 이동, 회전, 스케일 조절이 가능한 오브젝트를 만드는 데 사용되는 3D 모델입니다.
프로그래밍 트랙 튜토리얼로 시작했다면 이 트랙에서 프로젝트를 계속 사용할 수 있습니다.
새로운 1인칭 프로젝트를 생성하려면 다음 단계를 따릅니다.
언리얼 에디터를 엽니다. 언리얼 프로젝트 브라우저(Unreal Project Browser)에서 게임(Games) 프로젝트 카테고리로 이동하여 1인칭(First Person) 템플릿을 선택합니다.
모든 프로젝트 디폴트(Project Defaults)를 유지하고 베리언트(Variant)로 아레나 슈터(Arena Shooter)를 선택합니다. 템플릿 베리언트에는 추가 에셋과 해당 게임플레이 장르에 부합하는 샘플 레벨이 포함되어 있습니다.
프로젝트를 명명합니다. 이 튜토리얼에서는
AdventureGame을 프로젝트 이름으로 사용합니다.생성(Create)을 클릭하여 언리얼 에디터에서 새 프로젝트를 엽니다.
Lvl_FirstPerson 샘플 레벨이 뷰포트에서 열린 상태로 프로젝트가 열립니다.
새 레벨 시작
이 프로젝트를 자신만의 프로젝트로 만들기 시작하려면 완전히 새로운 레벨(맵 이라고도 함)을 생성하고, 콘텐츠를 탐색하고, 게임 시작 방식을 설정하고, 처음으로 플레이합니다.
언리얼 에디터에서 작업할 때 에셋 또는 액터가 표시되지 않거나 업데이트되지 않은 경우처럼 예상치 못한 비헤이비어가 발생하면 에디터를 재시작해 보세요. 언리얼 엔진은 캐싱에 크게 의존하므로 재시작하면 이러한 문제를 해결할 수 있는 경우가 많습니다.
새 메시를 생성하려면 다음 단계를 따릅니다.
언리얼 에디터의 메뉴 바에서 파일(File)로 이동하여 새 레벨(New Level)을 선택합니다.
새 레벨 창에서 기본(Basic)을 선택하고 생성을 클릭합니다. 이렇게 하면 바닥, 하늘, 플레이어 스폰, 앰비언트 라이팅으로 시작할 수 있습니다.
파일(File) > 현재 레벨 저장(Save Current Level)으로 이동합니다.
이 튜토리얼 시리즈에서 만들 에셋을 저장할 폴더 구조를 생성합니다.
다른 이름으로 레벨 저장(Save Level As) 창의 왼쪽 패널에서 콘텐츠(Content) 폴더를 우클릭하고 새 폴더(New Folder)를 선택합니다.
이 폴더를 프로젝트 이름을 따서 명명합니다. 이 튜토리얼에서는
AdventureGame을 사용합니다.새 폴더를 우클릭하고 새 폴더를 선택합니다.
이 폴더를
Designer로 명명하고 선택합니다.
레벨 이름을 입력하고 저장(Save)을 클릭합니다. 이 튜토리얼에서는
Lvl_Adventure를 사용합니다.
아웃라이너 및 디테일 패널 살펴보기
아웃라이너(Outliner)에서 레벨의 모든 오브젝트 목록을 확인합니다. 이러한 오브젝트를 액터라고도 합니다.
Lighting 폴더에는 레벨의 배경 및 앰비언트 라이팅을 제어하는 오브젝트 세트가 있습니다. 각 요소가 레벨의 룩 앤 필에 어떻게 영향을 미치는지 확인하려면 각 요소에 커서를 올리고 눈 모양 아이콘을 클릭하여 뷰포트에서 비저빌리티를 토글합니다.
이러한 라이팅 레벨 오브젝트의 위치는 중요하지 않으므로 원하는 경우 방해가 되지 않도록 이동할 수 있습니다.
레벨에는 바닥 메시와 플레이어가 레벨을 시작하는 위치를 제어하는 PlayerStart 스폰 포인트도 포함되어 있습니다.
아웃라이너에서 DirectionalLight를 클릭합니다. 이 라이트는 레벨을 비추고 그림자를 드리우는 태양 (또는 달) 역할을 하도록 환경설정됩니다. 디테일(Details) 패널에서는 컬러(Color)나 강도(Intensity) 같은 라이트 프로퍼티를 확인하고 변경할 수 있으며, 뷰포트에서 결과가 즉시 업데이트되는 것을 확인할 수 있습니다.
뷰포트에서 오브젝트를 찾을 수 없는 경우 아웃라이너에서 해당 오브젝트를 클릭하고 F를 눌러 뷰포트의 위치를 변경하여 해당 오브젝트에 포커스를 맞춥니다.
레벨 라이팅 커스터마이징에 대한 자세한 내용은 인바이런먼트 라이팅을 참고하세요.
뷰포트에서 게임플레이 프리뷰
뷰포트에 레벨의 프리뷰가 표시됩니다. 뷰포트 툴바에서 플레이를 클릭하여 뷰포트 내에서 레벨을 플레이합니다. 이는 에디터에서 플레이(Play-In-Editor, PIE) 모드라고도 합니다. PIE 모드를 사용하면 언리얼 에디터 내에서(뷰포트 내에서든 새 창에서든) 런타임에 프로젝트가 어떻게 작동하는지 테스트할 수 있습니다.
런타임은 프로젝트가 머신이나 콘솔 같은 타깃 플랫폼에서 실행되는 기간을 의미합니다.
레벨을 플레이하면 PlayerStart 위치에서 스폰됩니다.
그런 다음 뷰포트를 클릭하여 WASD 또는 화살표 키로 이동하고 스페이스 바를 사용하여 점프합니다.
아래를 보면 게임이 디폴트 1인칭 플레이어 캐릭터를 사용하고 있는 것을 볼 수 있습니다.
Shift + F1을 눌러 커서로 전환하고 중지(Stop)를 클릭하거나 Esc를 눌러 플레이 모드를 종료합니다.
게임의 완전한 독립형 버전을 플레이하려면 플레이 모드 컨트롤 옆의 점 세 개를 클릭하고 독립형 게임(Standalone Game) 모드를 선택합니다. 새 창에서 게임을 플레이하고 게임의 완성된 익스포트 버전을 시뮬레이션하여 UI 메뉴, 로드 화면, 해상도 스케일링, 마우스 입력을 테스트할 수 있습니다. 하지만 이 모드는 여전히 에디터 내에서 실행됩니다. 패키지로 만든 게임의 임시 .exe 버전을 빌드하고 실행하려면 빠른 실행(Quick Launch) 모드를 선택합니다.
이 메뉴를 사용하면 뷰포트에서 플레이 모드로 다시 전환됩니다.
시작 레벨 변경
프로젝트 세팅을 사용하여 언리얼 에디터에서 프로젝트를 열 때와 완성된 게임을 플레이할 때 로드되는 레벨을 변경할 수 있습니다.
프로젝트의 디폴트 시작 레벨을 변경하려면 다음 단계를 따릅니다.
에디터의 메인 메뉴에서 편집(Edit) > 프로젝트 세팅(Project Settings)으로 이동합니다.
왼쪽 패널의 프로젝트(Project) 섹션에서 맵 & 모드(Maps & Modes)를 선택합니다.
디폴트 맵(Default Maps) 섹션에서 에디터 시작 맵(Editor Startup Map)과 게임 기본 맵(Game Default Map)을 새 레벨로 변경합니다. 프로젝트를 열면 에디터 시작 맵이 열리고, 언리얼 엔진에서 프로젝트의 독립형 또는 패키징된
.exe를 재생하면 게임 기본 맵이 로드됩니다.프로젝트 세팅을 닫습니다.
맵 윤곽 작업
이제 콘셉트, 새 프로젝트, 새 레벨이 준비되었으니 언리얼 에디터에서 디자인을 시작할 수 있습니다.
완성된 아트와 세련된 디테일을 생각하기에 앞서 레벨의 레이아웃과 플레이 가능성에 초점을 맞추는 것이 중요합니다. 이 디자인 단계는 보통 윤곽 작업(또는 그레이박싱)이라고 하며, 벽, 통로, 기능적 장애물을 나타내는 단순한 모양으로 레벨에 거친 공간을 만드는 작업이 포함됩니다. 이는 캔버스에 연필로 스케치한 뒤 페인트로 마무리하는 것과 같습니다.
윤곽 작업은 아이디어를 빠르게 반복작업하고 테스트하여 디자인에서 효과가 있는 요소와 그렇지 않은 요소를 결정할 수 있도록 지원하는 수단입니다. 이는 최종 결과물이 아니라는 점을 기억하세요. 이 프로세스는 플레이어가 실제로 상호작용할 게임 부분에 더 많은 시간을 할애할 수 있도록 빨라야 합니다.
레벨을 윤곽 작업하면 다음과 같은 이점이 있습니다.
아트 디자인이 끝날 때까지 기다리지 않고 게임플레이 디자인을 시작할 수 있습니다.
디자인 문제를 보다 일찍 파악합니다.
아트 에셋을 다시 사용하지 않고도 빠르게 실험하고 반복작업할 수 있습니다.
이 단계에서는 불필요한 디테일에 시간을 할애하지 않고 스케일, 시선, 게임플레이 흐름을 테스트합니다.
게임플레이를 지원하는 장애물만 사용하여 가장 단순하고 탐색하기 쉬운 레벨 버전을 생성합니다. 외형보다는 공간의 느낌, 재미, 게임플레이 목표를 지원하는지에 초점을 맞추세요. 기본 셰이프를 사용하고 있기 때문에 작동하지 않는 것이 있다면 제거하고 새로운 셰이프를 시도해 볼 수 있습니다.
기능적이고 게임플레이를 지원하는 한, 레이아웃과 예술적 디자인 선택을 모두 윤곽 작업에 통합할 수 있습니다. 성공적인 게임에서는 매력적이고 몰입감 있는 공간을 만들기 위해 두 가지 유형의 디자인 요소를 모두 사용합니다.
| 윤곽 작업에 추가할 요소 | 윤곽 작업에 추가하지 말아야 할 요소 | |
|---|---|---|
레이아웃 디자인 선택 |
|
|
예술적인 디자인 선택 |
|
|
스케일 결정
레벨 블록 작업의 진도를 너무 많이 나가기 전에 게임의 표준 치수와 스케일을 설정하는 것이 중요합니다. 여기에는 다음과 같이 레벨 내 일반적인 구조물의 크기를 결정하는 것도 포함됩니다.
점프할 수 있는 오브젝트, 올라갈 수 있는 오브젝트, 엄폐물, 복도, 방의 높이
문, 창문, 복도의 크기
레벨의 스케일을 조정할 때의 목표는 레벨을 일관되고 자연스러우며 쉽게 이해할 수 있도록 만드는 것입니다. 윤곽 작업에서는 배경 아티스트를 위한 스케일도 생성합니다.
언리얼 엔진에서는 센티미터 단위로 작업하며, 100센티미터는 1미터와 같습니다.
자연스러운 느낌으로 만들기
공간의 피처는 플레이어의 크기에 따라 사실적인 느낌이 들 것입니다. 하지만 완전한 리얼리즘이 게임에 항상 잘 적용되는 것은 아닙니다. 예를 들어 너비가 0.8m인 출입구는 현실에서는 넓게 느껴지지만 게임 내에서는 너무 좁아서 카메라가 클리핑 없이 통과하지 못할 수 있습니다. 사용 중인 게임 타입에 맞는 사실성과 재미 사이에서 균형을 찾으세요.
스케일은 플레이어 크기, 공간의 느낌, 공간이 지원하는 게임플레이에 따라 다릅니다. 공간이 밀실 공포증을 유발하는 복도인지 아니면 바람이 잘 통하는 개방된 방인지에 따라 다르며, 플레이어 한 명, 여러 플레이어, 아니면 적과의 조우에 맞춰야 하는지에 따라 다릅니다.
레벨 공간의 스케일을 결정할 때는 다음과 같은 평균 치수를 염두에 두어야 합니다.
| 레벨 오브젝트 | 표준 측정 |
|---|---|
인간 캐릭터 | 키 1.8m, 0.5m 높이로 점프 |
복도 | 너비 2~3m, 높이 3~4m 3인칭 카메라의 경우 카메라를 맞추기 위해 더 넓은 통로가 필요합니다. |
문 | 너비 1~1.5m, 높이 2m |
벽 | 높이 4m |
이는 가이드라인일 뿐이며, 레벨의 디자인과 스케일은 게임플레이 경험의 요구 사항에 부합되어야 합니다.
쉽게 이해할 수 있도록 만들기
레벨 피처의 스케일은 플레이어가 손쉽게 판독하고 예측할 수 있어야 합니다. 플레이어가 오브젝트에 다가가면 플레이어는 엄폐를 위해 그 옆에 웅크리고 있어야 하는지, 뛰어넘어야 하는지, 아니면 지나칠 수 없는지 여부를 한눈에 파악해야 합니다.
예를 들어 다음은 작은 정원 벽을 나타내는 낮은 구조물로, 플레이어를 안내하지만 뛰어넘는 용도는 아닌 안내선 역할을 합니다. 높이는 0.6m(플레이어의 점프 높이보다 10cm 높음)입니다.
플레이어가 이 벽까지 달릴 때 벽이 뛰어넘을 수 있을 정도로 충분이 낮다고 생각할 수 있으며, 뛰어넘지 못하면 좌절감을 느낄 수도 있습니다. 대신 벽과 비슷한 가시성을 제공하는 동시에 플레이어에게 이 방법으로는 통과할 수 없음을 알릴 수 있는 일련의 높은 격자 패널로 대체할 수 있습니다.
일관되게 만들기
레벨에 사실적인 느낌을 주고 월드 제작을 지원하려면, 환경 전체에서 공통 피처의 크기를 일관되게 유지해야 합니다.
하지만 대비를 적용하여 플레이어의 주의를 끌거나 감정을 불러일으킬 수는 있습니다. 예를 들어 하나의 문을 다른 문보다 크게 만들면 그 중요성을 알 수 있습니다.
한 레벨이나 프로젝트에서 작업하는 디자이너가 많은 경우, 측정을 표준화하면 에셋 간의 불일치를 방지하여 재작업에 시간을 낭비하지 않고 플레이어에게 일관된 경험을 제공하는 데 도움이 됩니다.
레벨을 디자인할 때는 플레이어 스케일을 레퍼런스로 삼아 각 공간에 플레이어 크기의 큐브 또는 캐릭터 메시를 생성합니다. 플레이어 스태틱 메시를 추가하려면 콘텐츠 브라우저(Content Browser)에서 콘텐츠 > Character > Mannequins > Meshes 폴더로 이동하여 SKM_Manny_Simple을 뷰포트에 드래그합니다.
3인칭 시점에서는 카메라가 더 뒤에 있기 때문에 오브젝트가 더 작게 표시되므로, 1인칭 게임에 비해 공간의 스케일을 늘려야 할 수도 있습니다. 3인칭 카메라로 작업할 때는 스케일에 1.5를 곱하는 것이 좋습니다(50% 증가).
모듈형 요소 대 완전한 요소
공간의 윤곽 작업을 할 때는 하나의 긴 메시로 벽, 바닥, 천장을 만들거나 메시를 계속 복제하여 보다 모듈화된 디자인을 만들 수 있습니다.
이 선택은 선호도와 공간 타입에 따라 달라집니다. 복도와 박스형 방에는 모듈형 조각을 사용하고, 기이한 모양의 방이나 자연스러운 공간에는 더 큰 조각을 사용할 수 있습니다.
모듈형 조각으로 윤곽 작업을 하면 다음과 같은 이점이 있습니다.
많은 레벨 디자이너는 각 조각의 크기를 조정하는 대신 모듈형 조각을 복제하는 것이 더 빠르고 예측 가능하다고 생각합니다.
윤곽 작업에서 하나의 큰 조각 대신 하나 또는 두 개의 모듈형 조각을 변경하는 것이 더 쉬울 수 있습니다.
아티스트가 제작해야 하는 에셋 수를 최소화하면서 다양한 공간을 만들 수 있습니다.
표준화된 크기는 모든 것을 동일한 그리드와 스케일로 정렬하여 필요한 고유 머티리얼과 메시의 수를 줄임으로써 퍼포먼스에 도움이 됩니다.
모듈형 디자인 사례를 사용하여 레벨의 공간을 조합하는 기본 구성 요소처럼 사용할 수 있는 메시 셰이프 팔레트를 생성할 수 있습니다. 하지만 이러한 요소는 토대에 불과합니다. 필요에 따라 언제든 고유한 셰이프를 추가할 수 있습니다.
첫 번째 오브젝트 추가
프로젝트에 포함된 샘플 에셋을 사용하여 스케일을 자유롭게 설정해 보고 레벨을 윤곽 작업합니다.
에셋은 프로젝트에 생성하거나 임포트하는 파일로, 콘텐츠 브라우저에 저장됩니다. 에셋은 3D 메시, 2D 이미지, 사운드 파일 등일 수 있습니다.
언리얼 엔진에서는 에셋과 액터로 작업합니다.
에셋은 프로젝트에 생성하거나 임포트하는 파일로, 콘텐츠 브라우저에 저장됩니다.
액터는 레벨에 배치된 오브젝트입니다.
액터는 에셋의 인스턴스, 즉 월드에 배치된 해당 에셋의 개별 사본을 의미하기도 합니다.
레벨에 첫 스태틱 메시를 추가하려면 다음 단계를 따릅니다.
콘텐츠 브라우저의 에셋 트리에서 콘텐츠 > LevelPrototyping > Meshes 폴더로 이동합니다.
SM_Cube를 클릭하고 뷰포트로 드래그하여 PlayerStart 근처에 놓습니다. 이렇게 하면SM_Cube에셋을 사용하는 스태틱 메시 액터가 레벨에 생성됩니다.
콘텐츠 브라우저 에셋과 해당 에셋의 레벨 오브젝트 인스턴스는 부모-자손 관계입니다. 부모 SM_Cube 에셋에 대한 변경사항은 레벨의 메시에 영향을 미치지만, 레벨의 개별 SM_Cube 오브젝트 인스턴스에 대한 변경사항은 콘텐츠 브라우저의 SM_Cube 에셋에 영향을 미치지 않습니다.
이 블록의 크기는 1m x 1m x 1m이며 그리드 머티리얼이 있어 치수를 한눈에 확인할 수 있습니다. 머티리얼의 어두운 선은 1m의 그리드를 생성하고, 바닥 머티리얼의 밝은 선은 0.1m의 그리드를 생성합니다. 수직 표면의 밝은 선은 0.2m의 그리드입니다.
언리얼 엔진에서 머티리얼은 메시 표면의 외형을 변경하는 2D 텍스처로 구성된 에셋입니다. 머티리얼은 메시를 메탈, 나무 또는 단색처럼 보이게 만드는 요소입니다.
1m 블록의 크기를 벽 조각으로 조정하려면 다음 단계를 따릅니다.
뷰포트에서 블록 메시를 클릭하여 선택합니다.
뷰포트 툴바에서 스케일 버튼을 클릭하거나 R을 누릅니다. 스케일 기즈모가 블록에 표시됩니다.
기즈모의 핸들을 클릭하고 드래그하여 블록을 더 가늘고, 길고, 높게 만듭니다. 벽의 두께는 건물에 따라 다릅니다. 집은 벽이 더 얇은 반면, 요새는 벽이 더 두꺼울 수 있습니다. 10~30cm가 좋은 시작점입니다.
셰이프의 크기를 조정할 때 디테일 패널을 보면 스케일(Scale) 프로퍼티가 어떻게 변경되는지 확인할 수 있습니다. 디테일 패널에서 오브젝트의 위치, 회전, 크기를 변경할 수도 있습니다.
셰이프를 한 번에 여러 치수로 크거나 작게 만들려면 빨간색 핸들과 파란색 핸들 사이의 트라이앵글 위로 커서를 노란색으로 하이라이트한 다음 클릭하고 드래그합니다.
한 번에 모든 3차원의 스케일을 조절하려면 기즈모 중앙의 흰색 스피어를 클릭하고 드래그합니다.
벽의 위치를 조정하려면 다음 단계를 따릅니다.
뷰포트 툴바에서 이동 버튼을 클릭하거나 W를 누릅니다.
녹색 또는 빨간색 핸들을 클릭하고 드래그하여 바닥을 따라 어느 방향으로든 셰이프를 이동합니다.
셰이프를 한 번에 두 방향으로 이동하려면 노란색으로 하이라이트될 때까지 녹색 핸들과 빨간색 핸들 사이의 사각형 위로 커서를 가져간 다음, 바닥에서 셰이프를 클릭하고 드래그합니다.
오브젝트를 복제 및 정렬하여 방 만들기
방을 만들려면 벽이 몇 개 더 필요하니, 계속 진행하세요!
다른 벽 조각을 빠르게 만들려면 벽 메시를 선택하고 Alt를 누른 상태로 이동 기즈모를 사용하여 메시를 이동합니다. 이렇게 하면 원본이 제자리에 유지되고 복제본이 생성됩니다.
벽 조각을 복제하고 이동하여 첫 번째 방을 만듭니다. 이 튜토리얼의 다음 모듈에서 장애물을 추가할 공간이 충분한지 확인합니다.
Ctrl을 눌러 한 번에 여러 조각을 선택한 다음 Alt를 누른 채로 회전하거나 이동하면 전체 선택이 복제됩니다.
오브젝트를 움직이면 보이지 않는 그리드를 따라 스냅됩니다. 그리드 및 그리드 스냅 툴을 사용하면 레벨에서 오브젝트를 정확하게 배치하고, 정렬하고, 스케일 조절할 수 있습니다. 그리드를 사용하면 모든 것이 깔끔하게 정리되고 크기와 위치가 일관되게 유지됩니다.
인공 공간은 자연 공간보다 그리드에 더 가깝습니다.
뷰포트 툴바에서 그리드 스냅 메뉴를 사용하여 이동, 회전, 스케일에 대한 다른 그리드 크기(또는 스냅 증분)를 선택할 수 있습니다. 기본적으로 움직이는 오브젝트의 그리드 크기는 10유닛, 즉 10cm입니다.
큰 스냅 증분은 방과 벽의 레이아웃에 유용하며, 작은 그리드 크기는 오브젝트 배치를 미세 조정하는 데 유용합니다. 예를 들어 회전 그리드 스냅을 45° 또는 90°로 변경하면 오브젝트가 직각으로 정렬됩니다.
모든 스냅 옵션에 대한 자세한 내용은 뷰포트 툴바의 스냅 툴 및 스냅 세팅 섹션을 참고하세요.
오브젝트를 정렬하는 또 다른 방법은 2D 와이어프레임 뷰를 사용하는 것입니다. 뷰포트 툴바의 우측에서 원근(Perspective)을 클릭하여 카메라 옵션을 열고 상단(Top)을 선택합니다.
이러한 직교 타입 뷰의 디폴트는 와이어프레임(Wireframe) 뷰 모드로, 레벨 지오메트리의 에지와 폴리곤 구조를 표시합니다. 이 모드에서는 그리드를 볼 수도 있습니다. 레벨의 윤곽 작업을 할 때 주기적으로 상단 뷰 또는 측면 뷰로 전환하여 메시의 정렬을 확인하세요. 완료되면 원근 모드로 다시 전환합니다.
대형 라이트, 스카이 메시 또는 트리거 볼륨과 같은 일부 오브젝트는 2D 와이어프레임 뷰포트에서 오브젝트를 선택하려고 할 때 방해가 될 수 있습니다. 이러한 오브젝트를 숨기려면 뷰포트 툴바의 표시 플래그(Show Flags) 메뉴를 사용하여 오브젝트 타입을 숨깁니다. 또는 아웃라이너를 사용하여 개별 오브젝트를 숨깁니다.
시작점 설정
레벨을 시작했으니 이제 PlayerStart 위치를 플레이어가 시작해야 하는 위치로 재배치하고, 플레이어가 올바른 방향을 향하고 있는지 확인합니다!
플레이어의 시작 위치와 방향을 변경하려면 다음 단계를 따릅니다.
PlayerStart 오브젝트를 클릭합니다. 이동 기즈모를 사용하여 첫 번째 방에서 플레이어를 스폰할 위치로 옮깁니다.
키보드의 Q를 눌러 선택(Select) 모드로 변경하고 기즈모를 제거합니다. PlayerStart 오브젝트의 파란색 화살표는 게임이 시작될 때 플레이어가 향하는 방향을 보여줍니다.
트랜스폼 툴바를 사용하여 회전 기즈모로 전환하고 이를 회전하여 플레이어가 시작할 때 향하는 방향을 제어할 수 있습니다.
문 추가
이 튜토리얼의 후반부에서는 키를 다양한 컬러로 설정하여 각 컬러와 일치하는 문이 열리는 블루프린트를 만드는 방법을 알아봅니다. 이 기능을 사용할 레벨을 구성하려면 몇 개의 문을 추가합니다.
BP_DoorFrame 블루프린트를 추가하고 크기를 조정하려면 다음 단계를 따릅니다.
윤곽 작업에서 세 개의 문을 위한 공간을 만듭니다.
콘텐츠 브라우저에서 콘텐츠 > LevelPrototyping > Interactable > Door로 이동합니다.
BP_DoorFrame을 레벨로 드래그합니다. 이 오브젝트는SM_Cube와 같은 일반 스태틱 메시가 아닙니다. 블루프린트는 스크립팅된 추가 기능이나 행동이 포함된 비주얼 에셋입니다. 뷰포트에서 문 프레임이 트리거 볼륨으로 둘러싸여 있고 문 크기 위젯이 있는 것을 볼 수 있습니다. 이 튜토리얼의 다음 모듈에서는 블루프린트에 대해 자세히 알아봅니다.문 크기 위젯을 클릭합니다. 이렇게 하면 이동 기즈모가 강제로 활성화되지만 스케일 기즈모를 사용하는 것처럼 문 크기를 조정할 수 있습니다.
문의 메시를 클릭하고 이동 기즈모를 사용하여 문을 벽의 틈 중 하나로 이동합니다. 모든 것이 잘 맞도록 벽이나 문 너비를 조정해야 할 수도 있습니다.
톱다운 와이어프레임 뷰의 미세 조정이 단계를 반복하여 방에 문을 두 개 더 추가합니다.
복도 만들기
다음으로, 첫 번째 방과 두 번째 방을 연결하는 복도에 이동 공간을 추가합니다.
복도를 디자인할 수 있는 몇 가지 방법이 있습니다. 먼저, 직선으로 만들면 어떨까요?
별로 흥미진진하지는 않지만, 플레이어가 이 복도를 지나갈 때 원거리 공격으로 압박을 받거나, 복도 끝에 보이는 모습을 예상하게 하려는 경우에는 효과적일 수 있습니다. 다음은 플레이어가 아래로 피하거나 넘어야 하는 장애물로 인해 더욱 흥미로워진 직선 복도의 예시입니다.
굽은 복도는 어떨까요?
이제 플레이어가 모퉁이를 돌 때 약간의 오클루전과 노출이 생깁니다. 오클루전은 플레이어의 시야가 부분적으로 또는 완전히 차단되는 것을 말합니다. 오클루전을 사용하여 레벨 내에서 플레이어의 주의를 끌 수 있습니다. 예를 들어 줍기와 레벨 진행으로 주의를 돌리거나, 점프 스캐어를 촉진하기 위해 적의 시야를 가리는 경우가 있습니다.
복도와 옆 방에 창문을 추가하면 어떻게 될까요?
이를 통해 복도를 이동하는 것이 좀 더 흥미로워질 수 있습니다. 플레이어에게 목적지를 살짝 보여주면 기대감을 높이고 해당 경로에 시간을 투자하여 얻게 되는 보상을 확인할 수 있습니다.
수직성을 더하면 어떨까요? 이는 즉, 계단, 언덕, 플랫폼, 올라갈 수 있는 영역 등 레벨에 높이 차이를 더한다는 뜻입니다.
수직 엘리먼트는 게임플레이에서 다음과 같은 역할을 할 수 있습니다.
공간에 다양성을 더하고 이동과 탐색을 보다 흥미롭게 만듦
플레이어에게 전술적인 유리함(높은 경우) 또는 불리함(낮은 경우) 부여
플레이어에게 다음 목적지 제시(예: 전망이 내려다보이는 곳)
플레이어의 접근 제어(예: 다시 돌아갈 수 없는 공간에 떨어지거나, 로프를 찾아야만 공간에 올라갈 수 있음)
윤곽 작업에 계단을 추가하려면 SM_Ramp(콘텐츠 > LevelPrototyping > Meshes)를 레벨로 드래그하고 크기를 조정합니다. 이동하면서 스케일을 테스트해야 합니다.
이 복도는 너무 모나지 않게 오클루전을 추가하기 위해 굽어져 있으며, 두 개의 다른 경로를 수용할 정도로 더 넓습니다. 각 경로는 은신하고 엄폐할 기회를 제공합니다. 이와 같은 선택지를 추가하면 플레이어가 주체적으로 선택할 수 있다는 느낌을 받을 수 있습니다.
일찍 그리고 자주 테스트하기
제작을 이어나가기 전에 레벨을 플레이하고 메트릭과 스케일의 느낌을 확인하세요.
플레이어의 시선을 테스트하여 오클루전이 제대로 구성되었는지 확인합니다. 공간이 뷰포트에서 보기에는 좋아 보일 수 있지만, 플레이 테스트를 통해 플레이어가 다른 팀의 스폰 포인트처럼 봐서는 안 되는 것을 볼 수 있다는 것을 알 수 있습니다.
레벨이 커짐에 따라 플레이어의 스폰 포인트에서 다시 시작하지 않고 한 섹션을 프리뷰하려면 뷰포트에서 한 지점을 우클릭하고 여기에서 플레이(Play From Here)를 선택합니다.
블로킹 볼륨 추가
디자인을 플레이테스트하면서 플레이어가 지오메트리를 지나쳐 플레이 영역을 벗어나거나 건너뛸 수 있는 곳을 발견할 수 있습니다. 블로킹 볼륨은 의도하지 않은 영역을 차단하고 플레이어가 레벨을 벗어나지 않도록 보이지 않는 벽 역할을 하는 레벨 오브젝트입니다.
따라서, 열린 출입구나 복도처럼 플레이어가 자유롭게 움직일 것으로 예상되는 곳에서는 절대 블로킹 볼륨을 사용하지 마세요.
레벨에 블로킹 볼륨을 추가하려면 다음 단계를 따릅니다.
메인 툴바에서 생성(Create) 버튼을 클릭합니다. 이 메뉴에서는 새 액터를 생성할 수 있습니다.
생성 메뉴에서 볼륨(Volumes)으로 스크롤하여
Blocking을 검색하고 블로킹 볼륨(Blocking Volume)을 선택합니다.그러면 메인 뷰포트 중간에
BlockingVolume이 추가됩니다.
블로킹 볼륨 작업을 마친 후에는 뷰에서 볼륨을 숨겨 레벨에서의 혼란을 줄일 수 있습니다.
이 예시 복도에서 블로킹 볼륨은 플레이어가 기둥을 올랐을 때 창문 밖으로 뛰어내리거나 지붕으로 점프하는 것을 방지합니다.
블로킹 볼륨은 또한 복잡한 콜리전 셰이프나 디테일한 지오메트리를 균일하게 만들 수 있으므로 플레이어가 작은 모서리나 구멍에 갇히거나 부딪히지 않게 됩니다.
아웃라이너에서 오브젝트 정리하기
레벨이 커짐에 따라 아웃라이너 패널의 오브젝트 목록도 커집니다. 아웃라이너를 더 깔끔하고 탐색하기 쉽게 만들려면 오브젝트를 폴더로 정리합니다. 폴더를 생성하여 기능 또는 위치별로 오브젝트를 그룹화할 수 있습니다.
모든 윤곽 작업 메시가 포함된 Geometry 폴더를 생성하려면 다음 단계를 따릅니다.
아웃라이너 패널에서 윤곽 작업 지오메트리를 모두 선택합니다. (Ctrl 또는 Shift를 눌러 선택에 추가합니다.)
아웃라이너 우측 상단에서 폴더 생성(Create folder) 버튼을 클릭합니다.
폴더 이름을 입력합니다(예:
Geometry).
레벨이 커짐에 따라 레벨의 각 영역이나 방에 대한 윤곽 작업 지오메트리 폴더를 생성하여 프로젝트를 보다 체계적으로 정리할 수 있습니다.
메시의 서브셋에 이 단계를 반복하여 Geometry 폴더의 하위 폴더에 정렬할 수 있습니다.
아웃라이너의 비저빌리티 토글을 사용하여 폴더의 모든 오브젝트를 숨깁니다.
텍스트 라벨 추가
다가오는 공간, 장애물 또는 게임플레이 엘리먼트에 라벨을 지정하려면 윤곽 작업에 텍스트 렌더 액터를 추가합니다. 이 텍스트는 자리표시자 역할을 하거나 플레이테스터에게 해당 공간에 무엇이 계획되어 있는지 컨텍스트를 제공할 수 있습니다.
텍스트 렌더 액터를 사용하여 레벨에 텍스트 스트링을 표시하려면 다음 단계를 따릅니다.
메인 툴바에서 생성 버튼을 클릭합니다.
생성 메뉴에서
Text Render를 검색하고 텍스트 렌더 액터(Text Render Actor)를 선택합니다. 그러면 메인 뷰포트 중간에 TextRenderActor가 추가됩니다.액터를 선택한 상태로 디테일 패널에서 텍스트(Text) 프로퍼티를 사용하여 레벨에 표시할 텍스트를 입력합니다.
월드 크기(World Size)를 사용하여 텍스트를 더 크거나 작게 만들고, 텍스트 렌더 컬러(Text Render Color)를 사용하여 텍스트 컬러를 변경합니다.
텍스트를 회전하고 해당 위치로 이동합니다. 텍스트 렌더 액터는 벽, 바닥 또는 장애물에 배치했을 때 가장 잘 보입니다.
선택 사항: 텍스트 렌더 액터를 게임에서 표시되지 않게 하려면 디테일(Details) 패널의 렌더링(Rendering) 섹션에서 게임에서 액터 숨김(Actor Hidden in Game)을 활성화합니다.
디자인 향상
첫 번째 방과 몇 개의 복도로 시작해 보았으니, 계속 제작을 진행하세요!
이 튜토리얼의 나머지 부분을 완료하려면 윤곽 작업에 다음 엘리먼트를 포함하는 것이 좋습니다.
플레이어가 세 가지 키를 수집하고 각 키와 맞는 문을 열 수 있는 영역
바닥 스위치로 비활성화할 수 있는 미로 같은 함정을 배치하는 영역
일련의 움직이는 플랫폼을 가로지르는 영역
NPC 적과 싸우는 영역
이를 뛰어넘어 상상력을 발휘하고, 실험하고, 반복작업하세요! 이것이 바로 그레이박싱의 미학입니다.
제작할 때 고려해야 할 몇 가지 디자인 원칙이 더 있습니다.
장애물 및 오클루전
몇 가지 기능적 장애물이 있다는 점을 잊지 마세요. 예를 들면 다음과 같습니다.
명백한 경로를 차단하여 플레이어가 흥미로운 우회로를 찾도록 강제하는 오브젝트
시선을 차단하고 흥미를 더하는 기둥
엄폐물을 생성하는 오브젝트
플레이어에게 점프, 웅크리기, 기어 다니기와 같은 일부 동작을 알려주는 지오메트리
다음은 일부 높이 변경 및 오클루전을 적용하여 윤곽 작업한 방의 예시입니다.
레벨 흐름 및 안내선
레벨에서 플레이어 경로의 리듬과 속도를 고려해 보세요. 다음 영역으로 자연스럽게 안내되나요? 긴장감과 고요함의 순간이 있나요? 플레이어가 선택의 여지가 있다고 느끼나요?
안내선과 안내 지점을 사용하면 플레이어가 자신도 모르는 사이에 관심 영역으로 이동할 수 있습니다. 플레이어가 자연스럽게 이러한 요소를 따라가게 되므로 월드가 직관적으로 느껴지게 됩니다.
예를 들면 다음과 같습니다.
케이블, 파이프, 펜스, 난간, 통로가 이러한 가장자리를 따라 플레이어의 시선을 끕니다.
광원 또는 대비되는 비주얼이 플레이어의 주의를 끕니다.
다음 영역을 구성하는 랜드마크 또는 출입구 뷰는 플레이어를 해당 방향으로 이끕니다.
플레이어가 이 방에 들어서면, 플레이어는 벽을 따라 창문을 향해 이동하며, 플레이어를 출구로 이끕니다.
공간을 디자인할 때는 공간을 어떻게 이동할지 생각해 보세요. 예를 들어 이 튜토리얼에서는 플레이어가 특정 목표를 완료한 후 첫 번째 방으로 돌아가야 하는 허브 앤 스포크 스타일의 공간을 만듭니다. 여기서는 플레이어가 여러 번 통과해야 하므로 복도가 너무 길지 않아야 합니다.
셰이프 언어
개발의 윤곽 작업 단계에서도 다양한 셰이프를 사용하여 플레이어에게 감정이나 기능을 전달할 수 있습니다.
둥근 모서리와 커브는 자연과 안전을 암시하므로 이러한 셰이프는 휴식 공간이나 치유 위치에서 잘 어울립니다.
사각형 또는 박스 영역은 인공적이고 안정적이며 정돈된 느낌을 줍니다.
삼각형, 들쭉날쭉하거나 뾰족한 영역은 위험하게 느껴집니다. 이 같은 공간은 플레이어에게 근처에 함정이나 적이 있음을 묵묵히 경고할 수 있습니다.
높거나 넓은 공간은 힘을 불러일으킬 수 있는 반면, 밀실 공포증을 느끼게 하는 어수선한 공간은 긴장감과 불편함을 유발합니다.
예를 들어 이 튜토리얼의 이후 섹션에서는 플레이어가 함정에 떨어지면 대미지를 입히는 함정을 디자인합니다. 플레이어는 스파이크를 위험과 연관시키므로, 이 디자인은 이 셰이프 언어를 사용하여 플레이어에게 이 장애물을 피해야 한다고 알려줍니다.
윤곽 작업 예시
이 튜토리얼의 나머지 부분에서 사용하는 공간은 다음과 같습니다. 여기에 맞춰도 되고, 전부 직접 디자인해도 됩니다.
모든 방에는 번호가 있으므로 이 튜토리얼의 단계는 특정 방을 참조할 수 있습니다.
방은 점점 복잡해지는 모습을 보여주기 위해 만들어졌습니다.
Start Room은 플레이어가 시작하는 장소입니다. 또한, Start Room으로 연결되는 작은 스폰 영역도 추가했습니다.
Room 2는 기본적인 L자형 복도가 있는 평범한 방입니다.
Room 1은 다양한 경로, 오클루전, 높이 변화를 특징으로 하는 굽은 복도로 인해 복잡도가 증가합니다.
Room 3에서는 1인칭 템플릿에 포함된 기본 셰이프를 사용하여 제작할 수 있는 모든 콘텐츠의 잠재력을 보여줍니다. 바닥과 벽에는 레벨 오브 디테일을 추가하여 게임의 아트 스타일에 영향을 주고, 아티스트가 해당 공간에 어떤 것이 들어갈 수 있는지 상상하도록 도와줍니다.
Room 1과 Room 2의 윤곽 작업 스타일은 보통 레벨 디자인 시 목표로 하는 일종의 디테일입니다.
Hallway 3과 Room 3은 콘텐츠 > LevelPrototyping > Interactable > Door > Assets > Meshes에 있는 BP_DoorFrame의 메시도 사용합니다.
샘플 레벨 사용해 보기
이 튜토리얼용으로 만든 샘플 윤곽 작업을 사용하려면 아래 스니펫을 사용하세요. 이 예시를 생성하는 데 사용된 모든 윤곽 작업 메시의 텍스트 버전입니다. 이 텍스트를 복사하여 레벨 에디터에 붙여넣으면 언리얼 엔진이 해당 텍스트를 레벨 오브젝트로 변환합니다.
Begin Map
Begin Level
Begin Actor Class=/Game/LevelPrototyping/Interactable/Door/BP_DoorFrame.BP_DoorFrame_C Name=BP_DoorFrame_C_4 Archetype="/Game/LevelPrototyping/Interactable/Door/BP_DoorFrame.BP_DoorFrame_C'/Game/LevelPrototyping/Interactable/Door/BP_DoorFrame.Default__BP_DoorFrame_C'" ExportPath="/Game/LevelPrototyping/Interactable/Door/BP_DoorFrame.BP_DoorFrame_C'/Temp/Untitled_1.Untitled_1:PersistentLevel.BP_DoorFrame_C_4'"
Begin Object Class=/Script/Engine.SceneComponent Name="DefaultSceneRoot" Archetype="/Script/Engine.SceneComponent'/Game/LevelPrototyping/Interactable/Door/BP_DoorFrame.BP_DoorFrame_C:DefaultSceneRoot_GEN_VARIABLE'" ExportPath="/Script/Engine.SceneComponent'/Temp/Untitled_1.Untitled_1:PersistentLevel.BP_DoorFrame_C_4.DefaultSceneRoot'"
End Object
Begin Object Class=/Script/Engine.BoxComponent Name="Box" Archetype="/Script/Engine.BoxComponent'/Game/LevelPrototyping/Interactable/Door/BP_DoorFrame.BP_DoorFrame_C:Box_GEN_VARIABLE'" ExportPath="/Script/Engine.BoxComponent'/Temp/Untitled_1.Untitled_1:PersistentLevel.BP_DoorFrame_C_4.Box'"
Begin Object Class=/Script/Engine.BodySetup Name="BodySetup_0" Archetype="/Script/Engine.BodySetup'/Game/LevelPrototyping/Interactable/Door/BP_DoorFrame.BP_DoorFrame_C:Box_GEN_VARIABLE.BodySetup_0'" ExportPath="/Script/Engine.BodySetup'/Temp/Untitled_1.Untitled_1:PersistentLevel.BP_DoorFrame_C_4.Box.BodySetup_0'"
End Object
End Object
Begin Object Class=/Script/Engine.TimelineComponent Name="Door Control" ExportPath="/Script/Engine.TimelineComponent'/Temp/Untitled_1.Untitled_1:PersistentLevel.BP_DoorFrame_C_4.Door Control'"
Begin Map
Begin Level
Begin Actor Class=/Script/Engine.ExponentialHeightFog Name=ExponentialHeightFog_0 Archetype="/Script/Engine.ExponentialHeightFog'/Script/Engine.Default__ExponentialHeightFog'" ExportPath="/Script/Engine.ExponentialHeightFog'/Temp/Untitled_1.Untitled_1:PersistentLevel.ExponentialHeightFog_0'"
Begin Object Class=/Script/Engine.BillboardComponent Name="Sprite" Archetype="/Script/Engine.BillboardComponent'/Script/Engine.Default__ExponentialHeightFog:Sprite'" ExportPath="/Script/Engine.BillboardComponent'/Temp/Untitled_1.Untitled_1:PersistentLevel.ExponentialHeightFog_0.Sprite'"
End Object
Begin Object Class=/Script/Engine.ExponentialHeightFogComponent Name="HeightFogComponent0" Archetype="/Script/Engine.ExponentialHeightFogComponent'/Script/Engine.Default__ExponentialHeightFog:HeightFogComponent0'" ExportPath="/Script/Engine.ExponentialHeightFogComponent'/Temp/Untitled_1.Untitled_1:PersistentLevel.ExponentialHeightFog_0.HeightFogComponent0'"
End Object
Begin Object Name="Sprite" ExportPath="/Script/Engine.BillboardComponent'/Temp/Untitled_1.Untitled_1:PersistentLevel.ExponentialHeightFog_0.Sprite'"
AttachParent="HeightFogComponent0"
End Object
Begin Map
Begin Level
Begin Actor Class=/Script/Engine.StaticMeshActor Name=Floor_90 Archetype="/Script/Engine.StaticMeshActor'/Script/Engine.Default__StaticMeshActor'" ExportPath="/Script/Engine.StaticMeshActor'/Temp/Untitled_1.Untitled_1:PersistentLevel.Floor_90'"
Begin Object Class=/Script/Engine.StaticMeshComponent Name="StaticMeshComponent0" Archetype="/Script/Engine.StaticMeshComponent'/Script/Engine.Default__StaticMeshActor:StaticMeshComponent0'" ExportPath="/Script/Engine.StaticMeshComponent'/Temp/Untitled_1.Untitled_1:PersistentLevel.Floor_90.StaticMeshComponent0'"
End Object
Begin Object Name="StaticMeshComponent0" ExportPath="/Script/Engine.StaticMeshComponent'/Temp/Untitled_1.Untitled_1:PersistentLevel.Floor_90.StaticMeshComponent0'"
StaticMesh="/Script/Engine.StaticMesh'/Engine/MapTemplates/SM_Template_Map_Floor.SM_Template_Map_Floor'"
bUseDefaultCollision=False
StaticMeshDerivedDataKey="STATICMESH_34081786561B425A9523C94540EA599D_359a029847e84730ba516769d0f19427Simplygon_5_5_2156_18f808c3cf724e5a994f57de5c83cc4b_680318F3495BDBDEBE4C11B39CD497CE000000000100000001000000000000000000803F0000803F00000000000000000000344203030300000000"
MaterialStreamingRelativeBoxes(0)=4294901760
Begin Map
Begin Level
Begin Actor Class=/Script/Engine.StaticMeshActor Name=StaticMeshActor_911 Archetype="/Script/Engine.StaticMeshActor'/Script/Engine.Default__StaticMeshActor'" ExportPath="/Script/Engine.StaticMeshActor'/Game/AdventureGame/deleteme.deleteme:PersistentLevel.StaticMeshActor_911'"
Begin Object Class=/Script/Engine.StaticMeshComponent Name="StaticMeshComponent0" Archetype="/Script/Engine.StaticMeshComponent'/Script/Engine.Default__StaticMeshActor:StaticMeshComponent0'" ExportPath="/Script/Engine.StaticMeshComponent'/Game/AdventureGame/deleteme.deleteme:PersistentLevel.StaticMeshActor_911.StaticMeshComponent0'"
End Object
Begin Object Name="StaticMeshComponent0" ExportPath="/Script/Engine.StaticMeshComponent'/Game/AdventureGame/deleteme.deleteme:PersistentLevel.StaticMeshActor_911.StaticMeshComponent0'"
StaticMesh="/Script/Engine.StaticMesh'/Game/LevelPrototyping/Meshes/SM_Cylinder.SM_Cylinder'"
StaticMeshImportVersion=1
StaticMeshDerivedDataKey="STATICMESH_FD1BFC73B5510AD60DFC65F62C1E933E_228332BAE0224DD294E232B87D83948FQuadricMeshReduction_V2$2e1_6D3AF6A2$2d5FD0$2d469B$2dB0D8$2dB6D9979EE5D2_CONSTRAINED0_100100000000000000000000000100000000000080FFFFFFFFFFFFFFFFFFFFFFFF000000000000803F00000000000000803F0000803F00000000000000003D19FC1626C9B2485E57DB4B8EC731318B8215AE8D46FAD400000000010000000100000000000000010000000100000000000000000000000100000001000000400000000000000001000000000000000000F03F000000000000F03F000000000000F03F0000803F00000000050000004E6F6E65000C00000030000000803FFFFFFFFF0000803FFFFFFFFF0000000000000041000000000000A0420303030000000000000000_RT00_0"
RelativeLocation=(X=-2790.000000,Y=-1610.000000,Z=-0.499892)
이 윤곽 작업 예시를 빈 레벨에 복사하려면 다음 단계를 따릅니다.
새 기본 타입 레벨에서 Floor 및 PlayerStart 메시를 삭제하여 라이팅 레벨 오브젝트만 포함된 레벨을 만듭니다.
전체 스니펫 복사하기(Copy Full Snippet)를 클릭합니다.
언리얼 에디터에서 뷰포트 또는 아웃라이너가 활성 패널인지 확인한 다음(뷰포트 또는 아웃라이너에서 아무 곳이나 클릭하고 Esc를 누름) Ctrl + V를 누릅니다.
모든 방과 복도에 대해 반복합니다.
아웃라이너에서는 모든 메시가 각 방과 복도의 이름을 딴 폴더로 정리된 것을 볼 수 있습니다.
샘플 레벨은 아웃라이너의 많은 오브젝트에 명명 규칙을 사용합니다. 레벨 프로토타입 메시의 이름은 용도에 따라 다음과 같이 변경됩니다.
벽의 이름은
SM_Wall입니다.열의 이름은
SM_Column및SM_QuarterColumn입니다.
이러한 명명 규칙을 사용하여 오브젝트 이름을 변경하려면 아웃라이너에서 메시 그룹을 선택하고 선택 항목을 우클릭한 다음 편집 > 선택된 액터 이름 변경(Rename Selected Actors)으로 이동합니다. 아웃라이너에서의 작업에 대한 자세한 내용은 아웃라이너 문서를 참고하세요.
다음 단계
레벨 윤곽 작업을 했다면 이제 게임플레이 엘리먼트를 추가할 차례입니다. 다음 섹션에서는 언리얼 엔진의 블루프린트 비주얼 스크립팅을 소개하고 블루프린트 레벨 오브젝트에 게임플레이 로직을 빌드하는 방법을 알아봅니다.
이 튜토리얼 시리즈의 다음 문서에서는 언리얼 엔진의 비주얼 스크립팅 언어 블루프린트를 사용합니다. 블루프린트가 처음이며, 블루프린트를 사용하여 게임 로직을 프로그래밍하는 방법을 알아보려면 블루프린트 기초 문서를 참고하세요.
블루프린트에 이미 익숙하다면 키 만들기 튜토리얼을 진행해도 됩니다.