UE_5 컴포넌트(Component)

김재혁·2025년 1월 20일
0

UE_5에서의 컴포넌트

  • Actor가 어떤 역할을 하거나 특정 속성을 갖도록 만들어주는 부품 개념.
  • 컴포넌트는 독립적으로 동작하나, Actor에 첨부되어 있어 Actor의 생명 주기와 함께 동작.
    Ex) UStaticMeshComponent가 포함된 Actor가 파괴되면 그 컴포넌트도 함께 삭제됨.

루트 컴포넌트와 Scene Component

  • 모든 Actor는 최상위 컴포넌트인 루트 컴포넌트 (Root Component)를 가져야함.
  • Scene Component : 모든 트랜스폼 속성을 가지는 기본 컴포넌트.
    직접적인 시각적 출력을 가지진 않지만, 다른 컴포넌트들의 계층적 트랜스폼을 정의하는 기준점.
    Scene Component를 루트로 설정하면, 다른 시각적 컴포넌트르 아래에 Attach하여 관리 가능.
  • 루트 컴포넌트로 설정되는 것은 무조건 리플렉션 시스템에 등록이 됨.

Static Mesh Component

  • 애니메이션 없이 단순 이동, 회전만 하는 고정된(static) 3D 모델을 표시하는 컴포넌트.

Static Mesh Component와 Scene Component 연결

Item.h

protected:
		// 루트 컴포넌트를 나타내는 Scene Component 포인터
		USceneComponent* SceneRoot;
		// Static Mesh Component 포인터
		UStaticMeshComponent* StaticMeshComp;
  • UScenceComponent* SceneRoot : SceneRoot는 눈에 보이지 않는 논리적 컴포넌트로써
    실제 3D 모델이나 시각적 요소를 가지지 않음.
  • UStaticMeshComponent* StaticMeshComp : StaticMeshComp는 Static Mesh를 렌더링하는 역할.(눈에 보이게 해줌)

Item.cpp


#include "Item.h"

AItem::AItem()
{
		// Scene Component를 생성하고 루트로 설정
		SceneRoot = CreateDefaultSubobject<USceneComponent>(TEXT("SceneRoot"));
		SetRootComponent(SceneRoot);

		// Static Mesh Component를 생성하고 Scene Component에 Attach
		StaticMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMesh"));
		StaticMeshComp->SetupAttachment(SceneRoot);
}
  • CreateDefaultSubobject< T >(TEXT("")) : UE에서 컴포넌트를 생성하고 초기화할 때 사용하는 함수.
    템플릿 타입 < T >로 생성할 컴포넌트의 유형을 지정-> < UStaticMeshComponent >
    "StaticMesh", "SceneRoot" 는 각 컴포넌트의 식별 이름이 됨.
    TEXT() 매크로는 문자열을 유니코드로 처리하기 위한 것으로 UE 코드 표준에서 권장함.
  • SetRootComponent(SceneRoot) : 루트 컴포넌트를 SceneRoot로 설정.
    루트 컴포넌트는 액터의 기본 위치, 회전, 크기를 정의하며, 다른 모든 하위 컴포넌트가 이를 기준으로 동작.
  • SetupAttachment(SceneRoot) : StaticMeshComp를 SceneRoot에 부착(Attach)함.
    StaticMeshComp는 SceneRoot의 하위 컴포넌트로 동작하며, SceneRoot의 트랜스폼 변화에 따라 움직임.

StaticMesh 및 Material 설정

#include "Item.h"

AItem::AItem()
{
		// Scene Component를 생성하고 루트로 설정
		SceneRoot = CreateDefaultSubobject<USceneComponent>(TEXT("SceneRoot"));
		SetRootComponent(SceneRoot);

		// Static Mesh Component를 생성하고 Scene Component에 Attach
		StaticMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMesh"));
		StaticMeshComp->SetupAttachment(SceneRoot);
	/////////////////////////////////////////////////////////////////////////////////////////////////	
		// Static Mesh를 코드에서 설정
		static ConstructorHelpers::FObjectFinder<UStaticMesh> MeshAsset(TEXT("/Game/Resources/Props/SM_Chair.SM_Chair"));
		if (MeshAsset.Succeeded())
		{
			StaticMeshComp->SetStaticMesh(MeshAsset.Object);
		}

		// Material을 코드에서 설정
		static ConstructorHelpers::FObjectFinder<UMaterial> MaterialAsset(TEXT("/Game/Resources/Materials/M_Metal_Gold.M_Metal_Gold"));
		if (MaterialAsset.Succeeded())
		{
			StaticMeshComp->SetMaterial(0, MaterialAsset.Object);
		}
}
  • ConstructorHelpers::FObjectFinder< T > : UE에서 특정 리소스를 경로 기반으로 로드하는 클래스.
    ->UStaticMesh(스테틱메쉬) UMaterial(머테리얼)
  • MeshAsset(TEXT("/Game/Resources/Props/SM_Chair.SM_Chair")) : 리소스의 경로를 나타냄.
    MeshAsset(변수)
  • if (MeshAsset.Succeeded()) : 메쉬 에셋이 성공적으로 확인을 하는 함수.
  • StaticMeshComp->SetStaticMesh(MeshAsset.Object) : MeshAsset의 Object를 직접 가져와서 StaticMeshComp에 StaticMesh를 할당.

0개의 댓글