본문 바로가기
Unreal5/기본개념

[UE5] Mian() To BeginPlay() 까지 과정

by 위니밍 2025. 12. 22.
반응형

 

 

C++의 기본 구조로써 main()부터 시작하게된다.

초기화 -> 작성한코드 -> 종료(정리) 순으로 간결하게 정리됀다.

 

하지만 언리얼에서 게임코드를 작성하는경우 이런 루프를 직접적으로 작성하지 않는다.

 

메인함수부터 시작하는 것이 아니라, GameMode 서브클래스를 정의하고 InitGame()등을 오버라이드 해서 시작한다.

액터의 경우 BeginPlay()나 Tick()을 정의하는 경우다.

 

여러 상속구조들

 

 

 

<FEngineLoop 구조>

 

엔진을 시작하는데 있어 여러 복잡한 상속,로우 레벨단의 코드들이 있겠지만, 

엔진의 메인은 FEngineLoop 클래스에 구현되어 있다.

 

 

이전 C++구조사진과 비슷한 초기화 -> 작성한코드 -> 종료(정리) 순으로 되어있다.

PreInit -> Init -> Exit순으로 알아보겠다.

 

PreInit : 모듈 로드

.uproject 혹은 .uplugin에 미리 정의한 모듈들을 불러온다. 

코드간의 종속성을 관리하게 쉽게만들고, 필요한부분만 로드할수있도록 해준다.

 

언리얼 엔진은 실행 시 로우 레벨 엔진 필수 모듈 → 사전 정의된 엔진 모듈 → 상위 레벨 모듈 → 디폴트 게임 모듈 순서로 로딩

 

 

이 중 디폴트 게임 모듈 로딩 시점에 우리가 작성한 C++ 코드가 실제로 언리얼 엔진 환경에 등록되고 실행 준비 상태가 된다.

해당 시점에는 모든 모듈의 생성과 초기화가 완료되었지만,
월드(World) 및 GameMode·GameState와 같은 실제 게임 상태 객체는 아직 생성되지 않은 단계이다.
이후 GameInstance 생성 및 맵 로딩 과정을 거치면서 로딩된 모듈들의 클래스를 사용하는것이다.

 

 

 

 

모듈이 로드될때?

엔진은 해당 모듈에 정의된 모든 UObject 클래스를 등록함.

그러면 리플렉션 시스템(C++ 코드를 런타임에 이해하고 다룰 수 있게 해줌)이 해당클래스들을 인식하고, 각 클래스에 대한 CDO(클래스 기본 객체)도 생성함.

모든 클래스가 등록되면 StartupModule()과 ShutdownModule()로 모듈의 생명주기와 관련된 초기화작업을 합니다.

 

 

=======PreInit =======

이까지 하면 엔진은

필요한 플로그인 및 모듈을 로드하고,

클래스를 등록하고,

로우레벨 시스템단을 초기화 했습니다.

 

 

Init : 초기화

 

 

1. 어떤 게임엔진클래스를 사용할건지

2. 그 클래스의 인스턴스를 생성하고 전역적으로 접근할 수 있는 UEninge클래스로 정의합니다.

3. 엔진초기화( UGameEning,UGameInstance,UGameViewportClient,ULocalPlayer 생성)

4. 완료되면 전역델리게이트를 통해 엔진을 초기화되었음을 알리고

5. PostLoading 객체들을 로드합니다.

6. 엔진실행

 

과정을 거친다

더보기

 

6번과정인 GEninge->Start()에서 실제 LoadMap을 처음호출하게 되고,

UWorld,AGameModeBase,APlayerController등이 생성됀다.

 

 

 

*생애주기

1번박스는 엔진프로세스의 생애주기를 담당하고

2번박스는 해당 맵에 플레이 하는동안만 담당한다.

 

 

* 에디터에서 .umap저장할때 정보(해당 정보들로 직렬화한 url로 저장한 맵을 불러오는것)

 

이후 LoadMap()에서 액터 초기화 및 맵을 로딩 후 BeginPlay()가 실행되는 것이다.

 

이까지의 과정은 글로적어놓으니 어려울수도 있는데 영상의 18:44부분 부터 쉽게 설명되어있다.

 

 

 

 

 

 

 

https://www.youtube.com/watch?v=IaU2Hue-ApI&t=9s

해당 영상을 보고 내가 이해하기 쉽도록 다시 써본 글입니다.

반응형