언리얼 C++ 프로그래밍

[언리얼 C++] 게임플레이 클래스 생성

언린이 2021. 7. 24. 11:26

언리얼 엔진의 모든 게임플레이 클래스는 클래스 헤더(.h) 파일과 클래스 소스(.cpp) 파일로 이루어져 있습니다.

클래스 헤더에는 클래스와 그 멤버, 즉 변수와 함수에 대한 선언이 들어 있으며, 클래스 소스에는 함수의 구현을 통한 정의가 들어있습니다.

 

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

 

접두사 의미
A 스폰 가능한 게임플레이 오브젝트의 베이스 클래스에서 확장됩니다.
이들은 Actor로 월드에 바로 스폰 가능합니다.
U 모든 게임플레이 오브젝트의 베이스 클래스에서 확장됩니다.
월드에는 바로 인스턴싱할 수 없으며, Actor에 속해야 합니다.
보통 Components와 같은 오브젝트입니다.

위 표는 게임플레이 클래스의 접두사에 대한 설명입니다.

 

 

1. 클래스 추가하기

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

 

 

2. 클래스 헤더

언리얼 엔진의 게임플레이 클래스에는 일반적으로 별도의 고유 클래스 헤더 파일이 존재합니다. 이 파일 이름은 보통 그 안에 정의되는 클래스 이름에서 접두사 A 또는 U를 뺀 것과 일치해야 하며, 확장자는 .h를 사용합니다. 즉, AActor 클래스에 대한 클래스 헤더 파일은 Actor.h입니다. 에픽 코드가 이러한 지침을 따르기는 하지만, 현재 엔진에 클래스 이름과 헤더 파일 이름 사이의 공식적인 관계가 존재하지는 않습니다.

 

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

 

#include "ClassName.generated.h"

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

 

 

3. 클래스 선언

클래스 선언에는 클래스의 이름, 어떤 클래스로부터 상속받았는지와, 그에 따라 상속된 함수와 변수를 선언합니다. 또한, 별도로 필요할 수도 있는 엔진 및 에디터 전용 기능은 클래스 지정자와 메타데이터를 통해 정의하기도 합니다.

 

UCLASS([specifier, specifier, ...], [meta(key=value, key=value, ...)])
class ClassName : public ParentName
{
    GENERATED_BODY()
}

클래스 선언 문법은 위 예제 코드와 같습니다.

선언은 클래스에 대한 표준 C++ 클래스 선언으로 이루어집니다. 표준 선언 말고도 클래스 지정자나 메타데이터와 같은 지시어가 UCLASS() 매크로에 전달됩니다. UCLASS() 매크로는 선언중인 클래스에 대한 UClass를 생성하는데 사용되며, 이는 클래스에 대한 엔진의 특수한 표현으로 생각해 볼 수 있습니다.

또한, GENERATED_BODY() 매크로는 클래스 본문 제일 처음에 와야합니다.

 

 

4. 클래스 지정자

클래스를 선언할때, 선언부의 UCLASS() 매크로에 클래스 지정자를 추가하면 클래스가 엔진과 에디터의 다양한 부분에서 어떤식으로 동작할지를 제어할 수 있습니다.

 

클래스 지정자 효과
Abstract Abstract (추상) 지정자는 클래스를 "추상 베이스 클래스" 로 선언하여, 사용자가 이 클래스 액터를 월드에 추가하지 못하도록 합니다. 그 자체로는 의미가 없는 클래스에 쓰기 좋습니다. 예를 들어 ATriggerBase 베이스 클래스는 추상형이라도 그 서브클래스 ATriggerBox 가 추상형이 아니라면 레벨에 배치할 수 있습니다.
Blueprintable 이 클래스를 블루프린트 생성이 가능한 베이스 클래스로 노출시킵니다. 기본값은 다른 식으로 상속되지 않는 한 NotBlueprintable 입니다. 이 지정자는 서브클래스에 상속됩니다.
BlueprintType 이 클래스를 블루프린트에서 변수로 사용할 수 있는 유형으로 노출시킵니다.
Config=ConfigName 이 클래스는 환경설정 (.ini) 파일에 데이터를 저장할 수 있음을 나타냅니다. config 또는 globalconfig 지정자로 선언된 클래스 프로퍼티가 있는 경우, 이 지정자는 그 프로퍼티를 해당 이름의 환경설정 파일에 저장하도록 합니다. 이 지정자는 모든 자식 클래스에 전파되며 무효화시킬 수 없으나, 자식 클래스에서는 환경설정 파일을 바꿀 수는 있습니다. config 지정자에 다른 ConfigName 으로 다시 선언해주면 됩니다. 일반적인 ConfigName 값은 "Engine", "Editor", "Input", "Game" 입니다.

위 표는 대표적으로 많이 사용되는 클래스 지정자의 효과에 대한 설명입니다.

 

 

5. 메타데이터 지정자

클래스 지정자와 마찬가지로 메타데이터 지정자를 통해 동작을 제어할 수 있습니다.

 

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

위 표는 일반적인 메타데이터 지정자의 효과에 대한 설명입니다.

 

 

더 많은 클래스 지정자와 메타데이터 지정자에 대한 정보를 얻고 싶다면 클래스 지정자 | 언리얼 엔진 문서 (unrealengine.com) 글을 참고하시기 바랍니다.