본문 바로가기

액터 초기화와 종료 이벤트

Construction Script와 BeginPlay·EndPlay·Destroyed의 호출 시점을 구분해 생성부터 제거까지 수명 주기를 다룹니다.

지금까지는 블루프린트로 게임 월드 오브젝트를 정의하고 상호작용을 구성하는 방법을 다뤘습니다.

이번 절에서는 액터의 구성, 플레이 시작, 플레이 종료에 맞춰 호출되는 블루프린트 이벤트를 살펴봅니다. 이 이벤트들은 C++ 객체의 생성자(Constructor)·소멸자(Destructor)와 구별해야 합니다.


구성과 플레이 시작 시점의 초기화

에디터에서 외형을 구성하는 작업과 플레이에 들어갈 때 상태를 초기화하는 작업은 시점이 다릅니다. 다음 두 진입점을 역할에 맞게 사용합니다.

Event BeginPlay
  • 개념: 이 이벤트는 해당 액터가 플레이를 시작할 때 호출됩니다. 시작부터 배치된 액터뿐 아니라 플레이 도중 스폰된 액터도 초기화 후 이 이벤트에 도달합니다.
  • 주요 용도: 게임 플레이 중 필요한 초기화 작업에 가장 일반적으로 사용됩니다. 예를 들어, 플레이어의 초기 체력 설정, UI 초기화, 적 AI의 첫 행동 트리거, 컴포넌트 간의 레퍼런스 설정 등이 있습니다.
  • 특징: 이 이벤트는 게임이 실제로 시작되었을 때만 발생하므로, 에디터 상에서 액터를 배치하거나 수정하는 동안에는 실행되지 않습니다.
Construction Script (구성 스크립트)
  • 개념: 이 스크립트는 액터 구성 과정에서 실행되며, 에디터의 배치·속성 변경·이동 등에 따라 여러 번 다시 실행될 수 있습니다. 모든 편집 동작에 항상 한 번씩 대응하는 이벤트는 아닙니다.
  • 주요 용도: 에디터에서 액터의 외형이나 동작을 즉시 시각적으로 확인하고 싶을 때 유용합니다. 예를 들어, 문의 방향을 변경했을 때 문틀이 함께 움직이거나, 아이템의 색상을 변경했을 때 바로 적용되는 등의 프리뷰 기능을 구현할 때 사용됩니다. 또한, 특정 조건에 따라 컴포넌트를 동적으로 추가/제거하는 등의 에디터 타임 로직에도 활용됩니다.
  • 특징: 런타임 스폰 경로에서는 구성 후 BeginPlay로 진행합니다. 레벨에 미리 배치해 저장한 액터의 로드 경로까지 동일한 실행 횟수로 일반화하지 않습니다. 구성에서 설정한 값은 이후 BeginPlay 로직에서 변경할 수 있습니다.
초기화 활용 예시
  • Event BeginPlay에서 플레이어의 현재 체력을 100으로 설정하고, 시작 메시지를 출력합니다.
  • Construction Script에서 특정 변수(예: DoorType 열거형)의 값에 따라 문의 스태틱 메시를 변경하도록 설정하여, 에디터에서 DoorType을 바꾸자마자 문의 모습이 즉시 바뀌는 것을 확인합니다.

플레이 종료와 제거 시점의 정리

월드에서 플레이를 끝내는 것과 객체 메모리가 회수되는 것은 같은 시점이 아닙니다. 게임플레이 정리는 다음 이벤트에 배치하고, 객체 메모리 관리는 엔진의 가비지 컬렉션과 구분합니다.

Event EndPlay
  • 개념: 이 이벤트는 Destroy Actor, 레벨 전환·스트리밍 언로드, PIE 종료 등으로 해당 액터가 플레이를 끝낼 때 호출됩니다. End Play Reason으로 종료 이유를 구분합니다.
  • 주요 용도: 액터가 사라지기 전에 필요한 마무리 작업에 사용됩니다. 예를 들어, 사운드를 정지시키거나, 특정 이펙트를 제거하거나, 직접 등록한 구독과 타이머를 해제하는 등의 작업을 수행합니다. 이 이벤트에서 액터 메모리를 직접 해제하는 것은 아닙니다.
  • 특징: 이 이벤트는 게임 플레이 도중 액터가 사라질 때 또는 게임이 완전히 끝날 때 발생하므로, 매우 중요한 정리 작업을 담당합니다.
Event Destroyed

명시적인 액터 파괴에 반응하는 이벤트입니다. 레벨 언로드나 플레이 종료까지 포괄하는 정리가 필요하면 EndPlay를 사용합니다.

종료 처리 활용 예시
  • 적의 사망 처리에서 폭발 효과와 아이템 드롭을 한 번 수행한 뒤 Destroy Actor로 제거합니다. 모든 EndPlay에 드롭을 연결하면 레벨 전환이나 게임 종료에도 보상이 생성될 수 있으므로, 사망 조건과 종료 이유를 분리합니다.
  • 플레이어가 게임을 종료하거나 레벨을 변경할 때, 사용하던 UI 위젯을 제거하는 로직을 Event EndPlay에서 처리합니다.

구성 재실행과 플레이의 시작·종료를 구분합니다

런타임 스폰으로 구성·초기화→BeginPlay→종료 이유에 따른 EndPlay 정리→이후 객체 관리의 수명 상태를 보여 준다. 에디터 구성 재실행은 별도 조건이고 GC 시점을 고정하지 않는다.

EDITOR CONFIGURATION · PLAY · CLEANUP

구성 재실행과 플레이의 시작·종료를 구분합니다

Construction Script의 실행 횟수는 생성 경로와 편집 조건에 따라 달라집니다. 에디터 작업, 런타임 스폰, 플레이 종료를 하나의 고정된 순서로 묶지 않습니다.

편집 구성과 스폰·종료 경로의 서로 다른 범위에디터 Construction Script는 조건에 따라 반복할 수 있고 편집 자체가 BeginPlay를 시작하지 않는다. 플레이 중 스폰은 구성과 초기화 후 BeginPlay에 들어간다. Destroy Actor, 레벨 언로드, PIE 종료 등은 EndPlay에서 게임플레이 정리를 수행하며 메모리 회수는 이후의 객체 관리와 구별한다. Destroyed는 명시적 파괴의 반응이며 모든 종료와 동일하지 않다.에디터 편집 · 플레이 시작과 별개Construction ScriptDoorType 등 외형 구성조건에 따라 재실행플레이 중 스폰 경로런타임 스폰액터 생성구성 · 초기화Construction 등BeginPlay플레이 상태 초기화플레이 종료 경로종료 이유Destroy · 언로드PIE 종료 등EndPlay구독 · 타이머 정리메모리 직접 해제 아님객체 수명 관리이후 GC 등
편집 구성과 스폰·종료 경로의 서로 다른 범위에디터 Construction Script는 조건에 따라 반복할 수 있고 편집 자체가 BeginPlay를 시작하지 않는다. 플레이 중 스폰은 구성과 초기화 후 BeginPlay에 들어간다. Destroy Actor, 레벨 언로드, PIE 종료 등은 EndPlay에서 게임플레이 정리를 수행하며 메모리 회수는 이후의 객체 관리와 구별한다. Destroyed는 명시적 파괴의 반응이며 모든 종료와 동일하지 않다.에디터 편집Construction Script외형 구성조건에 따라 재실행편집 자체는 BeginPlay 아님플레이 중 스폰런타임 스폰액터 생성구성 · 초기화Construction 등BeginPlay플레이 상태 초기화플레이 종료종료 이유Destroy · 언로드PIE 종료 등EndPlay구독 · 타이머 정리메모리 직접 해제 아님객체 수명 관리이후 GC 등Destroyed: 명시적 파괴 반응모든 EndPlay가 사망은 아님

미리 배치해 저장한 액터의 로드·PIE 복사까지 스폰 경로의 구성 횟수로 일반화하지 않습니다. Destroyed는 명시적 파괴에 반응하며, 레벨 언로드·플레이 종료까지 포괄하는 정리는 EndPlay에서 합니다. 사망 보상은 사망 조건에서 한 번 처리합니다.

이 예의 조건

  • 본문과 원 도표에 제시된 사례의 입력·조건을 사용합니다. 설명용 수치나 독립 비교 경로는 각 단계에 표시합니다.
  • 현재 상태·값과 전환 근거의 위치는 모든 단계에서 같습니다. 조건이 맞지 않거나 실행되지 않은 경로를 성공한 동작으로 해석하지 않습니다.
예의 값과 변화
관찰·상황값·보충 정보변화·이유
런타임 구성

스폰한 객체를 구성·초기화한다.

  • 범위: 런타임 스폰 사례
  • 상태: BeginPlay 전 준비
  • 에디터 Construction 재실행은 별도 조건이다.
플레이 수명

BeginPlay 뒤 사용 가능한 실행 상태다.

  • 진입: BeginPlay
  • 상태: 플레이 중
  • 구성 완료와 플레이 시작을 같은 이벤트로 만들지 않는다.
EndPlay 정리

종료 이유에 맞게 구독·자원을 정리한다.

  • 사건: EndPlay
  • GC 시점: 고정하지 않음
  • 플레이 종료와 메모리 회수를 같은 순간으로 약속하지 않는다.

구성 재실행과 플레이의 시작·종료를 구분합니다

런타임 스폰으로 구성·초기화→BeginPlay→종료 이유에 따른 EndPlay 정리→이후 객체 관리의 수명 상태를 보여 준다. 에디터 구성 재실행은 별도 조건이고 GC 시점을 고정하지 않는다.

EDITOR CONFIGURATION · PLAY · CLEANUP

구성 재실행과 플레이의 시작·종료를 구분합니다

Construction Script의 실행 횟수는 생성 경로와 편집 조건에 따라 달라집니다. 에디터 작업, 런타임 스폰, 플레이 종료를 하나의 고정된 순서로 묶지 않습니다.

편집 구성과 스폰·종료 경로의 서로 다른 범위에디터 Construction Script는 조건에 따라 반복할 수 있고 편집 자체가 BeginPlay를 시작하지 않는다. 플레이 중 스폰은 구성과 초기화 후 BeginPlay에 들어간다. Destroy Actor, 레벨 언로드, PIE 종료 등은 EndPlay에서 게임플레이 정리를 수행하며 메모리 회수는 이후의 객체 관리와 구별한다. Destroyed는 명시적 파괴의 반응이며 모든 종료와 동일하지 않다.에디터 편집 · 플레이 시작과 별개Construction ScriptDoorType 등 외형 구성조건에 따라 재실행플레이 중 스폰 경로런타임 스폰액터 생성구성 · 초기화Construction 등BeginPlay플레이 상태 초기화플레이 종료 경로종료 이유Destroy · 언로드PIE 종료 등EndPlay구독 · 타이머 정리메모리 직접 해제 아님객체 수명 관리이후 GC 등
편집 구성과 스폰·종료 경로의 서로 다른 범위에디터 Construction Script는 조건에 따라 반복할 수 있고 편집 자체가 BeginPlay를 시작하지 않는다. 플레이 중 스폰은 구성과 초기화 후 BeginPlay에 들어간다. Destroy Actor, 레벨 언로드, PIE 종료 등은 EndPlay에서 게임플레이 정리를 수행하며 메모리 회수는 이후의 객체 관리와 구별한다. Destroyed는 명시적 파괴의 반응이며 모든 종료와 동일하지 않다.에디터 편집Construction Script외형 구성조건에 따라 재실행편집 자체는 BeginPlay 아님플레이 중 스폰런타임 스폰액터 생성구성 · 초기화Construction 등BeginPlay플레이 상태 초기화플레이 종료종료 이유Destroy · 언로드PIE 종료 등EndPlay구독 · 타이머 정리메모리 직접 해제 아님객체 수명 관리이후 GC 등Destroyed: 명시적 파괴 반응모든 EndPlay가 사망은 아님

미리 배치해 저장한 액터의 로드·PIE 복사까지 스폰 경로의 구성 횟수로 일반화하지 않습니다. Destroyed는 명시적 파괴에 반응하며, 레벨 언로드·플레이 종료까지 포괄하는 정리는 EndPlay에서 합니다. 사망 보상은 사망 조건에서 한 번 처리합니다.

이 예의 조건

  • 본문과 원 도표에 제시된 사례의 입력·조건을 사용합니다. 설명용 수치나 독립 비교 경로는 각 단계에 표시합니다.
  • 현재 상태·값과 전환 근거의 위치는 모든 단계에서 같습니다. 조건이 맞지 않거나 실행되지 않은 경로를 성공한 동작으로 해석하지 않습니다.
예의 값과 변화
관찰·상황값·보충 정보변화·이유
런타임 구성

스폰한 객체를 구성·초기화한다.

  • 범위: 런타임 스폰 사례
  • 상태: BeginPlay 전 준비
  • 에디터 Construction 재실행은 별도 조건이다.
플레이 수명

BeginPlay 뒤 사용 가능한 실행 상태다.

  • 진입: BeginPlay
  • 상태: 플레이 중
  • 구성 완료와 플레이 시작을 같은 이벤트로 만들지 않는다.
EndPlay 정리

종료 이유에 맞게 구독·자원을 정리한다.

  • 사건: EndPlay
  • GC 시점: 고정하지 않음
  • 플레이 종료와 메모리 회수를 같은 순간으로 약속하지 않는다.

초기화와 종료 처리의 중요성

초기화와 종료 시점을 구분하면 다음과 같은 이점이 있습니다.

  • 안정성: 오브젝트 생성 시 필요한 초기화가 누락되거나, 파괴 시 리소스 해제가 제대로 이루어지지 않으면 게임이 비정상적으로 작동하거나 메모리 누수와 같은 심각한 문제를 야기할 수 있습니다.
  • 효율성: 불필요한 리소스 점유를 막고, 게임 성능을 최적화하는 데 기여합니다.
  • 재현성: 오브젝트가 항상 일관된 상태로 생성되고 파괴되도록 보장하여, 디버깅을 용이하게 합니다.

Construction Script, Event BeginPlay, Event EndPlay 이 세 가지는 액터의 생명주기에서 중요한 전환점에 해당하며, 각자의 역할에 맞게 적절한 로직을 배치하는 것이 견고한 블루프린트를 만드는 데 필수적입니다.

EndPlay를 객체 메모리의 즉시 해제와 동일시하지 말고, 플레이 종료 뒤에도 엔진의 객체 수명 관리가 이어진다는 점을 기억하세요.


이번 절에서는 블루프린트에서 액터의 구성과 플레이 시작·종료에 사용하는 Construction Script, Event BeginPlay, Event EndPlay의 기본 개념과 활용법에 대해 알아보았습니다.

이로써 3장 클래스와 객체 지향 설계의 주요 내용을 모두 다루었습니다.

블루프린트 품질 점검

이 절의 내용은 노드를 많이 배치하는 것보다 흐름을 명확히 유지하는 데 목적이 있습니다.

  • 이벤트 시작점에서 종료점까지 실행 경로를 소리 내어 설명해 봅니다.
  • 분기 조건이 늘어날 때는 함수 분리 기준을 먼저 정하고 그래프를 정리합니다.