Cpp 변수 및 클래스 타입 정보등의 메타데이터를 에디터나 블루프린트에서 활용할 수 있게 하는 기술이다. 클래스 정보와 변수 정보의 타입을 재구성해서 에디터에 전달하는 과정이다 보니 Unreal에서 제공하는 매크로이용이 필수적으로 강제된다.
BP와 상호적으로 이용할 수 있는 기능들이 제공된다.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Item.generated.h" // 반드시 마지막에 위치해야 합니다.
UCLASS() // class를 리플렉션에 등록
class SPARTAPROJECT_API AItem : public AActor
{
GENERATED_BODY() // 시작부를 등록
public:
AItem();
protected:
USceneComponent* SceneRoot;
UStaticMeshComponent* StaticMeshComp;
float RotationSpeed;
virtual void BeginPlay() override;
virtual void Tick(float DeltaTime) override;
};
UCLASS()매크로는 클래스를 리플렉션 시스템에 등록하면서, 추가적으로 몇 가지 옵션 (지정자)을 설정할 수 있습니다.- 기본 동작
- 만약
UCLASS()에 옵션을 주지 않으면, 블루프린트에서 상속이 가능하고 변수로 참조가 가능한 형태로 등록됩니다. 즉, 내부적으로Blueprintable,BlueprintType과 동일한 효과를 가지게 됩니다.- 주요 옵션
Blueprintable
- 블루프린트에서 상속 가능한 클래스로 만듭니다.
NotBlueprintable
- 블루프린트에서 이 클래스를 상속할 수 없도록 합니다.
BlueprintType
- 블루프린트에서 변수나 참조로 사용할 수 있게 합니다.
- 이 옵션만 있으면, 상속은 허용되지 않고 참조만 가능합니다.
- 필요에 따라 이 지정자들을 조합해 클래스가 어떻게 블루프린트와 상호작용해야 할지 명시할 수 있습니다.
강의를 들으면서 들은 의문 중 하나는 블루프린트를 상속하지 않을 이유가 있을까 하는 점이다.
엔진기능에 대한 상속이 아니라면 콘텐츠 제작에서 블루프린트를 사용하지 않을 이유가 생각나지 않는다.
UPROPERTY는 Unreal에디터에 변수를 등록해주는 메크로다.
에디터에서의 표시 여부나 Bluprint 접근성 , 읽기 쓰기 권한등을 설정 가능하다.
- 편집 가능 범위 지정자
VisibleAnywhere: 읽기 전용으로 표시되며, 수정은 불가능EditAnywhere: 클래스 기본값, 인스턴스 모두에서 수정 가능EditDefaultsOnly: 클래스 기본값에서만 수정 가능EditInstanceOnly: 인스턴스에서만 수정 가능- Blueprint 접근성 지정자
BlueprintReadWrite: Blueprint 그래프에서 Getter/Setter로 값을 읽거나 쓸 수 있습니다.BlueprintReadOnly: Blueprint 그래프에서 Getter 핀만 노출되어, 읽기만 가능합니다.- Category 지정자
- Details 패널에서 이 변수는 “Rotation” 범주(폴더) 아래에 표시됩니다.
- 여러 변수를 비슷한 카테고리에 묶으면, 세부 정보 패널에서 깔끔하게 정리되어 보입니다.
- 메타 옵션 지정자
meta=(ClampMin="0.0"): 에디터에서 변수 입력 시 최소값을 제한할 수 있습니다.meta=(AllowPrivateAccess="true"): 해당 멤버가private로 선언되어 있어도, 에디터나 Blueprint에서 접근할 수 있도록 허용합니다.
- 만약 UPROPERTY()만 있고, 추가 지정자를 하나도 주지 않는다면?
- 엔진 리플렉션 시스템에는 등록되지만, 에디터나 Blueprint에 노출되지는 않습니다.
- “엔진이 변수의 존재는 알고 있지만, 외부에서는 보이지 않게 숨겨둔 상태”라고 볼 수 있습니다.
- 리플렉션에 등록만 되어 있어도 가비지 컬렉션(메모리 관리)과 직렬화(세이브/로드) 같은 엔진 내부 기능이 작동할 수 있습니다.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Item.generated.h"
UCLASS()
class SPARTAPROJECT_API AItem : public AActor
{
GENERATED_BODY()
public:
AItem();
protected:
// Root Scene Component, 에디터에서 볼 수만 있고 수정 불가
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Item|Components")
USceneComponent* SceneRoot;
// Static Mesh, 에디터와 Blueprint에서 수정 가능
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Item|Components")
UStaticMeshComponent* StaticMeshComp;
// 회전 속도, 클래스 기본값만 수정 가능
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Item|Properties")
float RotationSpeed;
virtual void BeginPlay() override;
virtual void Tick(float DeltaTime) override;
};
멤버변수 뿐 아니라 함수 또한 리플렉션에 등록하는 방법이 있다.
UFUNCTION으로 함수를 등록 가능하다.
- Blueprint 관련 지정자
BlueprintCallable
- Blueprint 이벤트 그래프(노드)에서 호출(Execute) 가능한 함수로 만듭니다.
BlueprintPure
- Getter 역할만 수행합니다. (Exec 핀 없이 Return Value만 노출)
BlueprintImplementableEvent
- 함수의 선언만 C++에 있고, 구현은 블루프린트에서 하도록 합니다. C++ 코드에서는 함수 이름만 정의하고, 실제 동작은 Blueprint Event Graph 안에서 이벤트 노드처럼 구현됩니다.
- 만약
UFUNCTION()에 지정자를 하나도 쓰지 않았다면?
UPROPERTY()와 마찬가지로, 함수가 언리얼 리플렉션에 등록되긴 하지만, 특별히 Blueprint에 노출되지는 않습니다.- “엔진이 함수의 존재는 파악하되, Blueprint에서 직접 호출할 수 없게 숨겨둔 상태”라고 보면 됩니다.
// 함수를 블루프린트에서 호출 가능하도록 설정
UFUNCTION(BlueprintCallable, Category="Item|Actions")
void ResetActorPosition();
// 블루프린트에서 값만 반환하도록 설정
UFUNCTION(BlueprintPure, Category = "Item|Properties")
float GetRotationSpeed() const;
// C++에서 호출되지만 구현은 블루프린트에서 수행
UFUNCTION(BlueprintImplementableEvent, Category = "Item|Event")
void OnItemPickedUp();