Godot 엔진으로 3D 게임 만들기
요약
이 영상은 Godot 엔진을 사용하여 3D 게임 환경을 구축하는 방법을 다룹니다. CSG(Constructive Solid Geometry) 기능을 활용하여 벽이나 창문 같은 구조물을 만들고, 이를 결합기 노드(CSG combiner node)로 하나로 합치는 과정을 보여줍니다. 또한, 레벨 디자인 시 회색 상자 작업과 지형 제작을 위한 Terrain 툴 사용법도 간략히 소개합니다.
핵심 포인트
- Godot의 CSG 기능을 이용해 벽이나 창문 같은 구조물을 쉽게 만들 수 있습니다.
- CSG 결합기 노드는 여러 개의 자식 노드를 하나의 충돌체로 합치는 데 유용합니다.
- 레벨 디자인 시 초기 레이아웃을 잡는 '회색 상자(Gray Box)' 작업에 집중하는 것이 중요합니다.
- 대규모 야외 환경에는 Godot의 확장 기능인 'terrain 3D'를 활용할 수 있습니다.
Video: Godot에서 3D 게임 만드는 방법
Channel: Brackeys
Duration: 49m 42s
Source: 자막 (자동, 영어)
Transcript:
1 10°와 10% 스케일. 이제 새로운 노드를 추가하고 CSG를 검색할 수 있습니다. 보시다시피 여기에는 여러 가지가 있습니다. 저는 박스부터 시작하겠습니다. 여기서 핸들바를 클릭하고 드래그하여 단순히 크기를 조정할 수 있습니다. Alt 키를 누르고 있으면 양쪽 모두에 미러링됩니다. 이 점이 좋은 것은 충돌체(Collision)를 별도로 추가할 필요가 없다는 것입니다. 여기 오른쪽으로 가서 '충돌 사용(use collision)'을 활성화하기만 하면 됩니다. 이제 이것과 충돌할 수 있습니다. 벽을 하나 빠르게 만들겠습니다. 그리고 만약 여기에 창문을 추가하고 싶다고 가정해 봅시다. 이 경우 빼기 편집(subtractive editing)을 사용할 수 있습니다. 이 CSG 박스 아래에 새로운 CSG를 추가하고, 이번에는 원통형으로 만들어 보겠습니다. 창문이 원하는 위치에 오도록 배치하고, 벽의 양쪽 측면으로 돌출되도록 확실히 하겠습니다. 그리고 이것을 우리 박스로 빼기하려면, 단순히 연산(operation)을 '합집합(Union)'에서 '빼기(subtraction)'로 변경합니다. 보시다시피 둥근 창문이 생겼고, 우리는 이것을 아주 쉽게 조정하여 모든 종류의 것을 할 수 있습니다. 예를 들어, 이것을 아치형으로 만들고 싶다면, 단순히 아래로 드래그하여 크기를 조정하면 아치형이 됩니다. 원통형의 측면도 늘려서 좀 더 멋지게 보이도록 할 수도 있습니다. 정말 멋지고 CSG를 사용하면 Godot에서 훨씬 더 많은 것을 할 수 있지만, 시작하기에는 충분합니다. 그래서 이 기술들을 사용하여 간단한 프로토타입을 만들어 보겠습니다. 종종 레벨을 만들 때 오른쪽 상단으로 가서 축(axis)을 클릭하여 해당 보기로 변경하는 것이 좋습니다. 모든 것을 측면이나 위에서 볼 수 있는 정말 좋은 방법입니다. 종료하려면 중간 마우스 버튼으로 클릭하고 드래그하기만 하면 됩니다. [음악] 이제 가끔 CSG 결합기 노드(CSG combiner node)를 사용합니다. 플러스 CSG 결합기를 누르면 이 모든 자식 CSG들을 하나로 합칩니다. 예를 들어 이러한 방과 같은 정적 지오메트리(static geometry)의 경우, 거의 모든 것을 가져와서 이 하나의 CSG 결합기 아래에 넣을 수 있습니다. 단지 그 노드에서 '충돌 사용(use Collision)'을 확인하는 것만 기억하세요. 왜냐하면 이제 모든 것이 하나가 되었기 때문입니다. 그래서 저는 블록아웃했습니다.
이 두 개의 방을 만들었고, 의도적으로 지금은 매우 비워두었습니다. 이 장면이 제 머릿속에서 어떻게 보일지 아이디어가 떠오르기 시작했지만, 회색 상자(gray box) 작업에는 대략적인 레이아웃을 잡는 데 집중했습니다. 또한 벽에 타일링 가능한 에셋(tileable assets)을 사용할 것이라는 점을 알고 있어서 90도 각진 모양으로만 유지했습니다. 이 부분은 마음껏 자유롭게 하셔도 좋고, 아예 제외하셔도 괜찮습니다. 모든 프로젝트가 회색 상자 작업이 필요한 것은 아니기 때문입니다. 이제 말씀드려야 할 것이 있습니다. 지금까지는 건축적인 레벨(architectural level)로 변하고 있지만, 때로는 대규모 야외 장면과 같은 더 유기적인 환경으로 작업하고 싶을 때도 있습니다. 이런 경우 필요에 맞게 지형(Terrain)을 조각하고 페인팅할 수 있게 해주는 Terrain 툴을 사용하는 것이 일반적입니다. Godot에는 이를 위한 내장 솔루션은 없지만, 'terrain 3D'라는 확장 기능이 있는데, 이 기능이 gdau에서 지형 작업에 가장 많이 사용되는 도구로 빠르게 자리 잡고 있습니다. 지형을 만드는 것은 정말 재미있고 창의적인 과정이지만, 이번 영상의 범위는 아닙니다. 나중에 terrain과 foliage에 대해 더 알고 싶으시면 알려주세요. 좋습니다. 이제 게임을 플레이하려면 카메라를 추가해야 합니다. 새로운 노드(node)인 Camera를 추가하고 'Camera 3D'를 선택하겠습니다. 이것을 이동시켜서 레벨이 보이도록 하고, 아래로 회전시키겠습니다. 기억하세요, 이 'Tile'을 선택하면 언제든지 미리 볼 수 있습니다. 이제 카메라는 우리의 레벨을 바라보고 있으며, 플레이(play) 버튼을 클릭하거나 F5를 누르면 메인 씬(main scene)을 설정하라고 요청할 것입니다. 'Select Current'를 누르겠습니다. 우리의 레벨은 회색 상자 작업으로도 그다지 흥미로워 보이지 않습니다. 그 이유는 Godot이 기본적으로 씬 뷰(scene view)에서 미리 보기 태양(preview sun)과 환경(environment)을 사용하지만, 게임을 실행할 때는 그렇지 않기 때문입니다. 실제로 이 버튼들을 사용하여 미리 보기 태양과 환경을 조작할 수 있으며, 확장하면 태양의 방향 같은 설정도 조정할 수 있고, 이를 게임에 추가할 수도 있습니다. 그러니 간단히 'Add Sun to Scene'과 'Add Environment to Scene'를 누르겠습니다. 보시다시피 이것은 두 개의 새로운 노드, 즉 우리의 태양이 될 Directional Light와 WorldEnvironment를 생성합니다. 이제 우리는 이 태양을 회전시켜서 어디에 위치할지 조정할 수 있습니다.
그리고 WorldEnvironment를 생성합니다. 이 환경은 나중에 다룰 것이고, 이제 플레이해보면 레벨을 볼 수 있지만, 움직일 수 없다면 무슨 재미가 있겠습니까? 이를 위해서는 일종의 캐릭터 컨트롤러(character controller)가 필요합니다. 하지만 2D에서처럼 견고한 컨트롤러를 만드는 것은 실제로 상당히 복잡해질 수 있습니다. 그리고 컨트롤러의 요구 사항은 전적으로 만들고자 하는 게임에 달려있습니다. 1인칭인지, 3인칭인지, 카메라가 자유롭게 움직이는지 아니면 캐릭터에 고정되는지, 점프 기능이 필요한지, 더블 점프, 벽 점프, 계단, 경사로, 질주(Sprint), 웅크리기(Crouch), 엎드리기(Prone), 수영, 수영 중 공격 등... 너무 많습니다. 그리고 이것은 캐릭터 컨트롤러에 대한 영상이 아닙니다. 다행히도 다양한 유형의 컨트롤러를 만드는 방법에 대한 좋은 자료들이 많이 있습니다. 그래서 다음 한 시간을 당신에게 맞지 않을 수도 있는 컨트롤러를 프로그래밍하는 데 쓰는 대신, 제가 확인해 볼 수 있는 몇 가지 링크들을 연결해 드리겠습니다. 간단하게 시작할 것을 추천합니다. 게임이 진행되고 더 익숙해짐에 따라 언제든지 컨트롤러를 확장할 수 있습니다. 또한 저는 프로토타이핑용 1인칭 게임에 사용할 매우 간단한 캐릭터 컨트롤러를 만들었습니다. 이것을 protoc controller라고 부릅니다. 무료로 다운로드할 수 있으며, CC Zero 라이선스 하에 있으므로 무엇에든 사용할 수 있습니다. 이 컨트롤러는 단순하게 설계되었으며 점프, 질주, 그리고 테스트 시 매우 유용하다고 생각하는 자유 비행 모드(free fly mode)와 기본적인 움직임을 갖추고 있습니다. 가져오려면 protoc controller 폴더를 그대로 gdo의 add-ons 폴더로 드래그하면 됩니다. 만약 add-ons 폴더가 없다면, 새 폴더를 만들고 이름을 add-ons라고 지정하기만 하면 됩니다. 이제 우리의 protoc controller를 그 안에 드래그할 수 있습니다. 끝입니다. 이제 여기로 가서 protoc controller 씬을 가져와서 회색 상자 레벨(gray box level)에 드래그합니다. 전에 만들었던 카메라를 제거하고, 이제 플레이하면 화살표 키를 사용해 주변을 둘러보고 움직일 수 있고, 스페이스 바를 사용해 점프하여 마우스 제어권을 되찾을 수도 있습니다. 이스케이프 키를 누르면 컨트롤러로 들어가 볼 수 있는데, 정말 간단하다는 것을 알 수 있습니다. 이것은 의도된 것입니다.
간단한 프로토타이핑을 위해 매우 기본적인 상태로 유지했습니다. 이동을 제어하는 캐릭터 컨트롤러, 임시 그래픽용 메쉬 인스턴스, 충돌 모양(Collision shape), 그리고 헤드 노드 아래에 카메라 3D가 있습니다. 스크립트는 콜라이더와 헤드 노드를 참조하므로, 스크립트를 수정하고 싶지 않다면 그대로 두세요. 만약 수정하고 싶다면 스크립트 버튼을 클릭하는 것만큼 간단합니다. 여기에 모든 코드가 있습니다. 상단 메모에서 어떤 기능을 포함할지 선택하거나 일부 속도를 조정할 수 있습니다. 'Sprint'와 'freefly'를 활성화하겠습니다. 이때 입력 액션(input actions)으로 이동하여 적절한 키에 바인딩해야 한다는 것을 확실히 해야 합니다. 이것은 2D와 정확히 같습니다. 입력을 추가하려면 프로젝트 설정(project settings) > 입력 맵(input map)으로 이동하고, 여기서 하고 싶은 모든 것에 대한 액션을 추가할 수 있습니다. 저도 이동을 위한 몇 가지를 추가하여 제 키에 바인딩할 수 있도록 하겠습니다. 이제 액션이 생겼으니 여기에 키를 바인딩할 수 있습니다. 이것을 컨트롤러에 넣으려면 이 이름들을 가져와서 입력 액션에 넣어주기만 하면 됩니다. 이제 플레이하면 적절한 키로 이동할 수 있고, 심지어 'Sprint'도 할 수 있으며, 'freefly' 모드로 전환하고 물론 다시 전환할 수도 있습니다. 멋집니다! 이제 레벨을 만들고 테스트를 시작할 수 있습니다. 기능 구현은 거의 다 끝났지만, 물리(physics)에 대해 간단히 언급하고 싶습니다. 3D 물리(3D physics)는 2D와 매우 유사하게 작동하며 동일한 노드를 많이 사용합니다. 정적 콜라이더를 생성하려면 'StaticBody3D' 노드를 사용하고 자식으로 'CollisionShape3D'를 연결합니다. 여기에 모양 리소스(shape resource)를 추가하고 크기를 맞추면 끝입니다. 물리 시뮬레이션 객체에는 다시 'RigidBody3D'와 'CollisionShape'를 사용합니다. 한 가지 알아둘 점은 Godot이 스케일링에 다소 민감할 수 있다는 것입니다. 균일한(uniformly) 스케일링은 괜찮겠지만, 비균일 스케일링(non-uniform scaling)을 하면 경고가 발생하고 충돌 관련 이상 현상을 일으킬 가능성이 높습니다. 자, 이제 한 가지 제가 대부분의 경우에 정말 추천하는 것은 'Jolt' 물리 엔진으로 전환하는 것입니다. Jolt는 현재 엔진에 구현되고 있으며 기본 Godot 물리 엔진을 대체할 계획입니다.
많은 장점들이 주로 성능 향상과 더 안정적인 물리 시뮬레이션 측면에서 나에게는 기본 물리 엔진으로 인해 가끔 겪던 이상한 동작들을 많이 수정해 주었습니다. 또한 확장성도 훨씬 좋습니다. 여전히 몇 가지 차이점이 있으니, Jolt가 자신에게 맞는지 확신이 서지 않는다면 더 많은 것을 배울 수 있는 링크와 진행 상황을 추적할 수 있는 곳을 알려드리겠습니다. 만약 Godot 4.4 이상 버전을 사용한다면, Jolt는 이미 엔진의 일부이며 '프로젝트(Project)' > '프로젝트 설정(Project Settings)'으로 이동하여 아래로 스크롤한 후 '물리 3D(Physics 3D)'에서 물리 엔진을 'Jolt Physics'로 설정하기만 하면 됩니다. 재시작하라고 요청할 것입니다. 그리고 Jolt가 활성화됩니다. 이전 버전에서는 제가 Godot 4.3으로 이 작업을 진행하고 있습니다. 먼저 애드온(add-on)으로 설치해야 합니다. 따라서 '에셋 라이브러리(Asset Library)'로 가서 온라인에서 'godot jolt'를 검색할 것입니다. 클릭하여 다운로드한 후, '설치(Install)', '저장(Save)', 그리고 '재시작(Restart)'을 누릅니다. 이제 같은 위치인 프로젝트 설정의 물리 3D에서 활성화할 수 있습니다. '고급(Advanced)'을 체크해야 하며, '물리 엔진(Physics Engine)' 아래에 'Jolt Physics'가 있습니다. 다시 한번 재시작해야 합니다. 보시다시피 게임 자체에는 아무것도 변경하지 않았습니다. 이전과 똑같이 실행하고 돌아다닐 수 있지만, 이제 우리가 사용하는 모든 물리 노드들이 Jolt를 사용합니다. 이것이 바로 3D 게임의 기능 프로토타입을 시작하고 구축할 수 있는 방법입니다. 왜냐하면 3D는 단순히 게임을 정말로 엄청나게 멋지게 만드는 것 이상이기 때문입니다. 물론 그것도 재미있지만요. 그리고 그래픽은 아마 2D와 3D 개발 사이에서 가장 큰 차이점일 것입니다. 그러니 '그래픽 공원(Graphics Park)'에 오신 것을 환영합니다. Godot에서 3D 그래픽을 다룰 때, 저는 대부분의 작업이 게임의 외관에 기여하는 세 가지 주요 기둥 아래에 있다고 생각합니다. 제가 이것들을 '3D 그래픽의 3대 요소(the 3DS of 3D Graphics)'라고 부르고 싶습니다. 첫 번째는 에셋입니다. 장면에 배치하는 텍스처와 재질을 가진 모델들, 두 번째는 조명입니다. 장면에 설정하는 광원들, 그리고 세 번째는 환경과 렌더링 선택입니다. 이들이 우리의 장면에 영향을 미칩니다. 만약 게임의 외관이 제대로 작동하지 않는다면, 아마도 이 기둥들 중 하나 이상이나 이 요소들이 제 역할을 하지 못하고 있기 때문일 것입니다.
물론 셰이더(shaders)와 V 효과(V effects)가 별도의 기둥이 필요하다고 주장할 수도 있지만, 이 영상의 범위를 어느 정도 합리적으로 유지하기 위해 해당 주제들은 완전히 건너뛰겠습니다. 게다가 3D 그래픽의 5D는 듣기만 해도 우스꽝스러우니, 먼저 gdau에서 3D 에셋을 가져오고 설정하는 것부터 살펴보고, 그다음 조명(lighting)과 환경(environment)으로 넘어가 보겠습니다. 여기서 많은 분들이 혼란을 느낀다고 생각하며, 이는 이해할 만합니다. 3D 에셋의 경우 종종 많은 전문 용어들이 난무하기 때문입니다. 만약 당신이 3D 아티스트라면 어떤 종류의 에셋과 포맷을 기대해야 하는지 알아야 워크플로우를 가장 잘 맞춤화할 수 있습니다. 하지만 비록 당신이 3D 아티스트가 아니더라도, 이러한 용어들이 무엇을 의미하는지에 대한 확실한 이해를 갖는 것이 중요합니다. 그래야 다른 사람이 만든 에셋을 엔진에 올바르게 구현할 수 있기 때문입니다. 모두 같은 페이지에 있는지 확인하기 위해, 일반적인 3D 게임 에셋을 구성하는 모든 것들에 대한 1분짜리 개요가 있습니다. 이미 3D 에셋 제작 경험이 있다면 정확히 1분을 건너뛰셔도 됩니다. 모델의 모양은 메시(mesh)라고 불립니다. 이것은 객체를 구성하는 실제 지오메트리 또는 폴리곤입니다. 메시에는 쉽게 색상을 할당할 수 있지만, 여러 색상으로 페인팅하여 텍스처링을 하고 싶다면 UV 맵(UV map)을 만들어야 합니다. UV 맵은 우리의 메시의 2D 표현입니다. 지도 위의 각 점은 메시 위의 한 점을 나타냅니다. 이것을 언래핑(unwrapping)이라고 부르며, 오렌지를 벗겨서 평평하게 펼쳐 놓는 것과 같다고 생각할 수 있습니다. 텍스처링은 가장 일반적으로 메시에 직접 페인팅하여 수행됩니다. 그러면 3D 프로그램이 UV 맵을 사용하여 이를 텍스처에 적용합니다. 그 결과물은 모델 위에 오버레이될 수 있는 2D 이미지입니다. 다음으로 표면 속성을 시뮬레이션하기 위해 머티리얼(materials)을 만듭니다. 우리의 모델이 나무처럼 거칠거나 금속처럼 부드럽고 반짝일 수 있습니다. 이러한 속성들은 표면 전체에 걸쳐 다를 수 있으므로, 이에 대한 텍스처도 만듭니다. 이제 캐릭터와 같은 일부 메시들은 구부러지고 애니메이션되어야 합니다. 이것은 움직이는 뼈(bones)를 정의하는 리그(rig)를 사용하여 수행됩니다.
각 뼈(bone)는 메시의 특정 부분에 매핑되어, 그 뼈가 움직일 때 메시도 함께 움직이게 됩니다. 이것은 잘못되었을 경우 우스꽝스럽게 보입니다. 마침내 게임 에셋은 캐릭터의 뼈를 움직이는 애니메이션 데이터와 같은 것을 가질 수 있습니다. 바라건대 이것이 일반적인 3D 게임 에셋을 구성하는 요소에 대한 아이디어를 드렸기를 바랍니다. 이제 우리 게임을 gdau가 잘 작동하도록 만드는 방법을 살펴보겠습니다. gdau는 이러한 모델 형식을 지원하며, 그중 gltf가 권장됩니다. gltf는 빠르게 인기가 높아지고 있는 개방형 표준(open standard)입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 YouTube Brackeys (Unity 튜토리얼)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기