Unreal

언리얼에서 컴포넌트란?

(ꐦ •᷄ࡇ•᷅) 2025. 1. 22. 10:51

컴포넌트는 언리얼 엔진에서 Actor가 어떤 역할을 하거나 특정 속성을 갖도록 만들어주는 부품(파츠) 개념이다.

하나의 Actor가 여러 종류의 컴포넌트를 조합하여 다양한 기능을 구현할 수 있다.

 

예를 들어, StaticMesh + Audio + Collision을 조합하여 충돌 시 소리가 나는 아이템을 만들 수도 있다.

 

루트 컴포넌트와 Scene Component

모든 Actor는 최상위 컴포넌트인 루트 컴포넌트를 가져야 한다.

 

루트 컴포넌트는 액터의 트랜스폼(위치, 회전, 크기)를 정의하며, 모든 하위 컴포넌트가 이를 기준으로 동작한다.

일반적으로 SceneComponent를 루트로 설정하여 액터의 트랜스폼을 관리하고, 그 아래 다양한 컴포넌트를 계층적으로 붙인다.

 

SceneComponent

  • SceneComponent는 모든 트랜스폼 속성을 가지는 기본 컴포넌트이다.
  • 직접적인 시각적 출력을 가지지 않았지만 다른 컴포넌트들의 계층적 트랜스폼을 정의하는 기준점 역할을 한다.
  • SceneComponent를 루트로 설정하면, 다른 시각적 컴포넌트를 아래에 Attach하여 관리할 수 있다.
  •  

실습) 코드로 루트 컴포넌트에 스태틱 메시를 붙여보기

헤더 파일

#pragma once

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

UCLASS()
class PROJECTJS_API AItem : public AActor
{
	GENERATED_BODY()
	
public:	
	AItem();

protected:
	USceneComponent* SceneRoot;
	UStaticMeshComponent* StaticMeshComp;
};

 

구현 파일

#include "Item.h"

AItem::AItem()
{
	// 씬 컴포넌트를 만들어 해당 클래스의 루트 컴포넌트로 만든다.
	SceneRoot = CreateDefaultSubobject<USceneComponent>(TEXT("SceneRoot"));
	SetRootComponent(SceneRoot);

	// 메시 컴포넌트를 만들어 루트 컴포넌트의 자식으로 설정한다.
	StaticMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMesh"));
	StaticMeshComp->SetupAttachment(SceneRoot);

	// 에셋을 불러와, 잘 불러와졌는지 확인한 후, 메시 컴포넌트에 불러온 메시를 대입한다.
	static ConstructorHelpers::FObjectFinder<UStaticMesh> MeshAsset(TEXT("/Game/Resources/Props/SM_Potion_A.SM_Potion_A"));
	if (MeshAsset.Succeeded())
	{
		StaticMeshComp->SetStaticMesh(MeshAsset.Object);
	}

	// 머티리얼을 불러와, 잘 불러와졌는지 확인한 후, 메시 컴포넌트의 머티리얼 자리에 대입한다.
	static ConstructorHelpers::FObjectFinder<UMaterial> MaterialAsset(TEXT("/Game/Resources/Props/SM_Potion_A.SM_Potion_A"));
	if (MaterialAsset.Succeeded())
	{
    	// 하지만 머티리얼 개수가 많을 수 있기 때문에 임의로 0번 머티리얼을 설정해 주었다.
		StaticMeshComp->SetMaterial(0, MaterialAsset.Object);
	}
}