Rider에서 Unreal 클래스를 생성하기 위해서는 원하는 디렉토리에서 우클릭한 후 **추가 > Unreal 클래스**를 선택하여 생성할 수 있다.

Unreal Editor에서 생성시키는 것과 마찬가지로, Rider에서도 Unreal 클래스 템플릿을 제공한다.

클래스 생성에서 루트 설정 시, 해당 접근에 맞게 **헤더 파일(.h)**이 Public 혹은 Private에 생성된다.

<aside> <img src="/icons/battery-charging_green.svg" alt="/icons/battery-charging_green.svg" width="40px" />
클래스 타입
| 구분 | 파일 위치 | 특징 |
|---|---|---|
| Public | .h: Public 폴더,.cpp: Private 폴더 |
프로젝트의 다른 모듈에서 쉽게#include할 수 있어 편리 |
| Private | .h,.cpp모두 Private 폴더 |
해당 모듈에서만 접근 가능, 특정 로직이나 구현을 캡슐화 |
<aside> <img src="/icons/battery-charging_green.svg" alt="/icons/battery-charging_green.svg" width="40px" />
Rider에서 클래스 생성을 할 경우, 다음과 같은 이점을 얻을 수 있다.
.cpp**의 .h 포함 주소가 부정확한 경우가 있는데, Rider에서 직접 생성할 경우, 이 문제를 간편하게 해결할 수 있다.
</aside>
UObject
UObject는 게임 내의 모든 객체들의 기반이 되는 클래스로서, 언리얼 엔진의 핵심적인 기능들을 상속받아 사용할 수 있게 해준다. 그러나, UObject 자체는 데이터 컨테이너 역할만 하며, 씬에 직접 배치할 수 없다.
UObject에서는 다음과 같은 기능을 제공하고 있다.
| 기능 | 설명 |
|---|---|
| 가비지 컬렉션 | 더 이상 사용되지 않는 객체를 자동으로 메모리에서 해제 |
| 레퍼런스 업데이트 | 객체 참조가 변경될 때 자동으로 관련 참조들을 업데이트 |
| 리플렉션 | 런타임에 객체의 속성과 메서드에 접근하고 조작할 수 있는 기능 |
| 직렬화 | 객체를 저장하거나 네트워크로 전송할 수 있는 형태로 변환 |
| 디폴트 프로퍼티 자동 업데이트 | 기본 속성값이 변경될 때 자동으로 인스턴스들에 반영 |
| 자동 프로퍼티 초기화 | 객체 생성 시 속성들을 자동으로 기본값으로 초기화 |
| 자동 에디터 통합 | 언리얼 에디터에서 자동으로 편집 가능한 인터페이스 제공 |
| 런타임 타입 정보 | 게임 실행 중에도 객체의 타입 정보를 확인하고 활용 가능 |
| 네트워크 리플리케이션 | 멀티플레이어 게임에서 객체 상태를 자동으로 동기화 |
AActor
AActor는 UObject를 상속받은 클래스로, 게임 월드에 실제로 배치될 수 있는 모든 객체의 기본이 되는 클래스이다.
게임 내에서 물리적으로 존재하는 모든 것들은 AActor를 상속받아 구현된다. AActor는 Transform(위치, 회전, 크기) 정보를 가지고 있으며, 컴포넌트를 통해 다양한 기능을 조합할 수 있다.
AActor에서는 다음과 같은 기능을 제공하고 있다.
| 기능 | 설명 |
|---|---|
| 컴포넌트 | 액터는 컴포넌트를 담는 컨테이너 역할을 하며, 이를 통해 이동과 렌더링을 제어 |
| 티킹 | 프레임마다 또는 사용자 정의 간격으로 업데이트되며, Tick() 함수를 통해 구현 |
| 리플리케이션 | 멀티플레이어 게임에서 액터의 상태와 함수 호출을 네트워크로 동기화 |
| 소멸 관리 | Destroy() 함수로 명시적 소멸이 가능하며, 가비지 컬렉션으로 정리 |
UObject vs AActor
| 특성 | UObject | AActor |
|---|---|---|
| 게임 월드 배치 | 불가능 | 가능 |
| Transform 정보 | 없음 | 위치, 회전, 크기 정보 보유 |
| 컴포넌트 | 컴포넌트를 가질 수 없음 | 다양한 컴포넌트 소유 가능 |
| Tick 함수 | 없음 | 매 프레임 자동 호출 |
| 주요 용도 | 데이터 컨테이너 | 게임 월드의 실제 객체 |
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Item.generated.h"
#pragma once
헤더 파일이 여러 번 포함되더라도, 컴파일 시 단 한 번만 처리하도록 해주는 지시어이다.
<aside> <img src="/icons/info-alternate_blue.svg" alt="/icons/info-alternate_blue.svg" width="40px" />
과거에는 #ifndef ~ #define ~ #endif 방식을 사용했지만, 대부분의 최신 C++ 프로젝트에서 #pragma once를 권장한다.
</aside>
#include "CoreMinimal.h"
언리얼 엔진에서 자주 사용하는 기본 타입(FString, TArray 등)과 매크로(UE_LOG 등), 각종 유틸 함수들이 정의되어 있다.
#include "GameFramework/Actor.h"
AActor를 상속받기 위해 필요한 헤더 파일이다.
#include "Item.generated.h"
언리얼 엔진의 리플렉션 시스템에서 필요한 코드를 자동 생성하기 위한 매크로이다.
UCLASS()
class SPARTAPROJECT_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;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
};
UCLASS()
클래스를 언리얼 엔진의 리플렉션 시스템에서 인식하도록 하는 매크로이다.
class SPARTAPROJECT_API AItem : public AActor
AItem
SPARTAPROJECT_API
GENERATED_BODY()
UCLASS()와 짝을 이루어, 엔진 리플렉션에 필요한 코드를 자동 생성해 주는 매크로이다.라이프 사이클 함수
BeginPlay()