KoreanFoodie's Study

언리얼 게임플레이 클래스 : UObject, AActor, UActorComponent, UStruct 본문

Game Dev/Unreal C++ : Study

언리얼 게임플레이 클래스 : UObject, AActor, UActorComponent, UStruct

GoldGiver 2022. 4. 13. 10:50

언리얼 게임플레이의 4대 main class type

언리얼에는 게임플레이에 사용되는 4대 main class type 이 있다. 바로 UObject, AActor, AActorComponent, UStruct 이다. 이 외에도 사용자 정의 타입을 사용할수는 있지만, 그런 타입들은 엔진에 내장된 기능을 사용하지는 않는다. 하나씩 그 역할과 범위를 알아보자.

 

 

Unreal Objects (UObject)

UObject 는 언리얼 엔진의 building block 으로써, UClass 와 함께 다음과 같은 서비스들을 제공한다 :

  • Reflection of properties and methods
  • Serialization of properties
  • Garbage Collection
  • Finding a UObject by name
  • Configurable values for properties
  • Networking support for properties and methods

UObject 로부터 파생된 클래스는 해당 클래스 인스턴스의 메타데이터를 담고 있는 싱글턴 UClass 를 가진다. UObject 와 UClass 사이의 차이는, UClass 가 UObject 의 인스턴스가 어떻게 생겼는지를 알려준다는 것이다(시리얼라이제이션 가능한 프로퍼티가 무엇인지 등). 일반적으로 게임 개발 코드에서는 UObject 로부터 직접적으로 파생된 클래스를 쓰기보다는 Actor 나 ActorComponent 를 상속받은 클래스를 활용한다.

 

 

AActor

AActor 란 게임에 배치할 수 있는 UObject 를 의미하는데, AActor 에는 AStaticMeshActor, ACameraActor, APointLight 등이 있다. 액터는 명시적으로 메모리가 해제될 수도 있고, 해당 액터가 배치된 레벨이 언로드될때 Garbage Collector 에 의해 수거될수도 있다. 액터는 네트워킹 도중에 복사될 수 있는 기본 타입으로, network support 나 동기화가 필요한 UActorComponent 에 정보를 전달해줄 수 있다.

Actor 는 고유의 동작방식을 갖고 있지만, Actor Component 계층구조를 담는 컨테이너로서 활용되기도 한다. Actor 의 RootComponent 멤버는 하나의 USceneComponent 를 가지고 있는데, 이 USceneComponent 는 다른 ActorComponent 들을 담을 수 있다. 액터가 레벨에 배치되기 전에, 액터는 translation, rotation, scale 을 결정할 한 개 이상의 Scene Component 를 가지고 있어야 한다. (예를 들어, Actor 가 StaticMeshComponent 를 가지면서, RootComponent 로 해당 StaticMeshComponent 가 설정되어 있으면 1 개의 Scene Component 를 갖고 있는 것이다)

액터에 관여하는 이벤트들은 다음과 같은 것들이 있다 :

  • BeginPlay : 액터가 게임플레이에 처음 등장할 때 호출된다
  • Tick : 틱마다 호출된다
  • EndPlay : 액터가 게임플레이 공간에서 사라질때 호출된다.

액터는 UWorld::SpawnActor 를 통해 스폰할 수 있으며, 스폰이 성공적으로 끝나면 엔진은 BeginPlay 메소드를 호출할 것이다. Destroy 를 통해 Actor 를 소멸시킬 수 있는데, 그 과정 도중에는 EndPlay 가 호출된다. Lifespan 멤버를 이용하면 액터가 어느 정도 존재할지를 설정할 수 있다.

 

 

UActorComponent

UActorComponent 는 visual mesh, particle effect, camera perspective, physical interaction 등의 기능을 액터에게 제공한다. 액터에는 RootComponent 가 있어서, Actor 의 컴포넌트 트리 구조의 최상위에 위치하게 된다. UActorComponent 는 해당 액터 컴포넌트를 소유한 액터의 Tick 함수가 호출될 때 함께 "tick" 된다. 따라서 Tick 함수를 오버라이딩할 때는 반드시 Super::Tick 을 호출해 주어야 한다.

 

 

UStruct

UStruct 는 특정 클래스를 상속받을 필요 없이, USTRUCT( ) 매크로를 붙여주기만 하면 된다. UObject 와 달리, USTRUCT 는 가비지 컬렉션의 대상이 아니다. 만약 Ustruct 타입을 동적으로 할당했다면, 프로그래머 본인이 해당 객체의 lifecycle 을 관리해 주어야 한다. Ustruct 는 UObject 의 리플렉션(Reflection) 기능을 지원 받아 에디터와 블루프린트에서 편집이 가능하고, 시리얼라이제이션, 네트워킹 등의 추가 기능을 제공받는 기본적인 데이터 타입이라고 볼 수 있다.

Comments