헤더파일
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Item.generated.h"
UCLASS()
class SPARTAPROJECT_API AItem : public AActor
{
GENERATED_BODY()
public:
AItem();
protected:
// 루트 컴포넌트를 나타내는 Scene Component 포인터
USceneComponent* SceneRoot;
// Static Mesh Component 포인터
UStaticMeshComponent* StaticMeshComp;
};
이렇게 멤버 변수를 추가해준다.
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(""))
- 언리얼 엔진에서 컴포넌트를 생성하고 초기화할 때 사용하는 함수. -->> 객체 생
- 템플릿 타입 <T>로 생성할 컴포넌트의 유형을 지정한다.
- "StaticMesh" , "SceneRoot"는 각 컴포넌트의 식별 이름이 된다.
- TEXT() 매크로는 문자열을 유니코드로 처리하기 위한 것으로, 언리얼 엔진 코드 표준에서 권장한다.
- SetRootComponent(SceneRoot)
- AActor클래스의 멤버함수.
- 루트 컴포넌트를 SceneRoot로 설정한다.
- 루트 컴포넌트는 액터의 기본 위치, 회전, 크기를 정의하며, 다른 모든 하위 컴포넌트가 이를 기준으로 동작한다.
- SetupAttachment(SceneRoot)
- USceneComponet 클래스의 멤버함수.
- StaticMeshComp 를 Scene에 부착(Attach)한다.
- StaticMeshComp는 SceneRoot의 하위 컴포넌트로 동작하며, SceneRoot의 트랜스폼 변화에 따라 움직인다.
언리얼 엔진의 컴포넌트 계층 구조
- UObject (모든 언리얼 객체의 기본 클래스)
- UActorComponent (액터에 추가할 수 있는 기본 컴포넌트)
- USceneComponent (위치, 회전, 스케일을 가진 컴포넌트)
- UPrimitiveComponent (렌더링 가능한 컴포넌트)
- UStaticMeshComponent (정적 메시를 표시하는 컴포넌트)
순서
1. 헤더파일에 신컴포넌트 클래스의 포인터 변수를 만들어준다.
2. cpp파일에서 변수에 실제 컴포넌트를 생성해준다. 타입에는 클래스 타입을 넣어주고, 이름은 변수이름과 똑같 지어준다.
3. 그리고 신컴포넌트를 루트컴포넌트로 세팅해준다.
4. 메시컴포넌트를 똑같이 생성 후에 신컴포넌트에 붙여준다.
이렇게 코드를 작성하고 빌드를 하면 언리얼 에디터에서 Item액터를 원하는 곳에 배치 가능하다.
하지만 Scene컴포넌트만 있고 StaticMesh컴포넌트는 보이지 않는다.
이건 리플렉션이 반영이 안되었기 때문이다. 다만 RootComponent는 자동으로 리플렉션이 반영되었기 때문에 보인다.
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>
- 언리얼엔진에서 특정 리소스를 경로 기반으로 로드하는 클래스.
- 생성자에서만 사용할 수 있는 특별한 클래스.
- 앞에 static을 붙이면 이 객체가 생성자 호출마다 새로 만들어지는게 아니라, 프로그램이 시작될 때 딱 한번만 초기화되고 그 메모리를 계속 재사용하게 된다.
- ConstructorHelpers는 네임스페이스, FObjectFinder는 그 안에 있는 템플릿 클래스.
- TEXT("/Game/Resources/Props/SM_Chair.SM_Chair")
- 리소스의 경로를 나타낸다. 리소스의 경로는 해당 에셋 우클릭 레퍼런스 복사.
- 단, /Game 여기서부터만 입력하면 되고, 앞에 경로는 삭제.
- /Game은 Unreal Engine에서 프로젝트의 Content 폴더를 나타낸다.
- .Succeeded( )
- 지정된 경로에서 리소스를 성공적으로 찾았는지 확인한다. -> 불리언 값을 반환.
- 경로가 잘못되었거나 리소스 파일이 누락된 경우 실패하며, 이후 설정 함수가 호출되지 않는다.
- ConstructorHelpers::FObjectFinder 클래스의 멤버함수.
- StaticMeshComp->SetStaticMesh(MeshAsset.Object);
- StaticMeshComp에 MeshAsset이라고 이름 지은, 경로로 찾아낸 실제 UStaticMesh 객체 오브젝트를 설정해라.
- Object는 ConstructorHelpers::FObjectFinder 클래스의 멤버변수.
- SetStaticMesh( ), SetMaterial( )
- 성공적으로 로드된 Static Mesh를 StaticMeshComp에 설정한다.
- 로드된 Material을 StaticMeshComp의 특정 머티리얼 슬롯에 적용한다. 여기서는 첫 번째 머티리얼 슬롯 (Index 0)에 Material이 설정된다.
'언리얼엔진5 공부' 카테고리의 다른 글
| 언리얼엔진 C++ 챕터2 - 1. Character_클래스를_활용한_캐릭터_구현하기 (2) | 2025.09.19 |
|---|---|
| 언리얼엔진 C++ 챕터1 - 5. C++ 클래스와 리플렉션 시스템 활용하기 (0) | 2025.09.18 |
| 언리얼엔진 C++ 챕터1 - 4. Tick 함수로 Actor의 Transform 조정하기 (1) | 2025.09.17 |
| 언리얼엔진 C++ 챕터1 - 3. Actor의 라이프 사이클 이해하기 (2) | 2025.09.16 |
| 언리얼엔진 C++ 챕터1 - 1. 액터 소스파일의 기본 구성 (0) | 2025.09.03 |