안선생의 개발 블로그

[UE5] 언리얼 클래스 본문

언리얼/언리얼 C++

[UE5] 언리얼 클래스

안선생 2023. 10. 26. 11:16

언리얼 클래스

언리얼 엔진의 모든 게임플레이 클래스는 클래스 헤더 (.h) 파일과 클래스 소스 (.cpp) 파일로 이루어져 있습니다. 클래스 헤더에는 클래스와 그 멤버, 즉 변수와 함수에 대한 선언이 들어 있는 반면, 클래스 구현에는 해당 클래스에 속하는 함수 구현 (implement)을 통해 클래스의 함수성을 정의하는 곳입니다.

 

언리얼 엔진의 클래스에는 표준화된 작명 규칙이 있어, 클래스 이름 첫 글자, 다른말로 접두사만 봐도 클래스의 종류를 바로 알 수 있다.

A 스폰가능한 게임플레이 오브젝트의 베이스 클래스에서 확장됩니다. 이들은 Actor, 액터로 월드에 바로 스폰 가능합니다.
(APawn,ACharacter)등 Actor에서 파생됨
U 모든 게임플레이 오브젝트의 베이스 클래스에서 확장됩니다. 월드에는 바로 인스턴싱할 수 없으며, 액터에 속해야 합니다. 보통 Components 와 같은 오브젝트입니다. (UActorComponent),(uprimitivecomponent)등 UObject에서 파생됨

 

클래스 헤더

게임플레이 클래스에 대한 클래스 소스 파일은 표준 C++ 문법을 사용하며, 여기에 클래스, 변수, 함수 선언 과정을 단축하기 위한 전용 매크로도 같이 사용됩니다.

각 게임플레이 클래스 소스 파일 위에는, 클래스에 대해 (자동 생성되는) 제너레이티드 헤더 파일을 포함시켜 줘야 합니다 즉, ClassName.h 상단에, 다음과 같은 줄이 와야 합니다

#include "ClassName.generated.h"

주의 제네레이티드는 헤더 가장 아래에 있어야 된다 안그러면 오류나서 컴파이 안되니 조심하도록 하자

 

클래스 선언

 UCLASS(클래스 지정자[specifier, specifier, ...], [메타데이터meta(key=value, key=value, ...)])
    class ClassName : public ParentName
    {
        GENERATED_BODY()
    }

 클래스 지정자나 메타데이터 같은 지시어(descriptor)가 UCLASS 매크로에 전달됩니다.  또한, GENERATED_BODY() 매크로는 클래스 본문 제일 처음에 와야 합니다.

GENERATED_BODY() 매크로는 리플렉션된 클래스나 구조체에 필수적인데, 클래스 본문에 추가적인 함수나 typedef 를 주입하기 때문입니다.

 

클래스 지정자

클래스를 선언할 때, 선언부에 Class Specifier (클래스 지정자)를 붙이면 클래스가 엔진과 에디터의 다양한 부분과 어떻게 작동하는지를 제어할 수 있습니다.

Abstract Abstract (추상) 지정자는 클래스를 "추상 베이스 클래스" 로 선언하여, 사용자가 이 클래스 액터를 월드에 추가하지 못하도록 합니다. 그 자체로는 의미가 없는 클래스에 쓰기 좋습니다. 예를 들어 ATriggerBase 베이스 클래스는 추상형이라도 그 서브클래스 ATriggerBox 가 추상형이 아니라면 레벨에 배치할 수 있습니다.
AdvancedClassDisplay 이 클래스의 모든 프로퍼티가 디테일 패널의 고급 섹션 에만 표시되도록 합니다. 개별 프로퍼티에서 이 옵션을 덮어쓰려면, 해당 프로퍼티에 SimpleDisplay 지정자를 사용하면 됩니다.
AutoCollapseCategories=(Category1, Category2, ...) 이 지정자는 나열된 카테고리에 대해, 부모 클래스 상의 AutoExpandCategories 지정자 효과를 무효화시킵니다.
AutoExpandCategories=(Category1, Category2, ...) 이 클래스의 오브젝트에 대해서는 언리얼 에디터 프로퍼티 창에 자동 확장되도록 할 카테고리를 하나 이상 지정합니다. 카테고리 없이 선언된 변수를 자동 확장하려면, 변수를 선언한 클래스 이름을 사용하면 됩니다.
Blueprintable 이 클래스를 블루프린트 생성이 가능한 베이스 클래스로 노출시킵니다. 기본값은 다른 식으로 상속되지 않는 한 NotBlueprintable 입니다. 이 지정자는 서브클래스에 상속됩니다.
BlueprintType 이 클래스를 블루프린트에서 변수로 사용할 수 있는 유형으로 노출시킵니다.

메타데이터 지정자

메타데이터 지정자 사용법은 일반적인 클래스, 함수, 인터페이스 지정자와는 다릅니다.

BlueprintSpawnableComponent 존재하면, 블루프린트가 컴포넌트 클래스를 스폰시킬 수 있습니다.
BlueprintThreadSafe 블루프린트 함수 라이브러리에서만 유효합니다. 이 지정자는 이 클래스의 함수를 애니메이션 블루프린트의 비게임 스레드에서 호출가능한 것으로 마킹합니다.
ChildCannotTick 액터 및 컴포넌트 클래스에 사용됩니다. 네이티브 클래스가 틱을 할 수 없으면, 이 액터 또는 컴포넌트를 기반 블루프린트 생성 클래스도, 심지어 bCanBlueprintsTickByDefault 가 true 라도 절대 틱이 되지 않습니다.
ChildCanTick 액터 및 컴포넌트 클래스에 사용됩니다. 네이티브 클래스가 틱을 할 수 없으면, 이 액터 또는 컴포넌트를 기반 블루프린트 생성 클래스는, bCanBlueprintsTickByDefault 가 false 라 할지라도 bCanEverTick 옵션을 덮어쓰도록 할 수 있습니다.

더 많은 클래스 지정자와 메타데이터 지정자는 맨 아래 공식문서 사이트에서 확인할 수 있습니다.

 

클래스 구현

  • 모든 헤더 파일에는 필수 종속성이 포함된다.
  • 새로 추가한 클래스 헤더에는 항상 CoreMinimal.h가 포함되어야 합니다. 
  • generated.h 헤더는 가장 아래 있어야 합니다.
  • 모든 게임플레이 클래스는 GENERATED_BODY 매크로를 사용해야 제대로 구현됩니다. 
  • .cpp 파일은 자신과 일치하는 .h 파일을 먼저 포함한다.

언리얼 액터 클래스 생성시 

#pragma once

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

UCLASS()
class TISTORY_API AMyActor : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AMyActor();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

};

C++ 클래스 마법사 를 통해 새 클래스에 필요한 소스 파일과 헤더 파일이 구성되고, 그에 맞게 게임 모듈이 업데이트됩니다. 헤더 파일과 소스 파일은 클래스 정의와 클래스 생성자를 자동으로 포함할 뿐 아니라, UCLASS() 매크로같은 언리얼 엔진 전용 코드도 포함됩니다.

 

클래스 생성자

UObject 는 생성자 (constructor)를 사용하여 프로퍼티나 기타 변수에 대한 기본값 설정뿐 아니라, 기타 필수적인 초기화 작업도 합니다. 클래스 생성자는 보통 클래스 구현 파일 안에 위치합니다. 즉 AActor::AActor 생성자는 Actor.cpp 에 있습니다.

 

생성자 포맷

UMyObject::UMyObject()
{
    // 여기서 클래스 디폴트 오브젝트 프로퍼티를 초기화시킵니다.
        Weapon = CreateDefaultSubobject<USkeletalMeshComponent>("Weapon");
        Weapon->SetupAttachment(GetMesh(), FName("WeaponHandSocket"));
}

보통 초기화 작업을 많이 합니다.

 

 

여기까지 언리얼 C++ 클래스에 대해서 알아 보았습니다. 더많은 자료는 아래 공식 문서에서 확인 할 수 있습니다. 

 

 

감사합니다.

 

 

 

https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/GameplayArchitecture/Classes/

 

게임플레이 클래스

게임플레이 클래스 생성 및 구현을 위한 레퍼런스입니다.

docs.unrealengine.com