언리얼 엔진은 프로그래머, 이자이너, 아티스트가 Workflow를 가속화하기 위한 다수의 툴 세트를 제공한다. (수정 및 설정 가능)
C++에서 새 게임플레이 클래스를 생성하면, VS또는 XCODE로 컴파일한 후 모든 변경사항이 언리얼 에디터에 반영된다. 언리얼 엔진에서 클래스를 생성하는 것은 표준 C++ 클래스, 함수, 변수를 생성하는 것과 유사하다.
에디터 함수기능을 제공하는 메타데이터 프로퍼티 지정자 매크로를 통해 클래스를 캡슐화하는 언리얼 리플렉션 시스템을 사용한다
언리얼 엔진의 컨테이너는 클래스 및 데이터 구조체 컬렉션에 정보를 제공한다.
#include "CoreMinimal.h : 기본적으로 엔진의 기초 기능을 담고 있는 헤더
#include "GameFramework/Charactor.h" : 기본적으로 캐릭터의 기초 기능을 담고 있는 헤더
#include "Logging / LogMacros.h" : 기본적으로 로그를 남기는 기능을 담고있는 헤더
#include "Gam1Character.generated.h" GENERATED_BODY( )를 쓰기 위한 헤더로 헤더 선언에서 가장 마지막으로 위치해야만 제대로 포함된다.
여기서 잠깐 GENERATED_BODY()를 짚고 넘어가자면
클래스의 정보를 언리얼로 인식시켜주는 중요한 역할을 한다.
Reflection System과 관련된 매크로 중 하나로 C++에서 Unreal Engine의 객체 시스템과 통합하기 위해 사용된다.
더 정확하게, 이 매크로는 클래스의 선언부에 추가되며, 해당 클래스가 UCLASS, USTRUCT, UENUM 등과 같은 Unreal Engine의 Reflection System에서 작동하도록 만든다.
언리얼에서 리플렉션 시스템(Reflection System)은 코드에서 객체와 그 속성에 대한 정보를 동적으로 조회할 수 있는 매커니즘을 제공한다. 이를 통해 코드의 일부를 변경하지 않고도 객체의 타입, 클래스 멤버(속성, 메소드 등), 객체 간의 관계 등을 조회하고 조작할 수 있다. 리플렉션 시스템은 특히 에디터에서의 동적 프로퍼티 조작, 블루프린트와의 상호작용, 디버깅 및 직렬화에서 유용하다.
UCLASS, UPROPERTY, UFUNCTION : 리플렉션 시스템은 주로 이 매크로들을 통해 활성화 된다. 각 매크로는 클래스, 속성, 메서드가 리플렉션 시스템에서 인식되도록 해준다.
UCLASS : 클래스를 리플렉션 시스템에 등록하는데 사용한다.UPROPERTY : 클래스의 멤버변수를 리플렉션에 포함시켜 에디터에서 수정 가능하도록 한다.UFUNCTION : 클래스의 메소드를 리플렉션 시스템에 등록하여 호출가능하게 만든다.TArray, TMap, TSet : 이러한 컨테이너 타입들도 리플렉션을 지원하여 직렬화 및 동적속성 변경이 가능해진다.
Reflection 과 Metadata : 리플렉션은 메타데이터를 통해 클래스, 속성 및 함수의 정보에 접근할 수 있도록 해준다. 이를 통해 클래스가 갖는 변수나 함수에 대한 정보뿐만 아니라, 변수의 범위나 기본값 같은 속성도 알 수 있다.
동적 바인딩 : 리플렉션을 통해 객체의 타입을 동적으로 확인하고, 이를 바탕으로 실행 중에 메소드를 호출하거나 속성에 접근하는 것이 가능하다.
UCLASS()
class MYGAME_API AMyActor : public AActor
{
GENERATED_BODY()
public:
AMyActor();
// 속성의 리플렉션 예시
UPROPERTY ( EditAnywhere, BlueprintReadWrite, Category = "Stats")
int32 Health;
// 함수의 리플렉션 예시
UFUNCTION ( BlueprintCallable, Category = "Action"
void Heal(int32 Amount);
};
void AMyActor::Heal(int32 Amount) {
Health += Amount
이 코드에서 AMyActor 클래스는 UCLASS 매크로로 리플렉션 시스템에 등록된다. 또한, Health 변수는 UPROPERTY 매크로로 표시되어 에디터나 블루프린터에서 조작할 수 있게 된다. Heal 함수는 UFUNCTION 매크로를 사용하여 블루프린트에서 호출할 수 있게 된다.
거의 C++과 비슷하지만 언리얼에서는 int 자료형을 길이가 고정되어 있는 것을 제공한다.
int8, int16, int32, int64 : int 뒤의 숫자는 자료형이 사용하는 비트 개수이다.
문자열은 FString 을 쓴다. FString s = TEXT(" ")
이외에도 FVector, FHitResult 등이 있지만 언리얼의 접두사에 대해서는 양이 방대해서 다음에 따로 다루겠음.
UPROPERTY()는 변수마다 앞에 붙여줘야 하며 주로 선언부(.h파일)에서 쓰인다. UPROPERTY()는 언리얼 엔진에 이러한 변수가 있음을 알리고 연결되었을 때 어떻게 작동할지 지정하기 위해 사용된다.
그러나 UPROPERTY(" ") 매크로가 비어있는 상태에서는 언리얼 엔진에서는 UPROPERTY를 찾지 못한다. 보이게 하기 위해선 매크로에 필요한 지정자를 넣어줘야 한다.
많은 지정자가 있지만 가장 기본이 되는 것 부터 알아보면 EditAnywhere, EditDefaultOnly, BlueprintReadWrite, Category = " ", Transient 등이 있다.
// 변수 선언의 정석, 괄호 안에 지정자의 개수는 상관 없다.
UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Transient, Category = "Damage")
float DamagePerSecond;

생성자를 이용하여 초기값 설정

UPROPERTY 지정자에 의해 언리얼에서 표시되는 부분

선언부의 초기값으로 설정되어 있는 모습