상세 컨텐츠

본문 제목

Unreal C++ 기초 2. Migrate, 클래스 생성 및 삭제

Unreal C++

by hyunjunstar 2026. 4. 6. 21:09

본문

1. 새로운 C++ 클래스 생성해보기

Toolbar > Tools > New C++ Class... 클릭(부모 클래스 지정) >

Name 작성, Path 설정 후 Create class 클릭(클래스 생성)

 

None - Native C++ 클래스 

나머지 - Unreal Object 클래스

아래와 같은 화면이 나오면 Reload All 클릭, Yes 클릭

★중요 코드★

UObject 클래스를 상속 받은 클래스

UObject 클래스는 레벨에 배치 불가능(내부 오브젝트)

None으로 만들었을때 Native C++로 생성 된 클래스를 Unreal Object 클래스로 수정한 코드

// SXUnrealObject.h

#pragma once

#include "CoreMinimal.h"
#include "UObject\Object.h"
#include "SXUnrealObject.generated.h"


/** 
 * 
 */
UCLASS()
class UNREALWORK_API USXUnrealObject : public UObject
{
	GENERATED_BODY()

};

// SXUnrealObject.cpp


#include "SXUnrealObject.h"

#pragma once

 - 전처리기 지시문 헤더파일 순환참조 방지

#include "CoreMinimal.h"

 - 최소 헤더파일만 참조하고 내가 쓸 헤더파일은 알아서 인클루드
#include "UObject\Object.h"

 - 부모 클래스의 헤더 파일 참조, 지금은 UObject 클래스를 상속 받고 있음
#include "SXUnrealObject.generated.h"

 - 언리얼 헤더 툴, 모든 헤더 파일을 인클루드 한 뒤에 이 파일을 인클루드 해야함

UCLASS()

 - 언리얼 클래스 선언 전에 작성하는 매크로 구조체나 열거체 전에도 U가 붙는다

(USTRUCT(), UENUM())

class UNREALWORK_API USXUnrealObject : public UObject

 - UNREALWORK_API 키워드가 없으면 다른 모듈에서 해당 클래스에 접근할 수 없음

 - USXUnrealObject 상속받는 클래스마다 앞에 접두사가 다름 

UObject 계열 U 
UObject, UUserWidget 등

Actor A 
AActor, ACharacter 등

Interface I
IInteractable

Template T
TArray, TMap 등

Struct F 
FVector, FString 등

 - UObject 클래스를 상속 받아야 언리얼 오브젝트 기능들이 지원됨 

ex) 가비지 컬렉션, 리플렉션, 레플리케이션 등

GENERATED_BODY()

 - RTTI, Reflection 같은 기능들이 동작하기 위해 필요한 매크로임

이 외에도 UFUNCTION(), UPROPERTY() 같은 언리얼 매크로들이 있음

★중요 코드★

AActor 클래스를 상속 받은 SXTorch 클래스

// SXTorch.h

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "SXTorch.generated.h"

UCLASS()
class SHOOTERX_API ASXTorch : public AActor
{
	GENERATED_BODY()

public:
	ASXTorch();

	virtual void BeginPlay() override;
		// 게임의 시작.

	virtual void Tick(float DeltaSeconds) override;
		// 게임의 중간.

	virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
		// 게임의 끝.

};

액터가 레벨에 배치되면 자동으로 호출 되는 세가지 이벤트 함수

virtual void BeginPlay() override;

 - 게임의 시작.

virtual void Tick(float DeltaSeconds) override;

 - 게임의 중간.

virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; 

 - 게임의 끝

// SXTorch.cpp


#include "SXTorch.h"

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

void ASXTorch::BeginPlay()
{
	Super::BeginPlay();

	UE_LOG(LogTemp, Log, TEXT("BeginPlay() has been called."));
}

void ASXTorch::Tick(float DeltaSeconds)
{
	Super::Tick(DeltaSeconds);

	static bool bOnce = false;
	if (bOnce == false)
	{
		UE_LOG(LogTemp, Log, TEXT("Tick(float DeltaSeconds) has been called."));
		bOnce = true;
	}
}

void ASXTorch::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
	Super::EndPlay(EndPlayReason);

	UE_LOG(LogTemp, Log, TEXT("EndPlay(const EEndPlayReason::Type EndPlayReason) has been called."));
}

이벤트 함수 및 UE_LOG

PrimaryActorTick.bCanEverTick = true; 

 - true일 경우 해당 액터는 Tick 함수를 실해ㅇ 가능, false일 경우 Tick 실행 안함

Super::이벤트함수;

 - Super는 부모 클래스 ASXTorch 클래스의 부모 클래스는 AActor임 

 - Super:: == AActor:: 같은 의미

 - 부모클래스의 이벤트 함수를 먼저 호출해서,

언리어ㄹ 엔지니어가 작성해둔 로직이 먼저 수행될 수 있게 함

UE_LOG(로그 카테고리, 로그 수준, 형식문자열, 인자)

 - UE_LOG(LogTemp, Log, TEXT("BeginPlay() has been called."));

                // 로그카테고리, 로그 수준, 형식문자열, 인자

 - 로그 카테고리 : Toolbar > Window > Output Log 클릭해서 창 열어주고

게임 플레이 후 Output Log 창에서

Filters > Categorties > Show all 체크 해제 후 LogTemp만 체크 및 검색창에 LogTemp 검색

 - 로그 수준 : Log = 흰색, Warning = 노란색, Error = 빨간색

 - 형식문자열 : TEXT() 출력할 문자열 C언어의 printf() 함수의 인자 중 형식 문자열과 유사함

 - 인자 : 형식문자열에 출력할 값

// static은 함수가 끝나도 값 유지, 처음 한번만 false로 초기화
static bool bOnce = false;

// b0nce = 변수명, 아직 한번도 실행이 안됐으면
if (bOnce == false) {

// 로그 출력 하고
UE_LOG(LogTemp, Log, TEXT("Tick(float DeltaSeconds) has been called."));

// 이제 실행 했으니까 true로 바꿔서 이제 로그 출력 안되게 함, Tick은 계속 실행
bOnce = true;

}

2. C++ 클래스 삭제

언리얼 에디터 종료 > Visual Studio에서 .h 파일과 .cpp 파일 리무브로 삭제 > 프로젝트 폴더 > 소스코드 폴더에서 .h 파일과 .cpp 파일 삭제 > Visual Studio에서 빌드 및 실행

3. Migrate

Migrate는 프로젝트에 있는 애셋(리소스)를 다른 프로젝트로 그대로 옮기는 것

Content 폴더 안에 있는 파일들을 전부 옮길 수 있다.

일반 복사가 아닌 경로 및 참조가 유지되며 의존성까지 같이 옮겨준다.

Content Browser에서 옮길 폴더나 파일 우클릭 > 옮길 에셋 선택 > OK 클릭 >

전송받을 프로젝트의 Content 폴더를 선택(경로 Project/Content) > 전송받은 프로젝트의 Content 폴더 내용 확인

관련글 더보기