Vetenir 2025. 3. 24. 20:59

언리얼 엔진에서 UObject 클래스는 엔진의 모든 객체 시스템의 기반이 되는 최상위 클래스입니다.

✅ UObject 클래스의 역할

  • 언리얼의 모든 클래스의 기반: AActor, UActorComponent, UUserWidget 등 다양한 클래스가 UObject에서 파생됩니다.
  • 가비지 컬렉션(GC) 지원: UObject를 상속하면 자동으로 가비지 컬렉션 대상이 되어 메모리 관리가 쉬워집니다.
  • 리플렉션(Reflection) 지원: UCLASS() 매크로를 사용하면 언리얼의 리플렉션 시스템을 통해 에디터, 블루프린트, 네트워크 복제 등에 활용할 수 있습니다.

✅ UObject vs. AActor

구분UObjectAActor

 

구분 UObjectA AActor
상속 최상위 클래스 UObject를 상속
월드에 배치 가능 여부 ❌ 불가능 ✅ 가능
트랜스폼(위치, 회전, 크기) ❌ 없음 ✅ 있음
네트워크 복제 ❌ 기본적으로 불가능 ✅ 가능
가비지 컬렉션 ✅ 지원 ✅ 지원
  • UObject는 게임 내에서 직접 배치할 수 없고, NewObject<UMyClass>()로 동적으로 생성해야 합니다.
  • AActor는 월드에 배치할 수 있으며, SpawnActor<AMyClass>()로 인스턴스화합니다.

✅ UObject를 상속하는 클래스 예제

#pragma once

#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "MyObject.generated.h"

UCLASS()
class MYGAME_API UMyObject : public UObject
{
    GENERATED_BODY()

public:
    UFUNCTION(BlueprintCallable, Category = "MyCategory")
    void MyFunction();
};
  • UCLASS() 매크로를 사용하여 언리얼 엔진의 리플렉션 시스템과 연동됩니다.
  • BlueprintCallable을 선언하면 블루프린트에서 사용할 수 있습니다.

✅ UObject 생성 및 사용

1️⃣ C++에서 동적 생성

UMyObject* MyObj = NewObject<UMyObject>();
  • NewObject<>()를 사용해야 가비지 컬렉션이 정상적으로 작동합니다.
  • new UMyObject();를 사용하면 GC가 작동하지 않으므로 메모리 관리가 필요합니다.

2️⃣ 블루프린트에서 사용

  • UFUNCTION(BlueprintCallable)로 함수가 선언되면 블루프린트에서 호출할 수 있습니다.

✅ UObject를 상속해야 하는 경우

  • 게임 내에서 데이터만 관리하는 객체가 필요할 때
  • 액터(Actor)처럼 월드에 배치되지 않는 클래스를 만들고 싶을 때
  • 싱글톤 패턴을 구현할 때 (UGameInstance, UBlueprintFunctionLibrary 등)

✅ 결론

  • UObject는 언리얼의 기본 오브젝트 시스템을 제공하는 최상위 클래스입니다.
  • AActor와 달리 월드에 직접 배치할 수 없으며, 가비지 컬렉션 및 리플렉션을 지원합니다.
  • NewObject<UYourClass>()로 생성하여 사용해야 합니다.