C++컴포넌트 추가와 Generated.h와 HUD, 한글 입력기 제거

DevBison·2025년 8월 14일

1) 새로운 C++ 클래스 생성


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


2) 상속받을 클래스 선택

  • 없음(None): 일반 C++ 클래스(언리얼 오브젝트 아님) 생성
    • UCLASS/UPROPERTY/UFUNCTION 같은 리플렉션 기능 사용 불가
    • 언리얼 가비지 컬렉션 대상이 아님 → 메모리 수동 관리
    • 에디터에 노출/월드 배치 불가
  • Actor/Pawn/Character 등: 언리얼 오브젝트(UObject 계열) 기반으로 생성

3) Public vs Private 폴더

  • Public: 이 모듈의 대외 인터페이스. 다른 모듈에서 #include 가능
  • Private: 이 모듈 내부 전용 구현
  • 관례: 헤더(외부 노출 필요)는 Public, 구현/내부 전용은 Private

4) 경로 지정


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


5) 라이브 코딩 창


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


6) 같은 폴더의 불필요 파일 정리


동일 폴더에 테스트용 Test 클래스가 있다면 삭제해 정리한다.


7) 코드 변경 사항 적용 방법

1) 라이브 코딩 사용: 창에서 컴파일 버튼을 누르거나 단축키 사용
2) 라이브 코딩 끄고 Hot Reload 사용

  • 기본 단축키: Ctrl + Alt + F11 (환경에 따라 Live Coding 트리거일 수 있음)

참고: Live Coding이 켜져 있으면 전통적 Hot Reload는 사용하지 않는다.


8) Hot Reload 단축키 누를 때 윈도우 확장 입력기(IME) 뜨는 문제

문제 현상


Ctrl + Alt + F11 입력 시 윈도우 확장입력기(IME Pad)가 뜨는 경우가 있다.

권장 대안 (시스템 파일 수정 전 권장)

  • 언리얼 단축키를 다른 키 조합으로 재설정
  • 윈도우 IME의 해당 단축키 비활성화(언어/입력기 고급 설정)
  • 키보드 매핑 툴(파워토이즈 등)로 충돌 회피

아래 방법은 시스템 파일 권한을 건드리는 고급 우회법으로, 신중하게 수행해야 한다.


9) 확장 입력기(IME) 우회 적용 절차 (고급)

1단계: 작업 관리자에서 파일 위치 열기


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


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

2단계: 소유자 변경


소유자 TrustedInstaller를 변경한다.


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


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


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

3단계: 권한 부여


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


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

4단계: IME 파일 이동(비활성화)


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


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

5단계: 정상 동작 확인 후 권한 원복


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


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


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


소유자 변경 버튼 선택.


소유자를 NT Service\TrustedInstaller로 되돌린 뒤 적용.

주의: 시스템 파일/권한 조작은 윈도우 업데이트나 다른 앱 동작에 영향을 줄 수 있다. 반드시 백업을 유지하고, 문제 발생 시 즉시 원복한다.


10) C++로 행성 만들기 흐름


프로젝트에 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) 등의 지정자를 붙이면 에디터에 노출된다.


세부 패널에서 확인 가능. 이것이 언리얼 리플렉션의 결과다.


11) 최소 예제 코드 (APawn 기반, 컴포넌트 생성·노출)

// 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);
}

  • 에디터에서 메시/머티리얼을 바꾸고 싶다면 PlanetMeshVisibleAnywhere로 두고 콘텐츠 브라우저에서 할당한다.
  • 코드에서 기본 메시를 지정하려면 ConstructorHelpers::FObjectFinder 또는 SetStaticMesh 사용.

12) UPROPERTY 자주 쓰는 지정자 요약

  • VisibleAnywhere: 에디터에 표시만, 수정은 블루프린트 에셋에서
  • EditAnywhere: 에디터에서 수정 가능
  • EditDefaultsOnly: 블루프린트 Default에서만 수정
  • EditInstanceOnly: 플레이스된 인스턴스에서만 수정
  • BlueprintReadOnly / BlueprintReadWrite: 블루프린트 접근 제어

문서: https://dev.epicgames.com/documentation/ko-kr/unreal-engine/property-specifiers?application_version=4.27


13) 자주 나는 실수 정리

  • generated.h 위치: 다른 #include 뒤에, 헤더의 마지막에 둔다.
  • 컴포넌트 미생성: CreateDefaultSubobject로 만들고 루트에 Attach/RootComponent 설정 필요.
  • 문자열: 항상 TEXT() 매크로로 감싸 유니코드 대응.
  • Live Coding vs Hot Reload: 동시에 쓰지 않는다. 문제 시 하나만 사용.
profile
응애 개발자

0개의 댓글