본문 바로가기

UE4

[UE4] 프로퍼티 및 UPROPERTY 주요 지정자

0. 서문

이 글을 읽기에 앞서, UE4의 Reflection에 대한 이해가 없다면, 꼭 아래 문서부터 읽도록 하자.
 
프로퍼티는 표준 C++ 변수 문법 앞에 UPROPERTY 매크로를 붙이면서 프로퍼티 메타데이터와 변수 지정자를 붙여 선언한다.
UPROPERTY([specifier, specifier, ...], [meta(key=value, key=value, ...)])
Type VariableName;
 
UE4의 프로퍼티 전반적인 내용과 모든 specifier 대한 내용은 아래 문서를 참고하기 바란다.
 
이후 문서엔 자주 사용되는 specifier 위주로만 조금 더 자세히 정리하였다.
(UPROPERTY specifier 열거값들은 ObjectMacro.h의 namespace UP에서 확인할 수 있다)
 

1. VisibleAnywhere

이 프로퍼티는 에디터의 프로퍼티 창에서 보여지나, 편집이 불가능함을 나타낸다.
 
VisibleAnywhere, VisibleDefaultsOnly, VisibleInstanceOnly는 Edit* 씨리즈와 배타적이므로,
Visible* 씨리즈와 Edit* 씨리즈 지정자는 한번에 하나의 지정자만 선언할 수 있다.
 

2. EditAnywhere

이 프로퍼티는 에디터의 프로퍼티 창에서 편집이 가능함을 나타낸다.
VisibleAnywhere이 ReadOnly의 의미라면, EditAnywhere는 ReadWrite의 의미를 가진다.
 

3. [Visible, Edit][DefaultsOnly,InstanceOnly]

  • DefaultsOnly : 이 프로퍼티는 블루프린트 클래스 편집일 경우에만 프로퍼티 창에서 편집 가능함을 나타낸다.
  • InstanceOnly : 이 프로퍼티는 블루프린트 액터로써 레벨에 추가된 경우에만 프로퍼티 창에서 편집 가능함을 나타낸다.
 
DefaultsOnly는 클래스별 기본값에 해당하기에 인스턴스들이 공통으로 가져야 하는 값이라 생각하면 되고,
InstanceOnly는 인스턴스된 객체별로 다르게 가질 수 있는 값에 해당한다 생각하면 된다.
 

4. BlueprintReadOnly / BlueprintReadWrite

프로퍼티 이름 그대로다.
ReadOnly는 읽기만 가능할 뿐 쓰기가 안 되고, ReadWrite는 읽기/쓰기 모두 가능하다.
상호 배타적인 녀석들이므로, 함께 지정자로 선언할 수는 없다.
 
프로퍼티가 Visible... 을 가질 경우, ReadOnly,
프로퍼티가 Edit...을 가질 경우, ReadWrite를 가지는 것이 보통이다.
 

5. BlueprintAssignable

다이나믹 멀티캐스트 델리게이트에만 지정이 가능하다.
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnItemRemoved, FItemStruct, RemovedItem);

UCLASS(meta=(BlueprintSpawnableComponent))
class UInventoryComponent : public UActorComponent
{
    GENERATED_BODY()

public:

    UPROPERTY(BlueprintAssignable)
    FOnItemRemoved OnItemRemoved;
};
 
 
다이나믹 멀티캐스트 델리게이트에 UPROPERTY(BlueprintAssignable)을 지정해 주어야만 블루프린트에서 해당 델리게이트를 검색할 수 있게 된다.
 

6. Config(config)

Config 지정자로 선언된 언리얼 오브젝트(UCLASS(Config=xxx)로 선언된 클래스)의 멤버 변수가 이 지정자로 선언되면, 해당 xxx.ini로부터 기본값을 읽어오게 된다.
 
예제를 보는 것이 이해가 빠를 것이다.
UCLASS(config=Game)
class ARENABATTLE_API AABPawn : public APawn
{
    GENERATED_BODY()

    //...

public:
    UPROPERTY(config, BlueprintReadWrite, EditDefaultsOnly, Category = "ABPawnStat")
    float MaxHp;

    //...
};
 
 
위 예제의 모듈 이름이 ArenaBattle일 경우 DefaultGame.ini의 섹션명은 다음과 같다.
(config=game이라고 지정되었기에, DefaultGame.ini에 위치해야 한다)
 
ini 섹션명은 [Script/{ModuleName}.{ObjectClassName}]이어야 하므로, 다음과 같이 ini가 작성되어야 한다.
 
[Script/ArenaBattle.ABPawn]
MaxHp = 1000.0;
 

'UE4' 카테고리의 다른 글

[UE4] World 내 Object/Actor 순회  (0) 2023.04.24
[UE4] MyLogMacro.h  (0) 2023.04.24
[UE4] 클래스 및 UCLASS 주요 지정자  (0) 2023.04.24
[UE4] 함수 및 UFUNCTION 주요 지정자  (0) 2023.04.24
[UE4] Garbage Collection overview  (0) 2023.04.24