< 로그 메시지 (Log) >
1. UE_LOG
▸ 로그 카테고리(Log Category)
▸ 로그 수준(Log Level)
- Display : 일반적인 실행 흐름이나 상태 확인 메시지 (흰색)
- Warning : 예상치 못한 동작이나 잠재적인 문제 (노란색)
- Error : 즉시 수정이 필요한 심각한 문제 (빨간색)
▸출력할 메시지(TEXT)
2. 로그 카테고리 생성
▸ DECLARE_LOG_CATEGORY_EXTERN
- 새로운 카테고리를 정의할 수 있음
- 헤더파일에서 로그 카테고리 선언
- 매개변수
- 첫번째 : 카테고리 이름
- 두번째 : 지정되지 않은 경우의 기본 상세 수준
- 세번째 : 컴파일 시 허용되는 최대 상세 수준
▸ DEFINE_LOG_CATEGORY
- 새로 만든 카테고리 이름을 넣어줌
- cpp파일에 구현함
💡 로그의 중요성
개발 중에는 로그를 통해 디버깅하는 습관이 매우 중요
but. 프로젝트 최적화 단계나 출시 단계가 되면 불필요한 로그는 제거하거나 로그 레벨을 낮춰야 함
❗ 너무 많은 로그는 성능 저하를 일으키고, 민감한 정보가 노출될 수 있음
< 언리얼 엔진의 라이프 사이클 함수 >
1. 라이플 사이클 함수란?
- 객체나 액터(Actor)의 생성, 초기화, 업데이트, 파괴 등의 과정에서 호출되는 함수들
- 주로 AActor와 같은 클래스에서 정의됨
- 게임 오브젝트의 생명주기를 관리하는데 사용됨
2. 주요 라이프 사이클 함수
▸ Constructor
- 객체가 메모리에 생성될 때 딱 한 번 호출됨
- 액터가 월드에 완전히 등록되지 않은 시점이어서 다른 액터나 월드 관련 기능을 안전하게 호출하기 어려움
- 주로 컴포넌트 생성 및 초기 변수 세팅에 활용됨
- 에디터에서 액터가 배치되거나 수정될 때 호출되는 함수
- 주로 에디터에서 객체를 배치한 직후 초기화 작업을 수행할 때 사용됨
▸ PostInitializeComponents()
- 모든 컴포넌트가 초기화된 후에 호출됨
- 주로 컴포넌트와 관련된 추가 작업이나 설정이 필요할 때 사용됨 (컴포넌트들 사이의 의존관계 등)
▸ BeginPlay()
- 객체가 월드에 배치된 후 게임이 시작될 때, SpawnActor 등 으로 새 액터가 생성될 때 한 번 호출됨
- 이 시점에서는 이미 월드와 다른 액터들이 준비된 상태이므로, 자유롭게 상호 작용 가능
- 게임 로직의 시작 지점으로 사용되며, 게임 오브젝트의 초기 상태를 설정하는 데 유용 (AI, 게임모드, 플레이어 컨트롤러, 타이머, Delegate 바인딩 등)
▸ Tick(float DeltaTime)
- 매 프레임마다 호출되는 함수 (PrimaryActorTick.bCanEverTick = true; 설정 필요)
- 객체가 지속적으로 업데이트 되어야 하는 경우 사용됨 (캐릭터 이동, 물리 연산, 카메라 추적 등)
- 불완전하기 때문에 이벤트 기반으로 전환할 수 있는 부분은 Tick을 사용하지 않는 편이 성능에 유리함
▸ Destroyed()
- Destroy()함수를 호출하여 객체를 제거하는 직전에 호출되는 함수
- 레벨 전환이나 게임 종료 시에는 종종 건너뛰어지기도 함
∴ 모든 중요한 정리를 이 함수에 의존하는 것은 좋지 않음
- 객체의 메모리 해제 및 관련 자원 정리를 위한 작업을 처리할 때 유용 (수동 할당된 메모리, 스폰된 자식 액터, Delegate/event 바인딩, 사운드/파티클 등)
▸ EndPlay(const EEndPlayReason::Type EndPlayReason)
- 게임이 종료되거나 객체가 제거될 때 호출되는 함수
- EEndPlayReason::Type으로 EndPlay의 호출 이유를 알 수 있음(파괴, 레벨 언로드, 게임 종료 등)
- 상대적으로 호출 보장이 높아서 중요한 정리 로직(자원 해제, Timer 해제, 상태 저장 등)을 Destroy보다 이 함수에 넣는게 안전함
- 자원을 해제하거나 종료 작업을 수행할 때 유용 (네트워크 연결을 끊거나 특정 이벤트를 중지시키는 작업)
< 참고 자료 >
로그 카테고리 - 언리얼 문서
언리얼 엔진의 라이프사이클 함수
액터 수명주기