이전 포스터에서 생성한 C++ 클래스 액터에서 C++ 코드를 통해 스태틱 메쉬와 머티리얼을 할당해 본다.
생성된 액터 item 클래스의 헤더파일에서 불필요한 Tick,BeginPlay() 함수 부분은 지워준다.
Item 헤더파일

SceneRoot라는 Scene 컴포넌트 포인터를 생성 (Root 컴포넌트로 놓기 위한 컴포넌트)
여기서 USceneComponent 는 블루프린트 액터클래스에서 Default SceneRoot 컴포넌트와 동일한 역할을 한다고 보면된다.
StaticMeshComp라는 스태틱 메쉬 컴포넌트 포인터 생성 ( Root 컴포넌트에 붙여주고 해당 액터클래스에서 메쉬를 할당할 수 있도록 하기 위함)
여기서 UStaticMeshComponent 는 블루프린트 액터 클래스로 치면 StaticMesh 컴포넌트와 동일하다.
두 Scene 컴포넌트와 StaticMesh 컴포넌트를 각 SceneRoot , StaticMeshComp 라는 포인터를 선언.
Item 소스파일

1.컴포넌트 생성 및 Attach

헤더 파일에서 선언한 포인터들을 각 컴포넌트들을 생성 및 이름을 지정해준다.
SceneRoot 포인터에 SceneComponent 생성 후 SceneRoot 라는 이름으로 지정
StaticMeshComp 포인터에서 StaticMesh라는 이름으로 스태틱 메쉬 컴포넌트 생성 이후 Root컴포넌트인 SceneRoot에 Attach한다.
2. 생성한 스태틱 메쉬컴포넌트에 원하는 메쉬 및 머티리얼 지정

위 부분은 스태틱 메쉬를 원하는 리소스 경로에서 가져와서 성공적으로 찾았는지 확인 후 Mesh와 Material을 할당 하는 부분이다.
- ConstructorHelpers::FObjectFinder<T>
특정 리소스를 경로 기반으로 로드하는 클래스
- TEXT("경로")
해당 리소스 경로를 나타낸다.
경로는 에디터에서 원하는 리소스 우클릭 > 레퍼런스 복사를 통해 가져올 수 있다.

.Succeded()
지정된 경로에 리소스를 성공적으로 찾았는지 확인
경로가 잘못될 경우 이후 설정 함수가 호출 되지 않음
SetStaticMesh()
성공적으로 로드된 Static Mesh 를 설정
SetMaterial()
성공적으로 로드된 Material을 스태틱 메쉬의 머티리얼 슬롯에 지정
코드 블럭)
itme.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "item.generated.h"
UCLASS()
class SPARTA_STUDY_01_API Aitem : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
Aitem();
protected:
//루트 컴포넌트를 나타내는 Scene컴포넌트 포인터
USceneComponent* SceneRoot;
//스태틱 메쉬 컴포넌트 포인터
UStaticMeshComponent* StaticMeshComp;
};
item.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "item.h"
// Sets default values
Aitem::Aitem()
{
//SceneRoot 컴포넌트 생성 후 SceneRoot로 이름 지정
SceneRoot = CreateDefaultSubobject<USceneComponent>(TEXT("SceneRoot"));
SetRootComponent(SceneRoot); //Root 컴포넌트를 SceneRoot로 지정
//스태틱 메쉬 컴포넌트 생성 후 컴포넌트 이름을 StaticMesh로 지정
StaticMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMesh"));
StaticMeshComp->SetupAttachment(SceneRoot); // 해당 스태틱 메쉬를 SceneRoot 컴포넌트 밑으로 붙이기
// '/Game/Resources/Props/SM_Chair.SM_Chair' // 의자 메쉬 위치 언리얼 에디터에서 우클릭 > 레퍼런스 복사 하면됨
// '/Game/Resources/Props/Materials/M_Chair.M_Chair' // 의자용 머티리얼 위치
static ConstructorHelpers::FObjectFinder<UStaticMesh> MeshAsset(TEXT("/Game/Resources/Props/SM_Chair.SM_Chair")); // Static 타입의 변수 선언(스태틱 메쉬 에셋 가져오기)
if (MeshAsset.Succeeded()) // 메쉬 에셋이 성공적으로 생성되었는지 확인
{
StaticMeshComp->SetStaticMesh(MeshAsset.Object);
}
//머티리얼 에셋 가져와서 MaterialAsset 변수에 할당
static ConstructorHelpers::FObjectFinder<UMaterial> MaterialAsset(TEXT("/Game/Resources/Props/Materials/M_Chair.M_Chair"));
if (MaterialAsset.Succeeded()) //해당 머티리얼 에셋이 정상적으로 할당될경우 실행
{
// 인덱스 : 0, 원하는 머티리얼은 MaterialAsset에서 할당된 머티리얼
StaticMeshComp->SetMaterial(0, MaterialAsset.Object); //스태틱 메쉬의 머티리얼 할당 머티리얼의 경우 인덱스 인자값을 줘야함
}
}
결과물

C++ 클래스 생성 후 코드를 통해 해당 스태틱 메쉬와 머티리얼을 할당 후 레벨에 배치한 모습이다.
디테일 패널에서 보면 RootComponent는 보이는데 StaticMeshComponent는 보이지 않는 현상이 있다.
이것은 C++에서 리프랙션? 설정을 따로 해주어야 언리얼 에디터에서 확인 가능하다고 하니 다음 강의를 더 공부해가며 채워 가도록 하자.
'Unreal 5' 카테고리의 다른 글
| Tick() 이벤트 함수를 이용한 Rotation 값 업데이트 (2) | 2025.07.11 |
|---|---|
| 액터의 Transform 제어 방법 (1) | 2025.07.11 |
| UE_LOG 출력 및 카테고리 추가 (0) | 2025.07.10 |
| C++ 객체 생성과 제거 (0) | 2025.07.09 |
| 언리얼 엔진 C++ 빌드 프로세스 이해하기 (3) | 2025.07.05 |