이 시리즈는 이득우의 언리얼 C++ 게임 개발의 정석을 바탕으로 작성되었습니다.알립니다.
게임은 수많은 오브젝트로 구성된다. 플레이어가 직접 조작하는 캐릭터, 상대하는 몬스터, 배치된 구조물, 벽, 바닥, 획득할 수 있는 아이템 등 모든 요소들이 고유의 특징을 가지고 있다. 이러한 게임에 배치할 수 있는 모든 오브젝트를 언리얼 엔진에선 '액터'라고 하며, 단어 그대로 게임 월드의 특정 공간에서 자신에게 주어진 역할을 수행하는 요소이다.
이러한 액터의 주요 기능은 크게 세 가지로 나눌 수 있다.
모든 액터가 위 세 가지 기능 전체를 적극적으로 활용하는 것은 아니다. 구조물이나 맵 자체를 구성하는 액터는 움직임이 필요없을 수도 있고, 캐릭터나 다른 움직이는 액터들이 특정 구역에 들어왔을 때 이벤트를 발생시키는 범위를 표현하는 보이지 않는 액터는 시각적 기능이 필요가 없다.
각 액터는 필요한 기능을 붙이고, 필요없는 기능을 제거하여 최적의 형태를 가지게 되는데, 이러한 기능을 '컴포넌트'라고 한다.
언리얼 에디터의 아웃라이너 패널에서 원하는 액터를 클릭하면 해당 액터가 어떤 컴포넌트를 가지고 있는지 디테일 패널에 표시된다.
액터가 어떤 컴포넌트를 가지는지 확인하기 위해 에디터 상단 툴바에서 [창
- 액터 배치
] 패널을 열어 '액터'를 배치해보았다.
씬에서 주황색으로 표현된 아이콘이 방금 새로 배치한 액터이며, 아웃라이너 패널에 Actor
라는 이름의 액터가 존재하는 것을 확인할 수 있다. 현재 빈 액터이기 때문에 시각적 기능에 대한 정보가 없어 그래픽(메시) 없이 아이콘으로만 액터를 확인할 수 있다.
현재 선택 중인 액터는 뷰포트에선 주황색으로 하이라이팅이 되고, 아웃라이너 패널에선 파란색으로 배경이 채워진다. 이렇게 선택된 액터는 디테일 패널에서 아래와 같은 정보를 확인할 수 있다.
기본 빈 액터는 루트 컴포넌트가 DefaultSceneRoot
이므로 트랜스폼
, 렌더링
, 리플리케이션
, 콜리전
, HLOD
, 입력
, 액터
, 쿠킹
이라는 섹션으로 구분된다. 이 내용을 조금 더 상세하게 알아보자.
언리얼 엔진 이전에 유니티 엔진을 다뤄본 경험자라면 위 그림의 트랜스폼
, 렌더링
... 등이 컴포넌트라고 생각할 것이다. 하지만 언리얼 엔진에서 이것은 섹션이라고 칭한다.
언리얼 엔진에서 컴포넌트란
액터에 특수한 기능을 추가할 수 있는 오브젝트
라고 할 수 있다. 즉, 액터를 언리얼 게임 오브젝트의 단위이면서 컴포넌트라는 이름의 특수 유형 오브젝트를 담는 그릇으로 볼 수 있다는 것이다. 컴포넌트를 '특정한 기능 하나'로 정의하지 않고 '오브젝트'라고 하는 것은 서로다른 컴포넌트에서 같은 섹션을 찾을 수 있기 때문이다.
예를 들어 StaticMeshComponent
에도 트랜스폼
섹션이 있고, CharacterMesh
에도 트랜스폼
섹션이 있다. 심지어 하는 역할도 똑같다.
섹션은 컴포넌트의 세부 기능이라고 보면 된다. 언리얼의 메시 컴포넌트는 렌더링이 되어 그 자체로 형체를 가지고 그것이 게임 월드에서 특정한 역할을 하게 된다. 이때 메시 컴포넌트를 가진 오브젝트는 충돌이나 중력과 같은 물리 법칙이 성립해야 할 것이고, 월드 내의 어떤 위치에, 어느 정도의 회전 각도를 가지고 있는지와 같은 세부적인 내용들이 필요할 것이다.
이러한 세부적인 기능들을 언리얼 엔진에선 섹션이라는 이름으로 구분하여 컴포넌트에서 조작할 수 있도록 설계되어 있다.
또한 각 섹션에서 에디터 UI로 수정 가능한 필드를 '프로퍼티'라고 한다.
새로 생성한 Default 액터의 컴포넌트는 DefaultSceneRoot
라는 이름을 가지고 있다. 이때 액터 인스턴스 바로 아래에 있는 컴포넌트를 루트 컴포넌트라고 하며, 트랜스폼
이 있고 다른 컴포넌트를 어태치할 수 있는 '씬 컴포넌트'만이 루트 컴포넌트가 될 수 있다. 이 말은 즉, 모든 액터는 반드시 트랜스폼
을 가진다는 것을 의미한다.
루트 컴포넌트에 다른 컴포넌트를 어태치하면 새로운 컴포넌트는 루트의 자식으로 종속된다. 액터 배치 패널에서 캐릭터
액터를 추가하면 다음과 같은 컴포넌트 구조를 가지는 것을 확인할 수 있다.
CapsuleComponent
라는 콜리전을 위한 기본 컴포넌트를 루트 컴포넌트로 두고, 스켈레탈(인간형) 메시와 애니메이션을 효과적으로 적용할 수 있는 CharacterMesh
컴포넌트를 어태치하였다. 두 컴포넌트를 동시에 가지고 있기 때문에 Character
액터는 애니메이션이 적용된 메시와 함께 충돌 처리 등의 물리 효과를 모두 가질 수 있다.
앞에서 루트 컴포넌트는 씬 컴포넌트라고 하였다. 반대로 논-씬 컴포넌트는 트랜스폼
을 가지지 않는 컴포넌트라고 생각하면 된다. 앞서 살펴본 Character
액터의 CharacterMesh
와 CapsuleComponent
는 각각의 트랜스폼이 필요하다.
캐릭터의 메시가 어느 위치에, 어느 각도로, 얼마나 큰 크기를 가지는지 정보가 필요하지만, 캐릭터의 충돌 처리를 담당할 콜라이더가 반드시 캐릭터 메시와 정확히 같은 크기에 같은 위치를 가지고 있을 필요는 없다. 때로는 콜라이더가 조금 더 크거나 작을 수도 있고, 캐릭터 메시의 특정 부위에 닿았을 때만 충돌 처리를 해줄 필요도 있기 때문이다. 따라서 두 컴포넌트는 모두 개별 트랜스폼이 필요하다.
하지만 그렇지 않은 경우가 있다. 위에 삽입한 CharacterMovement
컴포넌트를 보면 걷기, 떨어지기, 헤엄지기 등 다양한 무브먼트 모드를 지원할 뿐, 그 컴포넌트 자체가 형태를 가지지 않는다. 이러한 컴포넌트를 '논-씬 컴포넌트'라 하며, 이는 루트 컴포넌트에 종속되지 않고 따로 취급된다.