Class GameDev* SheepAdult

[Unreal Engine 4.27] Able / Disable Detail Property - EditCondition 본문

Unreal Engine

[Unreal Engine 4.27] Able / Disable Detail Property - EditCondition

SheepAdult 2022. 9. 25. 21:23

 우리가 만약 UPROPERTY()로 선언한 변수 값이 늘어나 디테일 창에서 정리를 하고 싶거나 특정 값을 기준으로 해당 값을 Disable(Deactivated) 혹은 Able(Activate) 시키고 싶을 때가 있을 것이다. 이럴 경우 언리얼 UPROPERTY()의 EditCondition을 사용하면 된다.

 

 사용법은 아래와 같다.

UPROPERTY(Specifier, meta=(EditCondition="BooleanPropertyName"))
	자료형 변수명;

EditCondition은 Boolean 자료형을 받으며 true 조건이 되면 활성화가 되고 false 조건이면 비활성화가 된다.

테스트로 아래와 같이 코드를 작성해 보았다.

UPROPERTY(EditAnywhere)
	bool bIsTesting = false;
UPROPERTY(EditAnywhere, meta = (EditCondition = "bIsTesting"))
	int Num;
UPROPERTY(EditAnywhere, meta = (EditCondition = "!bIsTesting"))
	float Float;

위의 코드는 bIsTesing에 따라서 EditCondition의 값도 달라지므로 Num과 Float의 활성화 여부를 결정할 수 있다. 결과는 아래와 같다.

만약 비활성화일 때 아예 숨기고 싶을 경우에는 어떻게 할까?

meta의 인자로 EditConditionHides를 넣어 아래와 같이 작성하면 된다.

UPROPERTY(EditAnywhere)
	bool bIsTesting = false;
UPROPERTY(EditAnywhere, meta = (EditCondition = "bIsTesting", EditConditionHides))
	int Num;
UPROPERTY(EditAnywhere, meta = (EditCondition = "!bIsTesting", EditConditionHides))
	float Float;

결과는 아래와 같다.

 EditCondition이 boolean 값을 받는다는 점에서 다양하게 사용이 가능하다. &&나 || 로도 좀 더 복잡한 조건을 받을 수 있으며 아래와 같이 수의 범위로도 정할 수 있다.

UPROPERTY(EditAnywhere)
	int bIsTesting;
UPROPERTY(EditAnywhere, meta = (EditCondition = "bIsTesting > 10"))
	int Num;
UPROPERTY(EditAnywhere, meta = (EditCondition = "bIsTesting < 8"))
	float Float;

추가로 Enum 값으로도 받을 수 있다.

아래는 내가 실제 프로젝트에서 사용한 코드이다.

// MyEnums.h
UENUM(BlueprintType)
enum class ECheckPointType : uint8
{
	CheckPoint UMETA(DisplayName = "CheckPoint"),
	ToNextLevel UMETA(DisplayName = "ToNextLevel")
};


// CheckPoint.h
#include <MyEnums.h>
...
UPROPERTY(EditAnywhere)
	TEnumAsByte <ECheckPointType> CheckPointType = ECheckPointType::CheckPoint;
UPROPERTY(EditAnywhere, meta = (EditCondition = "CheckPointType == ECheckPointType::CheckPoint"))
	FString SavePointName;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (EditCondition = "CheckPointType == ECheckPointType::CheckPoint"))
	TEnumAsByte<ECheckPointRespawnType> CheckPointRespawnType = ECheckPointRespawnType::Getup;
UPROPERTY(EditAnywhere, meta = (EditCondition = "CheckPointType == ECheckPointType::ToNextLevel"))
	FString NextLevelName;
...

결과는 예상되겠지만 아래와 같다.

끄읕.