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"
나머지는 동일한 문법이었다.
얼른 익숙해져야겠다!
'언리얼_엔진_게임개발_공부 > 언리얼 C++' 카테고리의 다른 글
[언리얼/C++] 타이머 사용하기 / FTimerManager, FTimerHandle, SetTimer() (0) | 2025.01.24 |
---|---|
[언리얼/C++] 열거형 - UENUM / 언리얼 엔진의 EAxis (0) | 2025.01.23 |
[언리얼/C++] 비트마스크 Bitmask / TryFindType, UnknownFunction 경고 해결 (1) | 2025.01.21 |
[언리얼/C++] Tick 함수로 메쉬 스케일 변경 (커졌다 작아졌다 하게) (0) | 2025.01.21 |
(과제용) Unreal Engine C++ 간단한 이동 로직 구현하기 (0) | 2025.01.06 |