icon안동민 개발노트

생성자와 파괴자의 기본 이해


 블루프린트에서 생성자(Constructor)와 파괴자(Destructor)는 객체의 생명주기에서 중요한 역할을 합니다.

 이들은 객체가 생성될 때와 파괴될 때 실행되는 특별한 함수로, 초기화와 정리 작업을 담당합니다.

생성자 (Constructor)

 생성자는 객체가 생성될 때 자동으로 호출되는 함수입니다.

 블루프린트에서는 'Construction Script'라고 불립니다.

 생성자의 역할

  • 객체의 초기 상태 설정
  • 컴포넌트 생성 및 초기화
  • 변수 초기값 설정

 생성자 작성 방법

  1. 블루프린트 에디터에서 'Construction Script' 탭 선택
  2. 노드를 추가하여 초기화 로직 구현

 생성자 사용 예제

Construction Script:
[Create Dynamic Material Instance] --> [Set Material Parameters]
                                   --> [Set Mesh Component Material]
[Initialize Health] --> [Set Max Health]
                    --> [Set Current Health]

 이 예제에서는 동적 머티리얼 인스턴스를 생성하고 초기 상태를 설정하며, 캐릭터의 체력을 초기화합니다.

BeginPlay vs 생성자

 BeginPlay 이벤트는 게임플레이가 시작될 때 호출되는 반면, 생성자는 객체가 생성될 때마다 호출됩니다.

특성생성자BeginPlay
호출 시점객체 생성 시게임플레이 시작 시
주요 용도초기 설정, 컴포넌트 생성게임플레이 관련 초기화
에디터에서의 동작객체 배치/수정 시 실행플레이 모드 진입 시 실행

 사용해야 하는 상황

  • 생성자 : 컴포넌트 생성, 기본 속성 설정, 에디터에서 즉시 반영되어야 하는 설정
  • BeginPlay : 게임플레이 시작 시 필요한 초기화, 다른 액터와의 상호작용 설정

파괴자 (Destructor)

 블루프린트에서 파괴자의 역할은 주로 'EndPlay' 이벤트가 담당합니다.

 파괴자의 역할

  • 사용한 리소스 정리
  • 연결된 다른 객체에 파괴 알림
  • 최종 상태 저장 또는 로그 기록

 EndPlay 이벤트 사용 방법

  1. 이벤트 그래프에서 'EndPlay' 이벤트 추가
  2. 정리 작업을 위한 노드 연결

 EndPlay 사용 예제

Event EndPlay:
[Check Owned Items] --> [For Each Loop]
                           |
          [Destroy Item] <-- [Loop Body]
[Save Player Stats] --> [Write To Save Game]
[Unregister from Game Mode] 

 이 예제에서는 객체 파괴 시 소유한 아이템을 정리하고 플레이어 상태를 저장하며 게임 모드에서 등록 해제합니다.

리소스 정리 관련 주의사항

 1. 순환 참조 주의

  • 상호 참조하는 객체들 간의 파괴 순서 고려

 2. 비동기 작업 처리

  • 진행 중인 비동기 작업 적절히 취소 또는 완료 대기

 3. 네트워크 리소스

  • 열려있는 네트워크 연결 정리

 4. 타이머 및 이벤트

  • 등록된 타이머나 이벤트 리스너 제거

 5. 외부 리소스

  • 파일 핸들, 데이터베이스 연결 등 외부 리소스 해제

생성자와 파괴자 사용 시 Best Practices

 1. 간결성 유지

  • 생성자와 파괴자에서 복잡한 로직 피하기
  • 필요시 별도의 초기화/정리 함수 호출

 2. 에러 처리

  • 초기화 실패 시 적절한 에러 처리 및 로깅

 3. 성능 고려

  • 생성자에서 무거운 연산 피하기
  • 필요시 지연 초기화(lazy initialization) 사용

 4. 상속 고려

  • 부모 클래스의 생성자/파괴자 호출 확인

 5. 디버깅 지원

  • 중요 단계에서 로그 출력으로 디버깅 용이성 향상

고급 사용 예제 : 동적 오브젝트 풀링

Construction Script:
[Create Object Pool] --> [Pre-Instantiate Objects]
                     --> [Set Pool Size]
 
BeginPlay:
[Register Pool with Game Mode]
 
Function: GetObjectFromPool
[Check Available Object] --> [Branch]
                               |
    [Create New Object] <-- [False]
                               |
      [Activate Object] <-- [True]
 
EndPlay:
[Return All Objects to Pool] --> [Clear Pool]
                              --> [Unregister from Game Mode]

 이 예제에서는 생성자에서 오브젝트 풀을 초기화하고 BeginPlay에서 게임 모드에 등록합니다.

 게임 중에는 풀에서 오브젝트를 가져와 사용하고, EndPlay에서 모든 리소스를 정리합니다.

 생성자와 파괴자(EndPlay)를 효과적으로 사용하면 객체의 생명주기를 잘 관리할 수 있고, 리소스 누수를 방지할 수 있습니다.

 그러나 과도하게 복잡한 로직을 이 단계에 포함시키면 성능 문제나 예기치 못한 동작을 야기할 수 있으므로 주의가 필요합니다.

 항상 명확하고 필요한 작업만을 포함시키고, 더 복잡한 초기화나 정리 작업은 별도의 함수로 분리하는 것이 좋습니다.