이번엔 언리얼 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를 작성해야 합니다.
'Unreal > Programming' 카테고리의 다른 글
UE4 C++ Delegate 정리 & 샘플 프로젝트 (10) | 2019.10.09 |
---|---|
UE4 C++와 블루프린트 연동 기본 -2. UFUNCTION() (2) | 2019.10.03 |
UE4 C++와 블루프린트 연동 기본 -1. UPROPERTY() (7) | 2019.09.17 |
UE4 C++와 블루프린트 연동 기본 -0. Reflection(리플렉션) (1) | 2019.09.16 |
UE4 Intellisense - UPROPERTY()같은 메크로 자동완성 기능 (0) | 2019.09.16 |
WRITTEN BY
- CatDarkGame
Technical Artist dhwlgn12@gmail.com