Unreal Engine 5/C++와 Unreal Engine으로 3D 게임 개발

Actor 클래스의 코드 구조

iiblueblue 2025. 1. 21. 12:55
⊙ Actor 클래스의 헤더 파일 코드를 이해한다.
⊙ Actor 클래스의 구현 파일 코드를 이해한다.

 

Actor 클래스의 헤더 파일 구조

헤더 파일을 열어보면 C++ 프로그래밍에서는 볼 수 없었던 신기한 것들을 많이 볼 수 있다. 이제부터 아래 코드를 하나씩 뜯어가면 무엇을 의미하는지 알아보려고 한다.

// 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 CH3_UNREAL3DGAME_API AItem : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AItem();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;
	virtual void Tick(float DeltaTime) override;

};

 

상단 코드

#pragma once

이 헤더 파일이 여러번 포함되더라도 컴파일 시 단 한번만 처리 해주도록 하는 지시어이다.

다른 방법도 여러가지 있지만 위 지시어를 쓰는 것을 권장하고 있다. 다른 방법은 아래 글에서 확인 가능하다.

https://iiblueblue.tistory.com/108

 

다중 포함 방지

⊙ 헤더파일에 작성하는 다중 포함 방지문을 이해한다. 헤더 파일에 대해서 다시 배우면서 오랜만에 해더 파일을 작성했는데 모든 예제에 앞부분에 같은 문구가 있는 것을 보고 이것이 무엇인

iiblueblue.tistory.com

 

#include "CoreMinimal.h"

언리얼 엔진에서 자주 사용하는 기본타입(FString, TArray 등)과 매크로(UE_LOG 등), 각종 유틸 함수들이 정의 되어 있다.

 

#include "GameFramework/Actor.h"

AActor를 상속받기 위해 필요한 헤더 파일이다.

 

#include "Item.generated.h"

언리얼 엔진의 리플렉션 시스템에서 필요한 코드를 자동으로 생성하기 위한 매크로이다. 이후 관련된 내용을 정리한다면 링클르 붙여넣겠다.

 

클래스 선언부 코드

UCLASS()

이 클래스를 언리얼 엔진의 리플렉션 시스템에 인식하도록 하는 매크로이다.

언리얼 에디터에서 이 클래스를 블루프린트로 확장할 수 있게 하고, 에디터의 여러 기능과 연동하도록 한다.

 

class CH3_UNREAL3DGAME_API AItem : public AActor

AActor를 상속받아 AItem 클래스를 정의한다는 의미이다.

 

AItem

언리얼 엔진 C++에서는 클래스 이름에 접두사를 붙이는 컨벤션이 있다. Item이라는 이름으로 클래스를 만들었지만 Actor 클래스를 상속 받았으므로 AItem이라는 이름으로 생성된다. 아래는 Actor가 아닌 다른 경우 어떤 접두사들을 붙여야 하는지에 대한 규칙이다.

접두사 설명
A Actor 계열
U Object 계열
F 일반 구조체
T 템플릿
E 열거형

 

CH3_UNREAL3DGAME_API

UCLASS()와 짝을 이루며, 엔진 리플렉션에 필요한 코드를 자동으로 생성해주는 매크로다.

 

Actor 라이프사이클 관련 함수

AItem()

생성자 함수다. Actor 객체가 메모리에 생성될 대 한 번 호출되는데 이는 월드에 배치되기 전 단계일 수도 있다.

 

virtual void BeginPlay() override;

액터가 월드에 완전히 배치된 뒤, 게임이 플레이(Play) 상태로 시작할 때 한 번 호출된다.

 

virtual void Tick(float DeltaTime) override;

매 프레임마다 자동으로 불린다. 주로 매 프레임 단위의 업데이트가 필요한 로직을 넣는다.

 


 

Actor 클래스의 구현 파일 구조

다음으로는 구현 파일인 cpp 파일을 한번 열어서 확인해보자.

// Fill out your copyright notice in the Description page of Project Settings.


#include "Item.h"

// Sets default values
AItem::AItem()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

}

// Called when the game starts or when spawned
void AItem::BeginPlay()
{
	Super::BeginPlay();
	
}

// Called every frame
void AItem::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}

 

상단 코드

#include "Item.h"

cpp 파일에서는 가장 먼저, 짝이 되는 헤더 파일을 포함해야 된다. 그렇지 않으면 언리얼의 자동 생성 매크로(리플렉션) 순서가 뒤섞여 에러가 날 수 있다.

 

Actor 라이프 사이클 관련 함수 구현부

생성자 AItem(), BeginPlay(), Tick(float DeltaTime) 함수들의 구현 로직을 자유롭게 추가할 수 있다.

 

AItem::AItem()
{
	PrimaryActorTick.bCanEverTick = true;
}

생성자 안에 들어있는 문장은 Tick 함수와 관련된  선언이다.

 

void AItem::BeginPlay()
{
	Super::BeginPlay();
}

void AItem::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
}

override 하는 함수들은 부모 클래스의 함수를 먼저 수행하고 있다.

 


 

배운 내용 정리

  • 헤더 파일(.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 CH3_UNREAL3DGAME_API AItem : public AActor // 클래스 이름이 A가 붙음(클래스 이름 앞에 접두어를 붙임), A인 경우 Actor 계열임을 의미, 모듈 밖으로도 내보내기 위한 매크로(필수)
{
	GENERATED_BODY() // : UCLASS와 같이 사용(리플렉션 시스템 관련)
	
public:	
	// Sets default values for this actor's properties
	AItem(); // : 생성자

protected:
	// Called when the game starts or when spawned
	// 액터가 가지고 있는 라이프 사이클 함수
	virtual void BeginPlay() override;
	virtual void Tick(float DeltaTime) override;

};
  • 구현 파일(.cpp)
// Fill out your copyright notice in the Description page of Project Settings.


#include "Item.h"

// Sets default values
AItem::AItem()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true; // : Tick 함수 관련 선언

}

// Called when the game starts or when spawned
void AItem::BeginPlay()
{
	Super::BeginPlay(); // : 부모 클래스의 BeginPlay를 부름
	
}

// Called every frame
void AItem::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}