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를 할당.