ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Unreal Engine] Forums : BeginPlay execution order
    Unreal Engine 5._ 2023. 1. 11. 22:44

    언리얼 엔진으로 게임을 만들 때, 게임의 기반이 되는 액터들을 만들게 될 수 있습니다.

    이 액터들은 게임의 기반 기능들을 가지고있지만, 엔진에서 제공하는 기본적인 템플릿 (레벨, 게임모드 및 하위 객체)과는 무관한 경우가 있습니다.

    이 말은 곧, 이러한 기반 액터들이 스폰되어 있지 않아도 게임이 플레이 될 수 있다는 것 입니다.

    하지만 게임에 존재하는 다른 액터 (캐릭터를 포함한)들이 이러한 기반 액터를 참조할 것은 자명하기 때문에, 위와 같이 기반 액터가 없을 경우 게임의 진행에 큰 문제가 생기게 됩니다.

     

    에디터에서 액터를 직접 배치하는 것 만으로도 이러한 문제에서 벗어날 수 있지만, 조금 더 간편하고, 개발자가 신경쓰지 않아도 되는 시스템을 구축하기 위해, 레벨이 시작될 때 액터를 스폰하도록 코드를 작성했습니다.

    하지만 이 방법에도 의문이 생겼는데, "어떤 객체가 액터를 스폰해야 하는가?" 라는 의문이 바로 그것이었습니다.

     

    이번 글에서는 에픽게임즈 포럼에서 찾은 글에 대해 공유하려 합니다.

    글의 제목은 다음과 같습니다.

    Any reason for a difference in execution order for Begin Play calls?

    해당 글의 내용과, 추가적으로 실행 순서에 관련된 내용을 정리해보도록 하겠습니다.

     


     

    1. BeginPlay의 실행 순서

     

    더보기

    BeginPlay는 생성자 다음 순서로 (생성자 호출 직후는 아닙니다)호출되는 함수입니다.

    이 BeginPlay함수는 실행되는 환경에 따라, 상속받는 클래스의 종류에 따라 호출되는 순서가 달라집니다.

     

    우선, 언리얼 에디터에서 실행되는 BeginPlay함수의 호출 순서는 다음과 같습니다.

    1. 레벨에 배치된 Actor
    2. GameMode
    3. Level
    4. GameState
    5. PlayerController
    6. PlayerState
    7. HUD
    8. Pawn

     

    빌드된 게임 (Standalone 상태)에서 실행되는 BeginPlay함수의 호출 순서는 다음과 같습니다.

    1. Pawn
    2. GameMode
    3. GameState
    4. PlayerState
    5. PlayerController
    6. HUD
    7. Level
    8. 레벨에 배치된 Actor

     

    2. BeginPlay의 실행 순서가 다른 이유

     

    더보기

    위 문단에서, Standalone환경과 Editor환경의 BeginPlay의 실행 순서가 다른 것을 볼 수 있었습니다.

    그에 대한 자세한 이유는언리얼 엔진 공식 문서에서 확인할 수 있습니다.

    Game Flow Overview

    이 문서에서는 게임에 대한 구체적인 흐름을 순서도와 함께 보여줍니다.

     

    또한 Editor에서 호출 순서가 달라지는 이유도 명확하게 명시하고 있습니다.

    The engine initializes and starts immediately, as it is needed to run the editor, but creation and initialization of objects such as the GameInstance are deferred until the user presses the button to launch the PIE or SIE session.

    요약하자면, 에디터를 시작하기 위해 순서가 달라지는 것 입니다.

     

    추가적으로 위 문서에는 중요한 사실이 하나 더 있습니다.

    위 예문의 바로 아래 문단입니다.

    In addition, the Actors in the level are duplicated so that in-game changes do not affect the level in the editor, and every object, including the GameInstance object, has a separate copy for each PIE instance.

    에디터의 레벨에 영향을 미치지 않도록, 에디터에서 실행될 때 레벨에 배치한 인스턴스들이 별도로 복사된다는 점 입니다.

     

    3. StartPlay in GameMode

     

    더보기

    이 글을 찾게 된 이유는, BeginPlay함수의 실행 순서와 무관하게 액터의 생성과 참조에 대하여 널 포인터 예외가 발생하지 않게 하기 위함이었습니다.

    이에 대한 해답은 다른 문서에서 찾을 수 있었습니다.

    AGameMode::StartPlay

    GameMode의 StartPlay함수가 바로 그것이었습니다.

    Transitions to calls BeginPlay on actors.

    이 함수는 Actor의 BeginPlay가 호출되기 전에 호출되는 것이 보장된 함수입니다.

    따라서, GameMode의 StartPlay를 오버라이드하여 액터를 스폰할 경우, 액터들이 BeginPlay에서 다른 액터를 참조할 때 널 포인터 예외가 발생하지 않을것이라는 기대를 할 수 있습니다.

     


     

    게임의 실행 환경에 대한 이해는 매우 중요합니다.

    이번 글에서 공유한 내용은 Windows7의 환경에서 다루어진 내용입니다.

    공유하고 있는 글의 작성 시점이 2018년이라, 윈도우 버전이 상대적으로 낮지만, Windows는 하위 호환성이 비교적 잘 지켜지고 있기 때문에 큰 문제가 없을 것이라고 생각합니다.

    다만, Linux계통, 모바일 등의 환경에서는 위의 내용과 달라질 수 있습니다.

     

    이 글이 도움이 되셨기를 바랍니다.

    감사합니다.

     

    댓글

Designed by Tistory.