C++/Unreal Engine

[UE4] Actor 클래스

로파이 2021. 9. 30. 15:06

Actor 액터 클래스

  • 레벨에 배치되는 모든 오브젝트를 지칭한다. 빛, 카메라, 스태틱 메시, 플레이어 시작지점 등이 액터에 속한다.
  • 3D 변환을 지원하며 생성되고 삭제되는 라이프 사이클이 있다.
  • 모든 Actor 클래스의 기반 클래스는 AActor이다.

- 에디터

  • 월드 아웃라이너 윈도우에서 씬에 존재하는 모든 액터를 확인할 수 있다.
  • 액터의 속성은 디테일 윈도우에서 확인가능하다.

 

- 모빌리티 (이동가능함)

https://docs.unrealengine.com/4.27/en-US/Basics/Actors/Mobility/

액터 클래스는 게임 상황 중 이동 가능함을 암시하고 보통 Static Mesh Actors와 Light Actor에 해당한다.

Mobility State Description
Static
(정적)
Static Mesh Actors - 미리 계산된 라이트맵에 의해 생성되는 그림자를 갖게된다.
게임 중 움직이지 않을 것이 보장되는 상황에 이상적이다. 하지만 그들의 재질은 애니메이션 될 수 있다.
Light Actors - 미리 계산되는 라이트맵을 형성하는데 사용되며 모든 모빌리티에 해당하는 Actor를 조명시킨다.
Stationary
(움직이지는 않지만 속성이 변경될 수 있는)
Static Mesh Actors - 미리 계산된 라이트맵에 기여하지는 않고 Movable과 같은 원리로 조명된다. Movable Light에 의해 조명될 때는 그 전 프레임에서 캐시된 그림자 데이터를 이용하여 약간의 성능 향상을 기대할 수 있다.
Light Actors - 게임 상황 중 속성이 변하여 더 밝아지거나 어둡게 되고 혹은 색상이 변한다. 미리 계산된 라이트맵에 기여하지만 움직이는 물체에 대해서 동적 그림자 생성을 한다. 많은 Stationary 라이트를 생성하는 것에 주의.
Movable
(이동 제약이 없는)
Static Mesh Actors - Static 혹은 Stationary 조명에 의해 동적으로 그림자가 생성된다.
Light Actors - 움직일 수 있는 조명, 색상과 밝기 변화도 포함할 수 있다. 이 조명들은 동적 그림자를 생성하기 때문에 렌더링 성능에 영향을 미친다.

 

- Transforming Actor

레벨에 배치한뒤 기즈모를 이용하여 Transform을 시킬 수 있다.

언리얼엔진은 오른손 좌표계를 사용

X축 (Front), Y축 (Right), Z축(Up)

 

 

기본 멤버 함수

액터 클래스는 많은 기능 제공을 위해 다양한 가상 함수를 가지고 있다.

- virtual void BeginPlay()

액터가 레벨에 스폰되거나 게임이 시작할 때 호출하는 함수이다. 이때 소지하고 있는 모든 컴포넌트의 BeginPlay가

이 함수에서 호출된다.

- virtual void EndPlay(const EEndPlayReason::Type)

액터가 레벨에서 제거될 때 호출된다. 모든 컴포넌트의 EndPlay가 호출된다. 이후 이 액터 클래스는 삭제될 것이라고 마킹된다. Pending to Kill.

 

- virtual void Tick( float DeltaSeconds );

액터를 구성하는 메인 게임 로직이 작성되는 함수. 매 프레임마다 호출된다.

 

액터의 수명주기 관련

https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Actors/ActorLifecycle/

액터가 레벨에 배치되는 경우

1) 디스크에서 로드

2) 에디터에서 플레이

3) 액터를 스폰 (게임 플레이 상황 중)

4) 지연 스폰 (나중에 한꺼번에 스폰할 경우)

 

Pending Kill 상태

모든 UObject는 삭제되기 이전 Pending 상태가 존재하므로 게임 로직에서 유효한 지 검사한다.

FORCEINLINE bool IsValid(const UObject *Test)
{
	return Test && !Test->IsPendingKill();
}

 

생성되기 전에 호출되는 Initialize 관련 함수

PreInitializeComponents() -> InitializeComponents() -> PostInitializeComponents() -> BeginPlay()

 

소멸로 마킹된 이후 가비지 컬렉션에서 메모리 해제시 호출되는 함수

EndPlay() -> BeginDestroy() -> IsReadyForFinishDestroy() -> FinishDestroy()

  • BeginDestroy : 소멸시작, 오브젝트의 메모리를 해제하고 멀티스레드 리소스 처리를 할 수 있다.
  • IsReadyForFinishDestroy : 가비지 컬렉션에 의해 영구히 해제가 준비되었는지 확인한다.
  • FinishDestroy : 오브젝트가 곧 소멸되므로 내부 데이터 구조체를 해제시킬 마지막 기회. 메모리 해제 직전에 호출된다.