액터 초기화와 종료 이벤트
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에서 처리합니다.
초기화와 종료 처리의 중요성
초기화와 종료 시점을 구분하면 다음과 같은 이점이 있습니다.
- 안정성: 오브젝트 생성 시 필요한 초기화가 누락되거나, 파괴 시 리소스 해제가 제대로 이루어지지 않으면 게임이 비정상적으로 작동하거나 메모리 누수와 같은 심각한 문제를 야기할 수 있습니다.
- 효율성: 불필요한 리소스 점유를 막고, 게임 성능을 최적화하는 데 기여합니다.
- 재현성: 오브젝트가 항상 일관된 상태로 생성되고 파괴되도록 보장하여, 디버깅을 용이하게 합니다.
Construction Script, Event BeginPlay, Event EndPlay 이 세 가지는 액터의 생명주기에서 중요한 전환점에 해당하며, 각자의 역할에 맞게 적절한 로직을 배치하는 것이 견고한 블루프린트를 만드는 데 필수적입니다.
EndPlay를 객체 메모리의 즉시 해제와 동일시하지 말고, 플레이 종료 뒤에도 엔진의 객체 수명 관리가 이어진다는 점을 기억하세요.
이번 절에서는 블루프린트에서 액터의 구성과 플레이 시작·종료에 사용하는 Construction Script, Event BeginPlay, Event EndPlay의 기본 개념과 활용법에 대해 알아보았습니다.
이로써 3장 클래스와 객체 지향 설계의 주요 내용을 모두 다루었습니다.
블루프린트 품질 점검
이 절의 내용은 노드를 많이 배치하는 것보다 흐름을 명확히 유지하는 데 목적이 있습니다.
- 이벤트 시작점에서 종료점까지 실행 경로를 소리 내어 설명해 봅니다.
- 분기 조건이 늘어날 때는 함수 분리 기준을 먼저 정하고 그래프를 정리합니다.