Unreal 1-4.Reflection

별빛에소원을·2025년 1월 21일

TeamSparta-Unreal1기

목록 보기
11/18
post-thumbnail

Reflection

Cpp 변수 및 클래스 타입 정보등의 메타데이터를 에디터나 블루프린트에서 활용할 수 있게 하는 기술이다. 클래스 정보와 변수 정보의 타입을 재구성해서 에디터에 전달하는 과정이다 보니 Unreal에서 제공하는 매크로이용이 필수적으로 강제된다.
BP와 상호적으로 이용할 수 있는 기능들이 제공된다.


Reflection등록

#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() 매크로는 클래스를 리플렉션 시스템에 등록하면서, 추가적으로 몇 가지 옵션 (지정자)을 설정할 수 있습니다.
  • 기본 동작
    • 만약 UCLASS()에 옵션을 주지 않으면, 블루프린트에서 상속이 가능하고 변수로 참조가 가능한 형태로 등록됩니다. 즉, 내부적으로 Blueprintable, BlueprintType과 동일한 효과를 가지게 됩니다.
  • 주요 옵션
    • Blueprintable
      • 블루프린트에서 상속 가능한 클래스로 만듭니다.
    • NotBlueprintable
      • 블루프린트에서 이 클래스를 상속할 수 없도록 합니다.
    • BlueprintType
      • 블루프린트에서 변수나 참조로 사용할 수 있게 합니다.
      • 이 옵션만 있으면, 상속은 허용되지 않고 참조만 가능합니다.
    • 필요에 따라 이 지정자들을 조합해 클래스가 어떻게 블루프린트와 상호작용해야 할지 명시할 수 있습니다.

강의를 들으면서 들은 의문 중 하나는 블루프린트를 상속하지 않을 이유가 있을까 하는 점이다.
엔진기능에 대한 상속이 아니라면 콘텐츠 제작에서 블루프린트를 사용하지 않을 이유가 생각나지 않는다.

UPROPERTY() 매크로의 주요 지정자

UPROPERTY는 Unreal에디터에 변수를 등록해주는 메크로다.
에디터에서의 표시 여부나 Bluprint 접근성 , 읽기 쓰기 권한등을 설정 가능하다.

  1. 편집 가능 범위 지정자
    • VisibleAnywhere: 읽기 전용으로 표시되며, 수정은 불가능
    • EditAnywhere: 클래스 기본값, 인스턴스 모두에서 수정 가능
    • EditDefaultsOnly: 클래스 기본값에서만 수정 가능
    • EditInstanceOnly: 인스턴스에서만 수정 가능
  2. Blueprint 접근성 지정자
    • BlueprintReadWrite: Blueprint 그래프에서 Getter/Setter로 값을 읽거나 쓸 수 있습니다.
    • BlueprintReadOnly: Blueprint 그래프에서 Getter 핀만 노출되어, 읽기만 가능합니다.
  3. Category 지정자
    • Details 패널에서 이 변수는 “Rotation” 범주(폴더) 아래에 표시됩니다.
    • 여러 변수를 비슷한 카테고리에 묶으면, 세부 정보 패널에서 깔끔하게 정리되어 보입니다.
  4. 메타 옵션 지정자
    • 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;
};

Function Reflaction

멤버변수 뿐 아니라 함수 또한 리플렉션에 등록하는 방법이 있다.
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();

profile
취미로 게임하는사람

0개의 댓글