언리얼 엔진에서 UObject와 AActor의 특징 비교
언리얼 엔진(Unreal Engine)은 게임 개발에서 강력한 기능을 제공하는 엔진으로, 다양한 클래스들이 존재한다. 이 중에서도 UObject와 AActor는 언리얼 엔진의 핵심 클래스이다. 두 클래스 모두 객체 지향적인 설계를 기반으로 하지만, 사용 목적과 특징이 다르다. 본 글에서는 UObject와 AActor의 차이점을 비교하고, 각각의 특징을 살펴보겠다.
1. UObject란?
UObject는 언리얼 엔진에서 모든 오브젝트의 기반이 되는 클래스이다. UObject는 메모리 관리, 가비지 컬렉션, 리플렉션 등의 기능을 제공하며, 언리얼 엔진의 다양한 시스템에서 기본적으로 사용된다.
1.1 UObject의 특징
- 가비지 컬렉션(Garbage Collection) 지원: UObject는 언리얼 엔진의 가비지 컬렉션 시스템을 사용하여 메모리 관리를 자동으로 수행한다.
- 리플렉션 시스템(Reflection System): UObject는 엔진 내에서 클래스 정보를 런타임에 동적으로 조회할 수 있도록 리플렉션을 지원한다.
- 트랜잭션 지원: UObject는 언리얼 엔진의 언두/리두 시스템에서 사용되며, 편집기에서 작업을 되돌릴 수 있는 기능을 제공한다.
- 게임 내에서 직접 배치 불가: UObject는 씬 내에서 직접 배치할 수 없다. 단순한 데이터 객체나 특정 시스템을 위한 관리 객체로 사용된다.
- Tick 함수 없음: UObject 자체에는 Tick() 함수가 없으며, 매 프레임마다 호출되는 기능을 포함하지 않는다.
1.2 UObject의 사용 예시
UObject는 보통 데이터 관리용으로 사용되며, 대표적인 예시는 다음과 같다.
- 데이터 저장 클래스: 설정 데이터를 저장하는 용도로 활용 (예: UGameInstance, UDataAsset)
- 비주얼 요소가 필요 없는 시스템 객체: 예를 들어, AI 시스템의 관리 객체 또는 네트워크 관련 기능을 담당하는 클래스
- 기본적인 구조체와 같은 역할: 단순 데이터를 저장하고 관리하는 용도로 활용된다.
UObject 예제 코드
UCLASS()
class MYGAME_API UMyDataObject : public UObject
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Data")
int32 PlayerScore;
};
이 코드는 UObject를 기반으로 하는 간단한 데이터 저장 클래스이며, 블루프린트에서도 사용 가능하다.
2. AActor란?
AActor는 UObject를 상속받아 확장된 클래스이며, 씬 내에서 직접 배치가 가능하다. 게임 월드 내에서 위치와 회전을 가지며, 물리 및 충돌 등의 기능을 제공한다.
2.1 AActor의 특징
- 게임 월드에서 배치 가능: AActor는 씬 내부에서 직접 배치할 수 있으며, 특정 위치와 방향을 가진다.
- 컴포넌트 시스템 지원: AActor는 여러 개의 UActorComponent를 가질 수 있으며, 이를 통해 복잡한 동작을 구현할 수 있다.
- Tick 함수 지원: AActor는 Tick(float DeltaTime) 함수를 제공하며, 매 프레임마다 특정 작업을 수행할 수 있다.
- 트랜스폼(Transform) 속성 보유: AActor는 Location, Rotation, Scale 속성을 가지며, 이를 통해 게임 내에서 이동 및 회전이 가능하다.
- 충돌 및 물리 기능 제공: AActor는 충돌을 감지할 수 있으며, PhysicsComponent를 추가하여 물리 연산을 수행할 수 있다.
2.2 AActor의 사용 예시
- 게임 내에서 움직이는 캐릭터 또는 오브젝트: 예를 들어, 플레이어 캐릭터, NPC, 차량 등
- 물리 연산이 필요한 오브젝트: 예를 들어, 상호작용이 가능한 오브젝트 또는 폭발하는 배럴
- 트랜스폼 조작이 필요한 객체: 게임 내에서 이동, 회전이 필요한 모든 오브젝트
- AI 관련 클래스: AI 컨트롤러와 같은 기능적 요소로도 사용 가능
AActor 예제 코드
UCLASS()
class MYGAME_API AMyActor : public AActor
{
GENERATED_BODY()
public:
AMyActor();
virtual void Tick(float DeltaTime) override;
};
AMyActor::AMyActor()
{
PrimaryActorTick.bCanEverTick = true;
}
void AMyActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
// 이동 또는 회전 로직 추가
}
이 코드에서는 AActor를 상속받아 Tick 함수를 구현하여 매 프레임마다 실행되는 기능을 추가하였다.
3. UObject vs AActor 비교 정리
아래 표를 통해 UObject와 AActor의 차이점을 정리한다.
특징 | UObject | AActor |
메모리 관리 | 가비지 컬렉션 사용 | 가비지 컬렉션 사용 |
씬 배치 가능 여부 | 불가능 | 가능 |
트랜스폼 속성 | 없음 | 있음 (Location, Rotation, Scale 포함) |
Tick 함수 | 없음 | 있음 (매 프레임 실행 가능) |
컴포넌트 시스템 | 지원하지 않음 | 지원 (UActorComponent 포함) |
충돌 및 물리 연산 | 불가능 | 가능 (Collision, Physics 지원) |
사용 예시 | 데이터 저장, 시스템 객체 | 게임 오브젝트, 캐릭터, 물리 객체 |
4. 결론
언리얼 엔진에서 UObject와 AActor는 각각 다른 역할을 수행한다. UObject는 데이터 및 시스템을 관리하는 데 초점이 맞춰져 있으며, 씬에 배치될 필요가 없는 객체를 만들 때 사용된다. 반면, AActor는 씬 내에서 직접 배치할 수 있으며, 물리 연산과 트랜스폼 조작이 필요한 게임 오브젝트를 생성하는 데 적합하다.
따라서 개발자는 프로젝트의 요구 사항에 따라 적절한 클래스를 선택해야 한다. 데이터 저장 및 관리가 필요하면 UObject를, 씬에 배치되고 상호작용해야 하는 오브젝트라면 AActor를 사용하는 것이 적절하다.