1-1. 게임 엔진이란 무엇인가
게임 엔진은 간단히 말해 컴퓨터 소프트웨어의 일종인 게임을 개발할 때 사용하게 되는 소프트웨어입니다.
하나의 컴퓨터 게임에는 여러 가지의 복잡한 기능들이 존재해야 합니다. 대표적으로
1. 물리 연산
2. 그래픽 렌더링
3. 유저 입력 처리
4. 리소스 관리
5. 스크립트 관리
가 있습니다.
이러한 여러가지 기능을 각각의 소프트웨어로 관리하게 된다면 개발 및 유지보수 과정에서 많은 비용이 발생하게 됨으로
게임에서 반복적으로 요구되고, 다양한 게임에서 공통적으로 요구되는 기능을 하나로 통합하여 제공하는 개발도구가 바로 게임 엔진입니다.
1-2. Unreal Engine의 주요 기능
1번 단락에서 설명하였듯 게임 엔진은 여러 게임에서 공통적으로 필요로 하는 기능을 하나로 통합하여 제공합니다.
언리얼을 사용한 대표적인 게임인 XCOM2를 예시로 들어 설명하자면
1. 개발자가 구현해놓은 게임 속 환경을 유저의 pc 화면에 표시하기 위한 3d 렌더링 파이프라인(그래픽 렌더링)
2. 유리창을 개머리판으로 쳐서 꺠뜨리거나 달려가다 사망할 시 캐릭터가 튕겨나가는 물리 연산
3. 마우스 휠로 화며을 확대/축소하고 SHIFT 키로 조작 캐릭터를 변경하는 유지 입력 처리
4. 각 캐릭터와 배경 으브젝트의 3d 모델, UI 버튼에 연결된 이미지와 같은 리소스를 추가/삭제/변경하는 리소스 관리
5. 캐릭터가 선택되었을 시 이동 그리드를 보여주고, UI 버튼을 띄우며 또 각각의 버튼을 눌렀을 때 무슨 일이 벌어질지부터 시작해서 적들의 AI, 사격시의 명중/빗나감 판정과 같은 로직들을 구현하는데 필요한 스크립트를 작성하고, 연결하고, 삭제하는 스크립트 관리
와 같은 기능이 있습니다.
1-3. Unreal의 장점과 단점
현대 게임 개발 시장에서의 독자 엔진을 사용하지 않는 예외를 제외한다면 대부분의 경우 2U라고 불리는 Unity와 Unreal을 게임 엔진으로 채택하고 있습니다.
따라서 Unity와 비교하여 Unreal의 장점을 설명하자면
1. 강력한 실시간 렌더링 파이프라인
Unreal은 게임 개발 엔진을 너머 제한적이게나마 상용 렌더링 엔진으로써도 사용될 정도로 높은 수준의 그래픽 퀄리티를 보여줍니다.
Unity의 경우 URP나 HDRP와 같이 기존의 빌트-인 파이프라인 대비 성능과 퀄리티 면에서 개선된 렌더 파이프라인을 제공하고 있으나 Unreal에 비해 그래픽 퀄리티 면에서 뒤쳐지는 경우가 많습니다.
2. 카오스 피직스
Unity의 경우 일반적인 Rigidbody + Collider를 이용하여 물체 간의 충돌을 구현할 경우
충돌해오는 물체의 속도가 일정 수준을 넘을 경우 충돌되는 물체를 관통하여 뚫고 이동하는 뚫림 현상이 빈발하곤 합니다.
따라서 맵에서 벗어나선 안될 벽이나 차량처럼 고속 이동하는 물체의 경우 Raycast라는 스크립트 단위의 충돌 판정이 필요합니다.
그러나 Unreal에서 사용되는 카오스 피직스는 Unity가
Collider 컴포넌트를 가진 오브젝트가 1프레임 동한 이동했을 때 다른 Collider의 영역과 겹쳐졌는지 여부를 통해 충돌을 판정, 즉 우선 이동한 이후 충돌을 판정하는 것과 달리 이동 도중 충돌이 발생했을 시 이동을 멈추는 방식이기에
뚫림 현상에서 비교적 자유롭습니다.
3. BluePrint
Unity에도 비주얼 스크립팅 툴이라는 이름으로 비슷한 기능을 지원하는 것은 사실이지만 시기적으로 Unreal의 블루프린트가 보다 앞서서 업데이트 되었습니다.
4. 스크립팅 언어
Unity의 경우 C#을 기반으로 한 MonoScript를 사용하여 C++ 기반인 Unreal에 비해 메모리 관리에서 취약한 모습을 보이며 멀티 쓰레딩 지원을 고려하지 않고 설계된 엔진이기에 복잡한 로직을 처리할 때 멀티 쓰레딩을 전제로 개발된 Unreal이 퍼포먼스적으로 보다 우세한 모습을 보여줍니다.
단점의 경우
1. 입문자용 튜토리얼의 부재
Unity의 경우 Unreal에 비해 설치 및 구동에 필요로 하는 리소스가 적으며 유저 커뮤니티가 활발하여 입문자 입장에서 양질의 강의와 튜토리얼에 쉽게 접근할 수 있습니다.
반면 Unreal의 경우 모바일 게임 개발에 주로 쓰인다는 인식이 있는 Unity에 비해 AAA급 게임 개발에 쓰이는 고급 엔진이라는 인식으로 인해 입문하려 하는 인원이 적어 이들을 위한 튜토리얼이 상대적으로 부실한 편입니다.
2. C++ 기반 스크립팅
Unity의 경우 스크립팅 시에 C#을 사용하기에 기본적으로 보다 쉽게 배우고 실무에 투입되기 위한 알고리즘 학습과 컴포넌트의 역할 등에 관한 심화 과정으로 빠르게 넘어갈 수 있으나 Unreal은 C++ 기반이여 기초 단계의 학습에 보다 오랜 시간이 걸립니다.
3. 크래시 취약
Unreal로 개발된 게임의 경우 CPU나 GPU와 같은 하드웨어의 스펙에 큰 영향을 받습니다
일부 세대 CPU의 특정 버전 드라이버 설치 시에는 아예 실행이 되지 않거나 정상 작동하지 않는 버그 역시 보고되어 있어
Unity에 비해 개발자가 통제하고 예방할 수 없는 크래시가 쉽게 발생합니다.
2-1. 레벨은 게임의 구성 요소에서 어떤 역할을 하는가
Unreal의 레벨은 게임에서 진행되는 스테이지 하나와 매칭되는 개념입니다.
단, 일반적으로 게임에서 스테이지라고 불리는 개념이 그 스테이지를 구성하고 있는 모든 요소(라이팅, 지형 등)을 모두 통틀어서 지칭하는 개념인 것에 비해 Unreal에서 사용하는 Level은 Persistent Level이라고 불리는 하나의 메인 레벨과 기능적 목적을 위해 분리된 여러개의 Sub-Level로 구성되어 있습니다.
2-2 Unreal Engine에서 사용하는 게임 레벨(Level)의 주요 구성 요소(World, Actor, Light, Camera 등)의 역할을 설명하라
월드라 함은 하나의 스테이지를 만들기 위해 Unreal 측에서 제공된 공간을 뜻합니다.
이 월드 안에 상술한 Persistent Level과 여러 개의 Sub-Level이 포함되어 하나의 스테이지를 구성하게 됩니다.
액터는 Level 안에 직접적으로 배치되는 오브젝트 전반을 의미합니다.
XYZ 축으로 해당 액터의 위치, 회전값, 크기를 나타내는 Transform을 가지고 Unreal에서 제공하는 다양한 Component를 해당 액터에 적용하여 기능을 구현할 수 있습니다.
라이트의 경우 액터의 종류중 하나로써 이름 그대로 광원을 의미합니다.
태양광을 의미하는 Directional, 현실의 스포트라이트에 대응되는 Spot, 전구처럼 제자리에서 빛을 내는 Point, 직사각형 형태의 광원인 Rect 등이 있습니다.
카메라의 경우 실제 게임 플레이 시에 화면에 노출될 범위를 나타냅니다.
해당 카메라가 바라보고 있는 부분만이 화면에 노출되며 카메라의 범위 밖에 놓인 액터들은 직접적으로 표시되지 않습니다.