Toolbar > Tools > New C++ Class... 클릭(부모 클래스 지정) >
Name 작성, Path 설정 후 Create class 클릭(클래스 생성)
None - Native C++ 클래스
나머지 - Unreal Object 클래스
아래와 같은 화면이 나오면 Reload All 클릭, Yes 클릭


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() 같은 언리얼 매크로들이 있음
// 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."));
}
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;
}
언리얼 에디터 종료 > Visual Studio에서 .h 파일과 .cpp 파일 리무브로 삭제 > 프로젝트 폴더 > 소스코드 폴더에서 .h 파일과 .cpp 파일 삭제 > Visual Studio에서 빌드 및 실행
Migrate는 프로젝트에 있는 애셋(리소스)를 다른 프로젝트로 그대로 옮기는 것
Content 폴더 안에 있는 파일들을 전부 옮길 수 있다.
일반 복사가 아닌 경로 및 참조가 유지되며 의존성까지 같이 옮겨준다.
Content Browser에서 옮길 폴더나 파일 우클릭 > 옮길 에셋 선택 > OK 클릭 >
전송받을 프로젝트의 Content 폴더를 선택(경로 Project/Content) > 전송받은 프로젝트의 Content 폴더 내용 확인
| 리플렉션을 활용한 회전발판과 움직이는 장애물 만들기 (1) | 2026.04.08 |
|---|---|
| Unreal C++ 기초 4. 로그, 리플렉션, 함수, 리플렉션 (0) | 2026.04.07 |
| Unreal C++ 기초 3. 컴포넌트 멤버 변수 추가 및 메시, 머티리얼 할당 (1) | 2026.04.06 |
| Unreal C++ 기초 1. 설치 및 실행 (0) | 2026.04.05 |
| 언리얼 C++로 Actor의 좌표 이동 및 회전 프로그램 구현 (0) | 2026.03.25 |