본문 바로가기
언리얼_엔진_게임개발_공부/언리얼 C++

[언리얼/C++] 액터에 컴포넌트 추가 및 에셋 적용

by jaboy 2025. 1. 20.

12월 중순 언리얼 엔진 공부를 처음 시작하며 블루프린트를 활용해 레벨에 액터를 추가하고 작동시키는 등 맛을 봤다면,

이번 주부터는 언리얼 엔진 C++을 활용해 더 많은 기능과 더 복잡한 로직을 구현하는 것을 배우기 시작한다.

 

오늘 학습한 내용은 언리얼 엔진 개발 환경을 구성하는 것부터 시작해 액터 클래스를 만들고, 컴포넌트를 추가하고, 에셋을 적용시키고, 매 프레임 정보를 업데이트하는 과정까지 다루었다.

이 중 클래스, 액터, 컴포넌트 등을 작성하는 문법에 익숙해지기 위해 오늘의 TIL에 다시 복기하는 차원에서 정리해보기로 했다.

 

클래스

 

#pragma once

#include "CoreMinimal.h" // 언리얼 엔진의 기본 타입, 매크로, 유틸 함수 등 정의
#include "GameFramework/Actor.h" // 언리얼 엔진의 AActor 클래스를 상속받아 서브클래스 생성
#include "ClassName.generated.h" // 리플렉션 시스템에 인식시키기 위한 코드

UCLASS() // 리플렉션 시스템에 클래스를 인식시키는 매크로
class PROJECTNAME_API AClassName : public AActor
// PROJECTNAME_API : 현 모듈 바깥에서 접근 가능하게 하기 위한 매크로
// 클래스 이름 앞에 A(Actor), U(Object), F(구조체), T(Template), E(Enum)
{
	GENERATED_BODY() // 리플렉션에 필요한 코드 자동 생성하는 매크로
    
public:
	AClassName(); // 생성자
    
protected:
	// 라이프사이클에 따라 아래의 함수 override
    virtual void PostInitializeComponents() override; // 컴포넌트 초기화 직후
    virtual void BeginPlay() override; // 액터 스폰 직후
    virtual void Tick(float DeltaTime) override; // 매 프레임
    virtual void Destroyed() override; // 액터 제거 직전 (Destroy() 로 직접 제거될 때) - 이후 EndPlay 호출됨
    virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; // 액터가 더 이상 월드에서 활동 안할 때
}

Destroyed()

- 게임 종료, 레벨 전환 등 직접 제거되지 않는 경우 호출되지 않을 수 있음

- 메모리 해제, 사운드/파티클 정리 등 최종 작업 수행

- Destroyed() 이후에 EndPlay() 가 호출됨

EndPlay()

- 파괴, 게임 종료, 레벨 전환 등 액터가 더 이상 월드에서 활동하지 않을 때 호출

- 자원 해제, 상태 저장 등

 

 

액터에 컴포넌트 추가 및 에셋 적용

// 루트 컴포넌트 추가하는 과정

// 1. 선언
USceneComponent* RootComp;

// 2. 구현부에서 생성
RootComp = CreateDefaultSubobject<USceneComponent>(TEXT("RootComp"));

// 3. 루트 컴포넌트로 설정
SetRootComponent(RootComp);

/*********************/

// 스태틱 메쉬 컴포넌트 추가 및 에셋 적용

// 1. 선언
UStaticMeshComponent* StaticMeshComp;

// 2. 구현부에서 생성
StaticMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMeshComp"));

// 3. 루트 컴포넌트에 부착
StaticMeshComp->SetupAttachment(RootComp);

// 4. 에셋 - 경로로 가져와 적용
static ConstructorHelpers::FObjectFinder<UStaticMesh> StaticMeshAsset(TEXT("경로"));
if (StaticMeshAsset.Succeeded())
	StaticMeshComp->SetStaticMesh(StaticMesh.Object);

static ConstructorHelpers::FObjectFinder<UMaterial> MaterialAsset(TEXT("경로"));
if (MaterialAsset.Succeeded())
	StaticMeshComp->SetMaterial(0, MaterialAsset.Object); // 인덱스 주의

 

이 과정을 연습해보고자 오디오 컴포넌트 + 사운드큐 추가를 한 번 해보았는데, 아래와 같은 헤더파일 인클루드가 필요.

#include "Components/AudioComponent.h"
#include "Sound/SoundCue.h"

#include "Components/PointLightComponent.h"

나머지는 동일한 문법이었다.

 

얼른 익숙해져야겠다!