안선생의 개발 블로그
[UE5] 언리얼 클래스 본문
언리얼 클래스
언리얼 엔진의 모든 게임플레이 클래스는 클래스 헤더 (.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
'언리얼 > 언리얼 C++' 카테고리의 다른 글
[UE5] 언리얼 라이브 코딩 (0) | 2023.10.31 |
---|---|
[UE5] 생성자, BeginPlay,Tick 알아보기 (1) | 2023.10.28 |
[UE5] C++ 클래스 생성하기 (0) | 2023.10.27 |
[UE5] UE_LOG 언리얼 엔진에서의 로깅 (0) | 2023.10.25 |
[UE5] UPROPERTY() 매크로 (0) | 2023.10.24 |