
에디터 상단 메뉴에서 툴 > 새로운 C++ 클래스를 선택해 클래스를 만든다.


#include 가능
현재 프로젝트 내 생성 경로를 선택한다.

새 클래스를 만들면 Live Coding 창이 뜬다. 켜두면 코드 변경을 빠르게 반영할 수 있다.

동일 폴더에 테스트용 Test 클래스가 있다면 삭제해 정리한다.
1) 라이브 코딩 사용: 창에서 컴파일 버튼을 누르거나 단축키 사용
2) 라이브 코딩 끄고 Hot Reload 사용
Ctrl + Alt + F11 (환경에 따라 Live Coding 트리거일 수 있음)참고: Live Coding이 켜져 있으면 전통적 Hot Reload는 사용하지 않는다.

Ctrl + Alt + F11 입력 시 윈도우 확장입력기(IME Pad)가 뜨는 경우가 있다.
아래 방법은 시스템 파일 권한을 건드리는 고급 우회법으로, 신중하게 수행해야 한다.

작업 관리자에서 IMEPADSV.EXE를 찾고, 우클릭 → 파일 위치 열기.

열린 IME 폴더에서 SHARED 파일 속성 → 보안 → 고급으로 이동.

소유자 TrustedInstaller를 변경한다.

새 소유자에 현재 윈도우 사용자 계정명을 입력.

이름 확인으로 올바른지 검증.

하단의 ‘하위 컨테이너와 개체의 소유자 바꾸기’를 체크하고 적용.

보안 탭에서 ‘추가’ → ‘보안 주체 선택’ → 사용자 계정 입력 → 이름 확인.

권한을 ‘모든 권한’으로 설정 후 적용.

IME 폴더 안에 백업 폴더를 만든다.

문제 유발 파일을 ‘복사’가 아닌 ‘잘라내기’로 백업 폴더에 이동한다.
(이동해야 IME Pad가 더 이상 뜨지 않는다)

문제가 사라졌다면, 변경했던 권한을 다시 원상복구한다.

보안 → 고급 설정으로 이동.

추가해둔 사용자 권한을 제거.

소유자 변경 버튼 선택.

소유자를 NT Service\TrustedInstaller로 되돌린 뒤 적용.
주의: 시스템 파일/권한 조작은 윈도우 업데이트나 다른 앱 동작에 영향을 줄 수 있다. 반드시 백업을 유지하고, 문제 발생 시 즉시 원복한다.

프로젝트에 C++ 클래스를 추가해 작업을 시작한다.

헤더의 선언과 CPP의 구현이 자동 생성된다.
Super는 부모 클래스를 의미(여기서는 APawn).
PrimaryActorTick.bCanEverTick = true;면 Tick() 콜백이 매 프레임 호출된다.

프로젝트에 생성된 클래스들이 이렇게 구성된다.

보라색으로 표시된 것은 매크로.
UHT(언리얼 헤더 툴)가 코드를 생성하며 YourClass.generated.h 파일이 사용된다.

생성된 헤더는 Intermediate/Build/.../UHT 경로에 위치한다.
중요: YourClass.generated.h는 헤더 파일에서 항상 마지막 include여야 한다.
다른 #include 들은 그 위쪽(앞)에 위치해야 오류가 나지 않는다.

헤더에서 변수 선언만 한 상태.

CPP에서 실제 객체를 생성/초기화하면 비로소 동작한다.

문자열은 TEXT("...") 매크로를 사용해 유니코드 대응.

변수의 구현/초기화 예시.

컴파일했는데 RootComponent만 보인다면, 컴포넌트를 생성/부착하지 않았을 가능성이 높다.

일반 멤버 변수는 에디터에 표시되지 않는다. 에디터/블루프린트 노출엔 리플렉션이 필요하다.

UPROPERTY(VisibleAnywhere) 등의 지정자를 붙이면 에디터에 노출된다.

세부 패널에서 확인 가능. 이것이 언리얼 리플렉션의 결과다.
// PlanetPawn.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Pawn.h"
#include "PlanetPawn.generated.h"
UCLASS()
class YOURMODULE_API APlanetPawn : public APawn
{
GENERATED_BODY()
public:
APlanetPawn();
protected:
virtual void BeginPlay() override;
public:
virtual void Tick(float DeltaTime) override;
// 에디터에 항상 보이게
UPROPERTY(VisibleAnywhere, Category="Planet")
UStaticMeshComponent* PlanetMesh;
// 에디터에서 수정도 가능
UPROPERTY(EditAnywhere, Category="Planet")
float RotationSpeed = 10.f;
};
// PlanetPawn.cpp
#include "PlanetPawn.h"
#include "Components/StaticMeshComponent.h"
APlanetPawn::APlanetPawn()
{
PrimaryActorTick.bCanEverTick = true;
// 루트 및 메쉬 컴포넌트 생성/부착
PlanetMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("PlanetMesh"));
RootComponent = PlanetMesh;
}
void APlanetPawn::BeginPlay()
{
Super::BeginPlay();
}
void APlanetPawn::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
// 간단한 자전
FRotator R(0.f, RotationSpeed * DeltaTime, 0.f);
AddActorLocalRotation(R);
}
팁
PlanetMesh를 VisibleAnywhere로 두고 콘텐츠 브라우저에서 할당한다.ConstructorHelpers::FObjectFinder 또는 SetStaticMesh 사용.#include 뒤에, 헤더의 마지막에 둔다.CreateDefaultSubobject로 만들고 루트에 Attach/RootComponent 설정 필요.TEXT() 매크로로 감싸 유니코드 대응.