이번엔 언리얼 C++에서 사용하는 Enum과 Struct를 블루프린트와 연동하는 내용에 대해 포스팅합니다.

 


UENUM
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Variable2.generated.h"


UENUM(BlueprintType)	//! UENUM은 언리얼 에디터에서 해당 enum을 사용할 수 있게 합니다.
						//! BlueprintType은 블루프린트에서 사용할려면 넣어야합니다.
enum class ECharacterClass : uint8
{
	E_Warrior = 0   UMETA(DisplayName = "Warrior"),	//! DisplayName은 언리얼 에디터, 블루프린트에서 표시되는 이름입니다.
	E_Mage			UMETA(DisplayName = "Mage"),
	E_Archer		UMETA(DisplayName = "Archer"),

	E_MAX,
};

UCLASS()
class NATIVETOBP_API AVariable2 : public AActor
{
	GENERATED_BODY()
	
public:	


public:	
	AVariable2();
	virtual void BeginPlay() override;
	virtual void Tick(float DeltaTime) override;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)		//! 일반 변수와 마찬가지로 UPROPERTY메크로로 속성값을 넣어서 사용합니다.
		ECharacterClass m_eClass = ECharacterClass::E_Warrior;

};

UENUM메크로의 BlueprintType은 에디터 & 블루프린트에서 해당 Enum을 사용할 수 있게 합니다,

E_Warrior = 0 UMETA(DisplayName="Warrior") 코드의 UMETA는 이전 UPROPERTY 포스팅에서 소개한 meta데이터정자와 같은 개념으로 Enum버전입니다.

 

 

코드 작성하고 컴파일하면 블루프린트에서 위 처럼 Enum관련 노드를 사용할 수 있습니다,

UPROPERTY에서 선언한 BlueprintReadWrite로 인해 해당 Enum으로 만든 변수를 Get/Set 할 수도 있습니다.

 

마찬가지로 EditAnywhere로 인해 디테일 패널에서 변수를 확인 할 수 있습니다.

 

 

 


USTRUCT

구조체 코드는 예제 구조체 안에 이전에 만든 Enum을 넣었기 때문에 기존 Enum코드에 추가하여 작성했습니다.

UENUM(BlueprintType)	//! UENUM은 언리얼 에디터에서 해당 enum을 사용할 수 있게 합니다.
						//! BlueprintType은 블루프린트에서 사용할려면 넣어야합니다.
enum class ECharacterClass : uint8
{
	E_Warrior = 0   UMETA(DisplayName = "Warrior"),	//! DisplayName은 언리얼 에디터, 블루프린트에서 표시되는 이름입니다.
	E_Mage			UMETA(DisplayName = "Mage"),
	E_Archer		UMETA(DisplayName = "Archer"),

	E_MAX,
};

USTRUCT(Atomic, BlueprintType)	//! 언리얼 구조체는 USTRUCT 메크로를 사용합니다.
								//! Atomic 은 이 구조체가 항상 하나 단위로 직렬화되게 합니다.
								//! BlueprintType은 블루프린트에서 사용할려면 작성해야합니다,
struct NATIVETOBP_API FDamageInfo
{
	GENERATED_BODY()
public:
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
		AActor* _pAttacker;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
		ECharacterClass _eAttackerClass;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
		float _fDamage;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
		bool _bKnockback;
};


UCLASS()
class NATIVETOBP_API AVariable2 : public AActor
{
	GENERATED_BODY()
	
public:	


public:	
	AVariable2();
	virtual void BeginPlay() override;
	virtual void Tick(float DeltaTime) override;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)		//! 일반 변수와 마찬가지로 UPROPERTY메크로로 속성값을 넣어서 사용합니다.
		ECharacterClass m_eClass = ECharacterClass::E_Warrior;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)   //! 일반 변수와 마찬가지로 UPROPERTY메크로로 속성값을 넣어서 사용합니다.
		FDamageInfo m_stDamageInfo;

};

구조체의 이름앞에 F를 붙여야합니다, 이는 댕글링(dangling) 포인터 방지하기 위함입니다.

댕글링(dangling)포인터 : 삭제된 오브젝트를 참조하여 프로그램이 터지는 현상

 

USTURCT메크로에 들어간 Atomic은 공식도큐먼트 설명에 "이 구조체는 항상 하나의 단위로 Serialize 됨을 나타냅니다."라고 작성되어 있습니다.

 

간단하게 해당 구조체를 디테일패널에서 사용할 수 있게 됩니다, Atomic을 사용하면 구조체 내부 변수들의 UPROPERTY메크로에 EditAnywhere를 필수 적으로 작성해야 합니다.

 

 

두 번째 BlueprintType은 해당 구조체를 블루프린트에서 사용할 수 있게 하며 Atomic과 비슷하게 구조체 내부 변수들의 UPROPERTY메크로에 BlueprintReadWrite를 작성해야 합니다.

 

 

 


WRITTEN BY
CatDarkGame
Technical Artist dhwlgn12@gmail.com

,