본문 바로가기
공부/Unreal Engine 5

[언리얼5] CPP 프로젝트에서 자주 사용되는 컴포넌트 정리

by MY블로그 2024. 6. 10.

언리얼5엔진과 CPP언어를 사용하여 프로젝트를 진행하며 자주 사용하였던 컴포넌트들에대한 정리 입니다.

자주 사용되는 컴포넌트

1 UActorComponent
필요한 헤더: #include "Components/ActorComponent.h"
설명: 모든 컴포넌트의 기본 클래스입니다. 다른 모든 컴포넌트는 이 클래스를 상속받아 확장됩니다.


2 USceneComponent
필요한 헤더: #include "Components/SceneComponent.h"
설명: 트랜스폼 정보(위치, 회전, 스케일)를 가지는 모든 컴포넌트의 기본 클래스입니다.


3 UPrimitiveComponent
필요한 헤더: #include "Components/PrimitiveComponent.h"
설명: 렌더링 및 물리 시뮬레이션이 가능한 모든 컴포넌트의 기본 클래스입니다.


4 UStaticMeshComponent
필요한 헤더: #include "Components/StaticMeshComponent.h"
설명: 정적 메시를 렌더링하는 컴포넌트입니다.

 

5 USkeletalMeshComponent
필요한 헤더: #include "Components/SkeletalMeshComponent.h"
설명: 골격 메시를 렌더링하고 애니메이션을 적용할 수 있는 컴포넌트입니다.


6 UCameraComponent
필요한 헤더: #include "Camera/CameraComponent.h"
설명: 카메라 뷰를 제공하는 컴포넌트입니다.


7 USpringArmComponent
필요한 헤더: #include "GameFramework/SpringArmComponent.h"
설명: 카메라 또는 다른 컴포넌트를 스무스하게 따라다니게 하는 스프링 암입니다.


8 UAudioComponent
필요한 헤더: #include "Components/AudioComponent.h"
설명: 오디오를 재생하는 컴포넌트입니다.


9 UBoxComponent
필요한 헤더: #include "Components/BoxComponent.h"
설명: 박스 형태의 콜리전 컴포넌트입니다.


10 USphereComponent
필요한 헤더: #include "Components/SphereComponent.h"
설명: 구 형태의 콜리전 컴포넌트입니다.


11 UCapsuleComponent
필요한 헤더: #include "Components/CapsuleComponent.h"
설명: 캡슐 형태의 콜리전 컴포넌트입니다.


12 UParticleSystemComponent
필요한 헤더: #include "Particles/ParticleSystemComponent.h"
설명: 파티클 시스템을 렌더링하는 컴포넌트입니다.


13 UNiagaraComponent
필요한 헤더: #include "NiagaraComponent.h"
설명: 나이아가라 파티클 시스템을 렌더링하는 컴포넌트입니다. (언리얼5 이상)


14 UWidgetComponent
필요한 헤더: #include "Components/WidgetComponent.h"
설명: 3D 공간에서 UI 위젯을 렌더링하는 컴포넌트입니다.

 

컴포넌트의 선언 및 생성 예제

예제 클래스의 헤더(.h)에서 선언

모든 컴포넌트는 언리얼 엔진의 리플렉션 시스템과 연동되어야 하므로 매크로(UPROPERTY())선언이 필수입니다.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"

UCLASS()
class MYPROJECT_API AMyActor : public AActor
{
    GENERATED_BODY()

public:
    // Sets default values for this actor's properties
    AMyActor();

protected:
    // Called when the game starts or when spawned
    virtual void BeginPlay() override;

public:
    // Called every frame
    virtual void Tick(float DeltaTime) override;

private:
    // 컴포넌트를 선언합니다.
    UPROPERTY(VisibleAnywhere, Category = "Components")
    UStaticMeshComponent* StaticMeshComponent;

    UPROPERTY(VisibleAnywhere, Category = "Components")
    USkeletalMeshComponent* SkeletalMeshComponent;

    UPROPERTY(VisibleAnywhere, Category = "Components")
    UCameraComponent* CameraComponent;

    UPROPERTY(VisibleAnywhere, Category = "Components")
    USpringArmComponent* SpringArmComponent;

    UPROPERTY(VisibleAnywhere, Category = "Components")
    UAudioComponent* AudioComponent;

    UPROPERTY(VisibleAnywhere, Category = "Components")
    UBoxComponent* BoxComponent;

    UPROPERTY(VisibleAnywhere, Category = "Components")
    USphereComponent* SphereComponent;

    UPROPERTY(VisibleAnywhere, Category = "Components")
    UCapsuleComponent* CapsuleComponent;

    UPROPERTY(VisibleAnywhere, Category = "Components")
    UParticleSystemComponent* ParticleSystemComponent;

    UPROPERTY(VisibleAnywhere, Category = "Components")
    UNiagaraComponent* NiagaraComponent;

    UPROPERTY(VisibleAnywhere, Category = "Components")
    UWidgetComponent* WidgetComponent;
};

 

예제 클래스의 소스(.cpp)에서 생성

컴포넌트들은 CreateDefaultSubobject<>()로 생성되며 각각의 컴포넌트 정보를 포함한 헤더를 선언해야 합니다.

또한 컴포넌트 생성시 매개변수는 FName 이므로 TEXT("Name")매크로를 사용하여 지정합니다.

#include "MyActor.h"

// 필요한 헤더들을 선언해야 합니다.
#include "Components/StaticMeshComponent.h"
#include "Camera/CameraComponent.h"
#include "GameFramework/SpringArmComponent.h"
#include "Components/AudioComponent.h"
#include "Components/BoxComponent.h"
#include "Components/SphereComponent.h"
#include "Components/CapsuleComponent.h"
#include "Particles/ParticleSystemComponent.h"
#include "NiagaraComponent.h"
#include "Components/WidgetComponent.h"

AMyActor::AMyActor()
{
    PrimaryActorTick.bCanEverTick = true;

    StaticMeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMeshComponent"));
    RootComponent = StaticMeshComponent;

    SpringArmComponent = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArmComponent"));
    SpringArmComponent->SetupAttachment(RootComponent);

    CameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("CameraComponent"));
    CameraComponent->SetupAttachment(SpringArmComponent);

    AudioComponent = CreateDefaultSubobject<UAudioComponent>(TEXT("AudioComponent"));
    AudioComponent->SetupAttachment(RootComponent);

    BoxComponent = CreateDefaultSubobject<UBoxComponent>(TEXT("BoxComponent"));
    BoxComponent->SetupAttachment(RootComponent);

    SphereComponent = CreateDefaultSubobject<USphereComponent>(TEXT("SphereComponent"));
    SphereComponent->SetupAttachment(RootComponent);

    CapsuleComponent = CreateDefaultSubobject<UCapsuleComponent>(TEXT("CapsuleComponent"));
    CapsuleComponent->SetupAttachment(RootComponent);

    ParticleSystemComponent = CreateDefaultSubobject<UParticleSystemComponent>(TEXT("ParticleSystemComponent"));
    ParticleSystemComponent->SetupAttachment(RootComponent);

    NiagaraComponent = CreateDefaultSubobject<UNiagaraComponent>(TEXT("NiagaraComponent"));
    NiagaraComponent->SetupAttachment(RootComponent);

    WidgetComponent = CreateDefaultSubobject<UWidgetComponent>(TEXT("WidgetComponent"));
    WidgetComponent->SetupAttachment(RootComponent);
}

void AMyActor::BeginPlay()
{
    Super::BeginPlay();
}

void AMyActor::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
}

 

 CreateDefaultSubobject에 대한 주요 사항

기본 개념

CreateDefaultSubobject는 템플릿 함수로, 특정 타입의 서브오브젝트를 생성합니다.

생성된 서브오브젝트는 소유자 객체의 구성 요소로 자동으로 등록됩니다.

 

구문

UYourComponentType* YourComponent = CreateDefaultSubobject<UYourComponentType>(TEXT("YourComponentName"));

 

참고사항

CreateDefaultSubobject는 생성자 내에서만 호출되어야 합니다.
이 함수는 생성된 오브젝트의 메모리 관리 및 초기화 작업을 자동으로 처리합니다.
생성된 컴포넌트는 일반적으로 UPROPERTY 매크로와 함께 선언하여 가비지 컬렉션 및 에디터 내 표시를 관리합니다.

 

사용 시 주의점

컴포넌트의 이름은 고유해야 하며, 텍스트 형식으로 제공됩니다.
동일한 이름을 가진 여러 컴포넌트를 생성하지 않도록 주의해야 합니다.
컴포넌트의 초기화 및 셋업은 생성자 내에서 일관되게 수행되어야 합니다.

댓글