오늘은 처음 C++과 언리얼이 어떤 관계인지 알아보았다. 저번에 인생 첫 게임을 만들었을 땐 블루프린트를 활용해서 만들었었는데 C++을 배운 현재는 어떤 모습으로 게임을 만들어 나갈 수 있을지 사뭇 긴장되고 설렌다. 그러나 여전히 C++의 실력이 부족한 상태이므로 C++ 공부도 병행하면서 최대한 원하는 바를 구현할 수 있게 해 나가겠다.
우선 오늘은 언리얼에서 Game - 1인칭 시작에디터를 포함하여 프로젝트를 만들었다. 그리고 C++을 체크하고 시작하는 순간 기본 컴파일러로 설정되어 있던 VS 2022가 같이 켜지며 코드의 무리가 주르륵 나왔다.
우선 VS에서 내가 만든 프로젝트에 총 5개의 폴더가 보였다. 각각의 역할을 정리 해보자면
역할 : 엔진 자체의 코드와 리소스를 포함한다. 엔진의 코어 기능, 셰이더, 렌더링 시스템, 물리 엔진, 그리고 편집기와 관련된 모든 파일이 들어 있다.
주요 내용 :
Binaries
: 엔진 실행 파일과 관련 바이너리 파일너리 파일Config
: 엔진 전반적인 설정 파일Content
: 엔진 기본 콘텐츠(예: 머터리얼, 파티클, 텍스쳐)Source
: 엔진 소스 코드언리얼 엔진을 커스터마이징하거나 엔진의 소스 코드를 직접 수정해야 할 경우 사용된다.
Source
: 게임의 C++ 코드와 모듈 파일 Content
: 게임에서 사용하는 에셋(머터리얼, 모델, 블루프린트 등)Config
: 게임 고유의 설정 파일Content
폴더는 언리얼 에디터에서 가장 많이 다루게 된다..natvis
파일이 포함돼 있다. 이 파일은 VS에서 객체와 데이터를 보여주기 위해 XML 문법을 기반으로 작성돼 있으며, .natvis
파일을 수정해 데이터 시각화를 커스터 마이징할 수 있다.역할 : 엔진에서 사용하는 추가 프로그램 및 유틸리티가 포함되어 있다.
주로 빌드 시스템, 에디터 도구, 또는 자동화된 워크플로우와 관련된 도구들이 위치한다.
주요 내용 :
UnrealBuildTool
: 엔진 및 프로젝트를 빌드하는 데 필요한 툴AutomationTool
: CI/CD 작업이나 빌드 프로세스를 자동화하는 스크립트와 도구ShaderComileWorker
: 셰이더 컴파일 작업을 분산 처리하는 데 필요한 유틸리티프로젝트를 컴파일하거나, 빌드 파이프라인을 설정할 때 사용된다. 엔진 소스 빌드 환경에서 주로 필요하다.
역할 : 빌드 프로세스에서 특정 모듈이나 플러그인의 규칙(빌드 설정)을 정의하는 파일을 포함한다.
각 모듈의 빌드 설정, 의존성 관리, 타겟 지정 등을 제어한다.
주요 내용 :
.Build.cs
파일들 : 빌드 시 어떤 모듈과 라이브러리를 사용할지 정의커스텀 플러그인, 모듈, 또는 프로젝트 특화 빌드 설정을 수정하거나 추가할 때 필요하다.
이 다섯 개의 폴더는 각각 다른 목적에 맞춰 존재하며, 다음과 같은 방식으로 상호작용한다.
Engine
폴더는 엔진의 기본 동작을 제공하고,Games
폴더는 게임 프로젝트의 콘텐츠와 코드를 포함하며,Visualizers
폴더는 디버깅과 성능 분석을 돕고,Programs
폴더는 빌드와 관련된 도구를 제공하며,Rules
폴더는 빌드 규칙과 모듈 의존성을 관리한다.이 폴더들은 엔진을 소스 코드 형태로 사용하거나 고급 기능을 사용하는 경우에 유용하며, 일반적인 게임 개발의 경우 Games 폴더에만 주로 작업하게 된다.
게임 개발에서 기본적인 흐름인 게임 초기화, 게임 루프, 게임 종료는 모든 게임의 핵심이다. 이 단계들은 게임이 실행되는 동안 시스템의 주요 구조를 정의한다.
GameInstance
클래스에서 많이 처리된다.GameInstance
는 게임의 전역적인 상태화 초기화 과정을 관리하며, 게임 실행 중에도 지속적을 유지된다.UEngine
클래스와 그 하위 시스템(UGameEngine
, USkeletalMesh
, 등)이 초기화를 담당한다.Input Handling
: 입력을 감지하고, 해당 데이터를 게임 로직에 전달Game Logic
: NPC, 플레이어, 아이템 행동과 상호작용 처리Physics Update
: 물리 연산(충돌 감지, 캐릭터 이동 등)Rendering
: 화면에 현재 상태를 그리기 위해 GPU 명령 실행Audio Update
: 사운드 출력을 갱신GameMode
클래스는 게임 루프에서 전체적인 규칙을 정의한다.Tick
함수는 모든 액터가 매 프레임 업데이트되도록 설계되어 있다.Actor::Tick(float DeltaTime)
은 각 프레임에서 호출되며, DeltaTime
을 사용해 시간 기반 연산을 수행한다.Render Thread
와 Game Thread
를 분리하여 렌더링과 게임 로직을 병렬로 처리Render Thread
와 Game Thread
를 분리하여 렌더링과 게임 로직을 병렬로 처리개념 :
게임을 종료하는 단계로, 이 단계에서는 모든 리소스를 정리하고 메모리를 반환하여, 저장 작업을 처리한다.
주요 작업 :
언리얼 엔진에서의 처리
언리얼은 Garbage Collector와 같은 메모리 관리 시스템을 통해 리소스를 정리하며, 시스템 종료를 처리한다.
GameInstance
종료 : GameInstance::Shutdown
을 통해 게임 전체의 전역 상태를 정리Level Unload
: 종료 시 레벨 언로드 및 액터 메모리 정리Garbage Collector
: 언리얼의 GC 시스템은 사용하지 않는 오브젝트를 정리하며, 게임 종료 시 자동으로 실행된다.UEngine::Shutdown
을 통해 언리얼 엔진의 모든 하위 시스템을 정리하고 종료한다.언리얼 엔진의 게임 실행 과정은 다음과 같이 구성된다.
시작
UEngine::Init()
--> GameInstance::Init()
--> 첫 레벨 로드
루프
Tick
함수에서 동작한다.GameMode::Tick()
Actor::Tick()
GameInstance::Shutdown()
--> UEngine::Shutdown()
--> 애플리케이션 종료GameInstance
, Engine 초기화
)Tick
, GameMode
, Actor
)GameInstance::Shutdown
, Garbage Collector
)언리얼 엔진은 이런 단계를 엔진 내부에서 대부분 자동으로 처리하며, 개발자는 GameMode, PlayerController, Actor와 같은 클래스에 로직을 구현하는 데 집중하면 된다.
참고문헌 :
1. https://dev.epicgames.com/community/unreal-engine/learning?types=course&languages=ko-kr 언리얼 공식 홈페이지
2. C++ 스크립트를 활용한 언리얼 엔진5 게임 개발 - 젠유 조리 리 지음