오늘 배운 것
1. Actor 클래스 코드 구조 이해하기
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Item.generated.h"
- #pragma once
: 동일 헤더가 프로젝트 곳곳에서 여러 번 포함되더라도 컴파일러가 한 번만 처리하도록 한다.
언리얼을 포함한 모던 C++ 에서 사실상 표준으로 사용한다.
- #include "CoreMinimal.h"
: 언리얼에서 가장 기본이 되는 헤더로, 엔진 전역 타입, 매크로, 함수 등을 가져온다.
필수 헤더이므로 거의 모든 .h 파일의 맨 위에 포함된다.
- #include "GameFramework/Actor.h"
: AActor 클래스 선언을 사용 가능하게 한다.
- #include "Item.generated.h"
: 언리얼 헤더툴 (UHT)이 자동 생성하는 코드를 포함하는 것이다.
반드시 헤더의 마지막 줄에 위치해야 한다.
2. 파일 클래스 선언부 코드
UCLASS()
class SPARTAPROJECT_API AItem : public AActor
{
GENERATED_BODY()
public:
// 생성자
AItem();
protected:
// 액터가 월드에 스폰 (배치된) 직후 한 번만 호출
virtual void BeginPlay() override;
// 매 프레임마다 호출 virtual void Tick(float DeltaTime) override;
};
- UCLASS()
: 이 클래스를 리플렉션 시스템에 등록하는 매크로이다.
( 리플렉션 시스템 : 언리얼 에디터에서 이 클래스를 블루프린트로 확장할 수 있게 하고, 에디터의 여러 기능과 연동하게 한다. )
- class SPARTAPROJECT_API AItem : public AActor
: AActor를 상속받아 AItem 클래스를 정의한다는 의미이다.
- AItem
: 언리얼 엔진 C++에서는 클래스 이름에 접두사를 붙이는 접두사 규칙이 있다.
-> A (Actor 계열), U (Object 계열), F (구조체), T (템플릿), E (열거형) 등
-> Item 이라는 이름으로 클래스를 만들었지만, 실제 클래스 이름은 Actor 클래스를 상속 받았기에 접두사 규칙을 사용해, AItme 으로 생성된다.
-> SPRATAPROJECT_API는 이 클래스 모듈 외부에서도 클래스를 사용할 수 있게 하기 위한 매크로이다.
- GENERATED_BODY()
: UCLASS() 와 짝을 이루며, 언리얼 헤더툴이 자동 생성한 코드를 삽입해 주는 매크로이다.
잘 모르고 있던 사실
- 모든 Actor는 루트 컴포넌트 (Root Component)를 가져야 한다.
- 루트 컴포넌트는 액터의 트랜스폼 (위치, 회전, 크기)를 정의하는 최상위 컴포넌트이며, 모든 하위 컴포넌트가 이를 기준으로 트랜스폼이 계산된다.
- 보통 Scene Component를 루트 컴포넌트로 설정하여 액터의 트랜스폼을 관리하고, 그 아래에 다양한 컴포넌트를 계층적으로 붙인다. (기준점 역할)
3. Static Mesh Component와 Scene Component 연결하기
#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;
};
Item.h 파일
#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);
}
Item.cpp 파일
- CreateDefaultSubobject<T>(TEXT(""))
: 언리얼 엔진에서 컴포넌트를 생성하고 초기화할 때 사용하는 함수이다.
템플릿 타입 <T>로 생성할 컴포넌트의 유형을 지정한다.
"StaticMesh", "SceneRoot" 는 각 컴포넌트의 식별 이름이 된다.
TEXT() 매크로는 문자열을 유니코드로 처리하기 위한 것으로, 언리얼 엔진 코드 표준에서 권장한다.
- SetRootComponent(SceneRoot)
: 루트 컴포넌트를 SceneRoot로 설정한다.
- SetupAttachment(SceneRoot)
: StaticMeshComp를 SceneRoot에 부착한다.
4. Static Mesh 및 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>
: 언리얼 엔진에서 특정 리소스를 경로 기반으로 로드하는 클래스이다.
- .Succeeded()
: 지정된 경로에서 리소스를 성공적으로 찾았는지 확인한다.
경로가 잘못되었거나 리소스 파일이 누락된 경우 실패하며, 이후 설정 함수가 호출되지 않는다. (안정성 증가)
오늘 배운 것에서 개인적으로 중요하다고 생각하는 코드
- CreateDefaultSubobject<T>(TEXT(""))
: 언리얼 엔진에서 컴포넌트를 생성하고 초기화할 때 사용하는 함수이다.
템플릿 타입 <T>로 생성할 컴포넌트의 유형을 지정한다.
- ConstructorHelpers::FObjectFinder<T>
: 언리얼 엔진에서 특정 리소스를 경로 기반으로 로드하는 클래스이다.
'본캠프 TIL' 카테고리의 다른 글
| 06.08 Unreal 본캠프) C++ Actor의 Transform 조정 (0) | 2026.06.08 |
|---|---|
| 06.08 Unreal 본캠프) 언리얼 C++ Log 출력 (0) | 2026.06.08 |
| 06.01 Unreal 본캠프) 커리어 데이 (0) | 2026.06.01 |
| 05.29 Unreal 본캠프) 팀 프로젝트 발표회 (0) | 2026.05.29 |
| 05.26 Unreal 본캠프) Text_RPG 팀 프로젝트 스토리 로그 출력 (0) | 2026.05.26 |