icon안동민 개발노트

C++ 클래스 추가하기


 이 절에서는 언리얼 엔진에서 C++ 프로젝트를 생성하고 새로운 C++ 클래스를 추가하는 전체 과정을 단계별로 살펴보겠습니다.

C++ 프로젝트 생성

 1. 언리얼 엔진 런처를 실행합니다.

 2. "새 프로젝트 만들기" 버튼을 클릭합니다.

 3. 프로젝트 유형으로 "C++"를 선택합니다.

 4. 템플릿을 선택합니다. (예 : Blank, First Person, Third Person 등)

 5. 프로젝트 설정을 구성합니다.

  • 프로젝트 이름 입력
  • 저장 위치 선택
  • 시작 콘텐츠 포함 여부 선택
  • 대상 플랫폼 및 그래픽 품질 선택

 6. "프로젝트 생성" 버튼을 클릭합니다.

 프로젝트 생성이 완료되면 언리얼 에디터와 Visual Studio(또는 선택한 IDE)가 자동으로 열립니다.

C++ 클래스 추가하기

  1. 언리얼 에디터에서 "파일" > "새 C++ 클래스" 메뉴를 선택합니다.
  2. 부모 클래스를 선택합니다. (예 : Actor, Pawn, Character 등)
  3. 새 클래스의 이름을 입력합니다. (예 : MyCharacter)
  4. 클래스 파일이 저장될 위치를 확인하고 "클래스 생성" 버튼을 클릭합니다.

 Visual Studio에서 새로 생성된 클래스 파일이 자동으로 열립니다.

생성된 C++ 클래스 기본 구조

 새로 생성된 C++ 클래스의 기본 구조는 다음과 같습니다.

// MyCharacter.h
##pragma once
 
##include "CoreMinimal.h"
##include "GameFramework/Character.h"
##include "MyCharacter.generated.h"
 
UCLASS()
class MYPROJECT_API AMyCharacter : public ACharacter
{
    GENERATED_BODY()
 
public:
    AMyCharacter();
 
protected:
    virtual void BeginPlay() override;
 
public:    
    virtual void Tick(float DeltaTime) override;
 
    virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
};
 
// MyCharacter.cpp
##include "MyCharacter.h"
 
AMyCharacter::AMyCharacter()
{
    PrimaryActorTick.bCanEverTick = true;
}
 
void AMyCharacter::BeginPlay()
{
    Super::BeginPlay();
}
 
void AMyCharacter::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
}
 
void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
    Super::SetupPlayerInputComponent(PlayerInputComponent);
}

클래스 컴파일 및 에디터 반영

  1. Visual Studio에서 코드를 수정한 후 저장합니다.
  2. Visual Studio에서 "빌드" > "솔루션 빌드" 메뉴를 선택하거나 F7 키를 눌러 프로젝트를 컴파일합니다.
  3. 컴파일이 완료되면 언리얼 에디터로 돌아갑니다.
  4. 언리얼 에디터에서 "파일" > "C++ 클래스 다시 로드" 메뉴를 선택하거나 Ctrl+Alt+F11 키를 눌러 변경사항을 반영합니다.

일반적인 문제와 해결 방법

 1. 컴파일 오류

  • 문제 : 구문 오류, 누락된 포함 파일 등
  • 해결 : 오류 메시지를 주의 깊게 읽고 코드를 수정합니다. 필요한 헤더 파일을 포함했는지 확인합니다.

 2. 링크 오류

  • 문제 : 함수 정의 누락, 라이브러리 연결 문제 등
  • 해결 : 모든 함수가 올바르게 정의되었는지 확인합니다. 프로젝트 설정에서 필요한 모듈이 포함되어 있는지 확인합니다.

 3. 핫 리로드 실패

  • 문제 : 에디터에서 변경사항이 반영되지 않음
  • 해결 : 에디터를 닫고 다시 열어봅니다. 변경사항이 너무 큰 경우 전체 재컴파일이 필요할 수 있습니다.

C++ 클래스와 블루프린트 연동

  1. C++ 클래스를 블루프린트에서 상속받을 수 있게 만들기
UCLASS(Blueprintable)
class MYPROJECT_API AMyCharacter : public ACharacter
  1. 블루프린트에서 접근 가능한 속성 만들기
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "My Character")
float Health;
  1. 블루프린트에서 호출 가능한 함수 만들기
UFUNCTION(BlueprintCallable, Category = "My Character")
void Attack();

에디터에서 C++ 클래스 사용하기

  1. 콘텐츠 브라우저에서 "C++ 클래스" 필터를 선택합니다.
  2. 생성한 C++ 클래스를 찾아 월드에 드래그 앤 드롭하거나, 블루프린트의 부모 클래스로 선택합니다.
  3. 클래스의 인스턴스를 선택하고 디테일 패널에서 노출된 속성을 편집합니다.

효율적인 C++ 클래스 구조 설계 팁

  1. 단일 책임 원칙을 따릅니다. 각 클래스는 하나의 주요 기능에 집중해야 합니다.
  2. 상속보다 구성을 선호합니다. 필요한 경우 컴포넌트를 사용하여 기능을 확장합니다.
  3. 인터페이스를 활용합니다. 공통 기능을 위해 UInterface를 사용합니다.
  4. 캡슐화를 유지합니다. 가능한 한 멤버 변수를 private으로 유지하고, 필요한 경우에만 public getter/setter를 제공합니다.
  5. 명확한 명명 규칙을 사용합니다. 언리얼 엔진의 명명 규칙을 따릅니다. (예 : 클래스 이름에 적절한 접두사 사용)

 예시

UCLASS(Blueprintable)
class MYPROJECT_API AMyCharacter : public ACharacter
{
    GENERATED_BODY()
 
public:
    AMyCharacter();
 
    UFUNCTION(BlueprintCallable, Category = "Combat")
    void Attack();
 
    UFUNCTION(BlueprintPure, Category = "Stats")
    float GetHealth() const { return Health; }
 
protected:
    virtual void BeginPlay() override;
 
private:
    UPROPERTY(EditAnywhere, Category = "Stats", meta = (AllowPrivateAccess = "true"))
    float Health;
 
    UPROPERTY(VisibleAnywhere, Category = "Components", meta = (AllowPrivateAccess = "true"))
    UStaticMeshComponent* WeaponMesh;
 
    void InitializeWeapon();
};

 이 예시에서는 캡슐화, 명확한 명명, 그리고 컴포넌트 사용을 보여줍니다.

 Health는 private이지만 에디터에서 편집 가능하며, getter 함수를 통해 안전하게 접근할 수 있습니다.

 WeaponMesh 컴포넌트는 구성을 통해 기능을 확장하는 방법을 보여줍니다.

 C++ 클래스를 언리얼 엔진 프로젝트에 추가하는 과정은 초기에는 복잡해 보일 수 있지만, 이 과정을 마스터하면 강력하고 유연한 게임 시스템을 구축할 수 있습니다