액터 (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가 호출되었을 때 발생한다.
- 패키지나 레벨에 있는 액터가 디스크에서 로드된다.
- PostLoad 는 디스크에서 로딩을 끝낸 후 직렬화된(Serialized) 액터에 의해 호출된다.
- InitializeActorsForPlay 플레이용 액터들에 대한 초기화를 진행한다.
- RouteActorInitialize 액터 초기화 경로 변경을 진행해 초기화되지 않은 액터에 대해 호출한다. 이때에도 순서가 존재한다.
- PreInitializeComponents 컴포넌트 초기화 이전 단계이며 액터의 컴포넌트에 InitializeComponent를 호출하기 전에 호출한다.
- InitializeComponent 액터에 정의되어있는 각각의 컴포넌트를 생성하는 헬퍼 함수이다.
- PostInitalizeComponents 컴포넌트들이 초기화된 이후에 호출한다.
- BeginPlay 레벨이 시작되면 호출되는 함수이다.
에디터에서 플레이 (Play In Editor : PIE 상태)
- 에디터에 있는 액터를 새 월드로 복제한다.
- PostDuplicate 를 호출한다.
- InitializeActorsForPlay 가 호출되어 액터를 초기화한다.
- 초기화되지 않은 액터는 RouteActorInitialized 에서 초기화해 전달한다. 그 단계는 디스크에서 읽을때의 방법과 똑같다.
- OnActorSpawned 에서는 액터가 스폰되었을 때 UWorld에 Broadcast 해서 알린다.
- 그리고 마지막으로 BeginPlay를 돌면 액터가 시작된다.
수명의 다할 때 (Destroy)
액터의 소멸은 여러가지 방식으로 가능하고, 끝은 항상 같다.
게임 플레이 도중 소멸 되는 경우들
Destroy 가 호출될 때
소멸의 경우 액터를 제거해야겠다 싶지만 게임플레이 아직은 진행중일 때 게임에서 수동으로 함수를 호출해서 진행된다. 액터는 킬 대기 상태로 마킹된 후, 레벨의 액터 배열에서 제거된다.
EndPlay 플레이가 종료될 때
액터의 수명이 막바지에 다다름을 보증하기 위해 여러곳에서 호출된다. 플레이 도중에는 액터가 Destroy 되거나 레벨이 바뀌거나, 액터가 들어있던 스트리밍 레벨이 언로드되면 이 함수가 발동된다.
더 자세한 조건은 이렇다.
- Destroy 명시적 호출
- 에디터에서 플레이 종료
- Level Transition (심리스 트래블 또는 맵 로드)
- 액터가 들어있는 스트리밍 레벨 언로드
- 액터의 수명 만료
- 어플리케이션 종료 (모든 액터 소멸)
가비지 컬렉션 (Garbage Collection)
오브젝트가 소멸되기로 마킹된 이후에, 오브젝트는 가비지 컬렉션이 일어날 때 메모리에서 실제로 제거되어 사용중이던 리소스가 해제된다.
오브젝트의 소멸 도중 호출되는 함수들과 그 순서는 다음과 같다.
BeginDestroy | 소멸을 시작하는 부분이며, 여기서 오브젝트의 메모리를 해제하고 기타 그래픽 스레드 프록시 오브젝트와 같은 멀티 스레드 리소스 처리를 할 수 있다. 소멸 예정 관련 대부분의 게임플레이 함수들은 이보다 빠르게 EndPlay에서 처리되었다. |
IsReadyForFinishDestroy | 소멸 마무리 준비 여부를 뭍는 단계이며, 가비지 컬렉션 프로세스는 이 함수를 호출하여 오브젝트 할당을 영구히 해제할 준비가 되어있는지 여부를 결정한다. false를 반환할 경우에 이 함수는 다음 가비지 컬렉션 패스까지 실제 오브젝트 소멸 작업을 유예한다. |
FinishDestroy | 소멸 마무리 단계이며, 오브젝트가 곧 소멸될 것이므로, 내부 데이터 구조체를 해제할 수 있는 마지막 기회이다. 메모리 해제 이전의 마지막으로 호출된다. |