⊙ 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);
}
'Unreal Engine 5 > C++와 Unreal Engine으로 3D 게임 개발' 카테고리의 다른 글
Actor의 생명 주기(Life Cycle) (0) | 2025.01.22 |
---|---|
OutputLog에 로그 출력 (0) | 2025.01.22 |
프로젝트 이주(Migrate) 하기 (0) | 2025.01.21 |
기본 레벨 지정하기 (0) | 2025.01.21 |
C++ Actor 클래스 생성 및 삭제하기 (1) | 2025.01.21 |