액터 (Actor) 란?

언리얼 엔진 4에서의 액터는 레벨에 배치할 수 있는 오브젝트를 말한다.

액터는 이동, 회전, 스케일을 갖고있는 트렌스폼을 지원하는 범용 클래스이다.

결론적으로는 SceneComponent를 RootComponent로 집고있기 때문에 하나의 컴포넌트 덩어리라고 보면 된다.

엔진 내부 코드의 설명도 그러하다.

 /** The component that defines the transform (location, rotation, scale) of this Actor in the world, all other components must be attached to this one somehow */

게임 플레이 코드( C++ & Blueprint)를 통해 생성 및 소멸이 가능하며, C++ 에서 AActor는 모든 액터의 베이스 클래스이다.

액터는 BeginPlay나 Tick등의 함수들을 통해 초기화와 Tick을 돌며 프레임단위의 연산을 통해 게임에 여러 기능을 담을 수 있도록 창조해 나갈 수 있다.

액터는 트렌스폼 데이터를 직접 저장하지 않으며, 액터의 루트 컴포넌트에 트렌스폼 데이터가 존재할 경우에 그 데이터를 사용한다.

액터 생성 (Spawning Actors)

AActor 클래스 인스턴스를 새로 생성하는 것을 스폰 (Spawn) 이라 한다. 그 방법은 범용 함수인 SpawnActor() 템플릿 함수를 사용하면 된다.

이 함수는 월드 포인터를 불러 사용해야 하는데 기본적인 문법은 이러하다.

GetWorld()->SpawnActor<ATestActor>(ATestActor::StaticClass(), location, rotation, scale);

액터의 수명 주기 (Life Cycle of Actors)

디스크에서 로드하는 단계

이미 레벨에 있는 액터에 대해 LoadMap이 발생했을 때나 스트리밍 레벨 또는 서브 레벨에서 AddToWorld가 호출되었을 때 발생한다.

  1. 패키지나 레벨에 있는 액터가 디스크에서 로드된다.
  2. PostLoad 는 디스크에서 로딩을 끝낸 후 직렬화된(Serialized) 액터에 의해 호출된다.
  3. InitializeActorsForPlay 플레이용 액터들에 대한 초기화를 진행한다.
  4. RouteActorInitialize 액터 초기화 경로 변경을 진행해 초기화되지 않은 액터에 대해 호출한다. 이때에도 순서가 존재한다.
    1. PreInitializeComponents 컴포넌트 초기화 이전 단계이며 액터의 컴포넌트에 InitializeComponent를 호출하기 전에 호출한다.
    2. InitializeComponent 액터에 정의되어있는 각각의 컴포넌트를 생성하는 헬퍼 함수이다.
    3. PostInitalizeComponents 컴포넌트들이 초기화된 이후에 호출한다.
  5. BeginPlay 레벨이 시작되면 호출되는 함수이다.

에디터에서 플레이 (Play In Editor : PIE 상태)

  1. 에디터에 있는 액터를 새 월드로 복제한다.
  2. PostDuplicate 를 호출한다.
  3. InitializeActorsForPlay 가 호출되어 액터를 초기화한다.
  4. 초기화되지 않은 액터는 RouteActorInitialized 에서 초기화해 전달한다. 그 단계는 디스크에서 읽을때의 방법과 똑같다.
  5. OnActorSpawned 에서는 액터가 스폰되었을 때 UWorld에 Broadcast 해서 알린다.
  6. 그리고 마지막으로 BeginPlay를 돌면 액터가 시작된다.

수명의 다할 때 (Destroy)

액터의 소멸은 여러가지 방식으로 가능하고, 끝은 항상 같다.

게임 플레이 도중 소멸 되는 경우들

Destroy 가 호출될 때

소멸의 경우 액터를 제거해야겠다 싶지만 게임플레이 아직은 진행중일 때 게임에서 수동으로 함수를 호출해서 진행된다. 액터는 킬 대기 상태로 마킹된 후, 레벨의 액터 배열에서 제거된다.

EndPlay 플레이가 종료될 때

액터의 수명이 막바지에 다다름을 보증하기 위해 여러곳에서 호출된다. 플레이 도중에는 액터가 Destroy 되거나 레벨이 바뀌거나, 액터가 들어있던 스트리밍 레벨이 언로드되면 이 함수가 발동된다.

더 자세한 조건은 이렇다.

  • Destroy 명시적 호출
  • 에디터에서 플레이 종료
  • Level Transition (심리스 트래블 또는 맵 로드)
  • 액터가 들어있는 스트리밍 레벨 언로드
  • 액터의 수명 만료
  • 어플리케이션 종료 (모든 액터 소멸)

가비지 컬렉션 (Garbage Collection)

오브젝트가 소멸되기로 마킹된 이후에, 오브젝트는 가비지 컬렉션이 일어날 때 메모리에서 실제로 제거되어 사용중이던 리소스가 해제된다.

오브젝트의 소멸 도중 호출되는 함수들과 그 순서는 다음과 같다.

BeginDestroy소멸을 시작하는 부분이며, 여기서 오브젝트의 메모리를 해제하고 기타 그래픽 스레드 프록시 오브젝트와 같은 멀티 스레드 리소스 처리를 할 수 있다.
소멸 예정 관련 대부분의 게임플레이 함수들은 이보다 빠르게 EndPlay에서 처리되었다.
IsReadyForFinishDestroy소멸 마무리 준비 여부를 뭍는 단계이며, 가비지 컬렉션 프로세스는 이 함수를 호출하여 오브젝트 할당을 영구히 해제할 준비가 되어있는지 여부를 결정한다.
false를 반환할 경우에 이 함수는 다음 가비지 컬렉션 패스까지 실제 오브젝트 소멸 작업을 유예한다.
FinishDestroy소멸 마무리 단계이며, 오브젝트가 곧 소멸될 것이므로, 내부 데이터 구조체를 해제할 수 있는 마지막 기회이다. 메모리 해제 이전의 마지막으로 호출된다.