Unreal 게임 개발 과정 TIL

Today's I Learning

본캠프 TIL

06.05 Unreal 본캠프) 언리얼 C++ Actor에 대해서

Sunlight__ 2026. 6. 5. 20:12

 

오늘 배운 것

 

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>
 : 언리얼 엔진에서 특정 리소스를 경로 기반으로 로드하는 클래스이다.