Unity_Basic(1)
게임 개발 엔진으로는 Unity와 Unreal Engine이 주로 사용됩니다. 다양한 플랫폼 지원과 에셋 스토어를 통해 필요한 리소스를 쉽게 구할 수 있는 Unity 엔진에 대해 공부하고자 합니다. 여러 차례에 걸쳐 포스트를 작성하며 Unity를 공부한 내용을 기록으로 남기고자 합니다. 이번 포스트에서는 씬(Scene), 카메라(Camera), 게임 오브젝트(GameObject)와 컴포넌트(Component)에 대해 정리하고자 합니다.
씬(Scene)
Unity에서 씬(Scene)은 두 가지 모드인 ‘Perspective’와 ‘Isometric’을 제공합니다. ‘Perspective’ 모드는 원근감이 있는 모드를 의미하며, ‘Isometric’ 모드는 원근감이 없는 상태를 의미하는 ‘직교 모드’ 또는 ‘쿼터 뷰’라고 합니다. 이를 통해 3D 화면을 2D 화면으로 설정할 수 있습니다. 쿼터 뷰에서 기즈모(Gizmo)를 ‘Back’으로 변경하면 2D 작업 화면과 유사해집니다.
추가적으로, 씬은 게임 오브젝트, 라이트, 카메라 등을 배치하고 조작하는 공간입니다. 씬은 게임의 다양한 레벨이나 장면을 구성하며, 여러 씬을 하나의 프로젝트 내에서 관리할 수 있습니다. Unity에서는 씬을 쉽게 저장하고 불러올 수 있으며, 씬 간 전환을 통해 다양한 게임 플레이를 제공합니다.
게임 오브젝트
게임 오브젝트는 Unity에서 씬(Scene) 내의 개별적인 요소를 나타냅니다. 이들은 계층 구조를 가지며, 다양한 컴포넌트를 추가하여 기능을 확장할 수 있는 구성 요소 기반의 객체입니다. 주요 컴포넌트로는 트랜스폼(Transform), 메쉬 렌더러(Mesh Renderer), 콜라이더(Collider), 리지드바디(Rigidbody), 스크립트(Script), 애니메이터(Animator) 등이 있습니다.
또한, 게임 오브젝트는 프리팹(Prefab)으로 만들어 여러 번 재사용할 수 있습니다. 프리팹은 초기 설정이나 구성을 정의한 템플릿이며, 패킹(Packing) 및 언패킹(Unpacking)을 통해 기존의 프리팹을 수정하고 새로운 버전을 저장할 수 있습니다.
카메라
카메라는 플레이어의 눈 역할을 하며, 프로젝트에는 반드시 하나 이상의 카메라가 있어야 합니다. 카메라에는 기본적으로 세 가지 컴포넌트가 있습니다: ‘Transform’, ‘Camera’, ‘Audio Listener’. 이 중 ‘Audio Listener’는 씬에서 단 하나만 존재해야 합니다.
‘Camera’ 컴포넌트에는 ‘projection(투영)’ 속성이 있습니다. 이 속성은 원근감을 표현할지를 지정하는 속성으로, ‘Perspective’와 ‘Orthographic’ 두 가지 모드가 있습니다. ‘Perspective’ 모드는 원근감을 표현하고, ‘Orthographic’ 모드는 원근감이 없는 상태를 표현합니다. 하지만, 원근감이 없는 ‘Orthographic’모드를 선택하더라도, ‘size’ 속성을 조정하여 카메라(플레이어의 눈)에게 원근감을 표현하는 느낌을 줄 수 있습니다.
컴포넌트
컴포넌트(Component)는 Unity 게임 엔진에서 각각의 게임 오브젝트(GameObject)에 부착되어 특정 기능이나 동작을 정의하고 확장하는 단위입니다. 모든 게임 오브젝트는 여러 개의 컴포넌트로 구성될 수 있으며, 이를 통해 게임 오브젝트의 행동, 외관, 물리적 상호작용 등을 결정합니다.
메쉬 렌더러와 메쉬 필터
메시 렌더러(Mesh Renderer)는 Material과 Mesh를 결합하여 3D 모델을 시각적으로 표현하는 컴포넌트입니다. Material은 텍스처, 쉐이딩(쉐도우), 색상 등을 포함한 시각적 속성을 정의하며, Mesh는 기하학적 형태를 나타내는 데이터입니다. 메시 렌더러는 이 두 요소를 결합하여 게임 화면에 실제로 보이는 3D 객체를 생성합니다.
메시 필터(Mesh Filter)는 게임 오브젝트에 부착된 컴포넌트로, 메시(Mesh) 데이터를 포함하고 있습니다. 메시 필터는 기하학적인 형태의 정보를 제공하며, 이 정보는 메시 렌더러가 사용하여 실제로 3D 객체를 렌더링하는 데 필요합니다. 메시 필터는 오브젝트의 형태와 구조를 결정하는 데 중요한 역할을 합니다.
충돌체(Collider)와 리지드바디(Rigidbody)
콜라이더(Colliders)는 물리적인 몸체 역할을 하는 컴포넌트로, 오브젝트의 충돌 감지를 담당합니다. 콜라이더는 다양한 형태와 크기를 가지며, 게임 오브젝트에 부착되어 충돌 이벤트를 처리합니다. 대표적인 콜라이더 형태로는 박스, 구, 캡슐, 메쉬, 휠 콜라이더가 있습니다. 특히 휠 콜라이더는 물리적으로 마찰과 회전을 구현하는 데 사용됩니다.
콜라이더에는 두 가지 주요 모드가 있습니다: 트리거 모드와 물리적 충돌 모드.
- 트리거 모드(Trigger Mode): 트리거 모드는 물리적인 충돌 대신 충돌 이벤트만 감지할 수 있습니다. 이 모드를 활성화하려면 콜라이더 컴포넌트의 “Is Trigger” 옵션을 체크(리지드바디 “Is Kinematic”도 추가적으로 필요)합니다. 주로 플레이어가 특정 구역에 들어갔을 때 이벤트를 발생시키거나, 아이템을 집었을 때 효과를 적용하는 등의 상황에서 사용됩니다.
- 물리적 충돌 모드(Physical Collision Mode): 물리적 충돌 모드는 실제 물리 법칙에 따라 오브젝트가 서로 부딪히고 반응하는 것을 처리합니다. 이 모드는 물리적 상호작용을 포함하며, 오브젝트가 서로 충돌하면 힘을 주고받습니다.
리지드바디(Rigidbody)는 Unity 물리 엔진에서 ‘움직이는 물체’와 ‘고정된 물체’를 구분하기 위한 컴포넌트입니다. 물리 엔진에서 모든 물체의 충돌을 감지하는 것은 성능에 큰 부담을 줍니다. 따라서, Unity 물리 엔진은 리지드바디를 통해 ‘움직이는 물체’에 한해서만 충돌 검사를 수행합니다. 리지드바디를 사용하면 물리적인 힘과 토크를 적용하여 물체의 움직임을 제어할 수 있으며, 중력, 충돌 및 기타 물리적 상호작용을 처리할 수 있습니다.
리지드바디 VS 캐릭터 컨트롤러
리지드바디 클래스에는 복잡한 물리 연산을 편리하게 처리할 수 있는 다양한 함수가 미리 구현되어 있습니다. 많은 기능을 제공하지만, 그만큼 메모리를 많이 차지합니다. 따라서, 리지드바디 컴포넌트를 가진 게임 오브젝트가 많아지면 불필요한 연산량이 늘어나 프레임 저하를 초래할 수 있습니다.
이러한 문제를 해결하기 위해 Unity에서는 중력이나 충돌 등의 간단한 물리 연산만을 필요로 하는 캐릭터 전용 클래스인 캐릭터 컨트롤러 클래스를 제공합니다. 이 클래스는 자체적으로 충돌 감지를 포함하고 있어 별도의 콜라이더가 필요하지 않습니다.
리지드바디의 대표적인 함수인 AddForce()는 두 가지 파라미터를 사용합니다: 방향과 힘(Vector), 던지는 방식(ForceMode). ForceMode에는 Force, Impulse, VelocityChange, Acceleration의 네 가지 종류가 있으며, Force와 Impulse는 질량의 영향을 받지만 VelocityChange와 Acceleration은 질량의 영향을 받지 않습니다. 또한, Impulse와 VelocityChange는 순간적인 힘을 가합니다.
에셋 스토어
에셋 스토어에서는 개발자들이 Unity 프로젝트에 필요한 다양한 에셋을 구매하거나 무료로 다운로드할 수 있는 곳입니다. 에셋 스토어는 게임 개발을 포함한 여러 분야의 콘텐츠 제작을 위한 도구와 리소스를 제공합니다. 에셋 스토어에서 다운로드한 에셋은 C:\Users\사용자\AppData\Roaming\Unity\Asset Store-5.x. 폴더(윈도우)에 위치합니다. 해당 에셋은 확장자가 unitypackage형태로 저장되며, 압축 파일과 함께 에셋 임포트 정보나 다른 애셋들과의 링크 정보와 같은 메타 데이터들이 함께 저장됩니다.