언리얼 엔진의 리플렉션 시스템에 대해 학습하며
언리얼 엔진에서 비트마스크를 활용할 수 있는 방식에 대해 추가로 공부한 내용을 정리했다.
리플렉션 시스템
클래스, 변수, 또는 함수를 등록시키면, 엔진이 이를 인식할 뿐만 아니라 가비지 콜렉션 등 기본 기능을 수행하며, 매크로의 지정자 설정에 따라 에디터 / 블루프린트 그래프에 노출시키거나 편집 가능하게 할 수 있다.
비트마스크 활용
이 중에서도 UPROPERTY 에 관한 언리얼 공식 문서를 읽으며 비트마스크에 관한 부분이 강의에서 다뤄지지 않은 내용이어서 실습해보기로 했다.
공식 문서: https://dev.epicgames.com/documentation/ko-kr/unreal-engine/unreal-engine-uproperties
열거형 타입을 비트마스크로 활용
아래는 열거형 타입을 비트마스크로 변환 및 에디터에서 드롭다운 및 체크로 플래그 값 편집 기능을 활용하는 예시이다.
1. UENUM 의 메타 값을 Bitflags 로 설정해 비트 플래그로 인식시키고
2. UseEnumValuesAsMaskValuesInEditor = "true" 로 설정하여 에디터에서 플래그 선택 기능을 활성화할 수 있으며
3. ENUM_CLASS_FLAGS([열거형 이름]) 로 열거형 타입을 비트마스크로 변환해 활용할 수 있다.
UENUM(Meta = (Bitflags, UseEnumValuesAsMaskValuesInEditor = "true"))
enum class EBuffBits
{
EBB_Rage = 0x01,
EBB_Focused = 0x02,
EBB_Agile = 0x04,
EBB_Sharp = 0x08
};
ENUM_CLASS_FLAGS(EBuffBits)
UENUM(Meta = (Bitflags, UseEnumValuesAsMaskValuesInEditor = "true"))
enum class EDebuffBits
{
EDB_Weakened = 0x01,
EDB_Distracted = 0x02,
EDB_Slowed = 0x04,
EDB_Dazed = 0x08
};
ENUM_CLASS_FLAGS(EDebuffBits)
인티저 타입을 비트마스크 변수로 활용
이후 인티저 타입을 아래와 같이 리플렉션 시스템에 비트마스크로 인식시켜 활용할 수 있다.
1. Meta 에 Bitmask 로 설정하고
2. BitmaskEnum 을 위에서 정의한 Enum 으로 설정
UPROPERTY(EditAnywhere, BlueprintReadWrite, Meta=(Bitmask, BitmaskEnum="EBuffBits"))
int32 BuffBits;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Meta=(Bitmask, BitmaskEnum="EDebuffBits"))
int32 DebuffBits;
이는 에디터에서 아래와 같이 나타나고, 드롭다운 메뉴에서 체크/언체크 를 통해 플래그를 set 할 수 있다.
함수의 파라미터를 비트마스크로 지정
이 비트마스크 값을 Set 하는 UFUNCTION 을 아래와 같이 추가해보았다.
1. UPARAM 의 meta 에 Bitmask 를 넣어 파라미터를 비트마스크로 인식시키고
2. 위와 동일하게 BitmaskEnum 을 열거형으로 지정
UFUNCTION(BlueprintCallable)
void SetBuffBits(UPARAM(meta = (Bitmask, BitmaskEnum = "EBuffBits")) int32 BuffBitsParam);
UFUNCTION(BlueprintCallable)
void SetDebuffBits(UPARAM(meta = (Bitmask, BitmaskEnum = "EDebuffBits")) int32 DebuffBitsParam);
BlueprintCallable 지정자를 통해 블루프린트 그래프에서 호출할 수 있으며
Parameter (인풋 핀) 를 통해 정상적으로 각 열거형 비트마스크에 맞는 플래그 값을 지정할 수 있게 된다.
클래스 디폴트:
인스턴스 디테일 패널에서 편집:
BeginPlay 이후:
아웃풋 로그 경고 해결
LogClass: Warning: Short type name "열거형" provided for TryFindType.
각종 dll 파일에서 UnknownFunction 경고를 띄움
위 상태에서 플레이 모드에 진입하면 아래와 같이 아웃풋 로그가 아래와 같은 Warning 으로 스팸 되는 것을 확인했다.
(Tick 마다 쌓여서 에디터가 느려질 정도...!)
가장 첫번째 줄에서 지시하는대로 UPROPERTY 와 UPARAM 에서 참조하는 Enum 명을 /Script/[ProjectName].[EnumName] 로 수정하였다.
UPROPERTY(EditAnywhere, BlueprintReadWrite, Meta=(Bitmask, BitmaskEnum="/Script/Project1.EBuffBits"))
int32 BuffBits;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Meta=(Bitmask, BitmaskEnum="/Script/Project1.EDebuffBits"))
int32 DebuffBits;
UFUNCTION(BlueprintCallable)
void SetBuffBits(UPARAM(meta = (Bitmask, BitmaskEnum = "/Script/Project1.EBuffBits")) int32 BuffBitsParam);
UFUNCTION(BlueprintCallable)
void SetDebuffBits(UPARAM(meta = (Bitmask, BitmaskEnum = "/Script/Project1.EDebuffBits")) int32 DebuffBitsParam);
이렇게 하면 아웃풋 로그에 같은 Warning 이 출력되지 않는다.
아래 포럼의 글을 참고했다.
https://forums.unrealengine.com/t/bitmask-warning-spam/1194637
Bitmask Warning Spam
I currently want my struct to hold 2 bitmask enums declared as UENUM(BlueprintType, meta = (Bitflags, UseEnumValuesAsMaskValuesInEditor = "true")) enum class EScaleIncreaseAt : uint8 { NONE = 0 UMETA(Hidden), At2 = 1 << 0, At3 = 1 << 1, At4 = 1 << 2, At5 =
forums.unrealengine.com
'언리얼_엔진_게임개발_공부 > 언리얼 C++' 카테고리의 다른 글
[언리얼/C++] 타이머 사용하기 / FTimerManager, FTimerHandle, SetTimer() (0) | 2025.01.24 |
---|---|
[언리얼/C++] 열거형 - UENUM / 언리얼 엔진의 EAxis (0) | 2025.01.23 |
[언리얼/C++] Tick 함수로 메쉬 스케일 변경 (커졌다 작아졌다 하게) (0) | 2025.01.21 |
[언리얼/C++] 액터에 컴포넌트 추가 및 에셋 적용 (1) | 2025.01.20 |
(과제용) Unreal Engine C++ 간단한 이동 로직 구현하기 (0) | 2025.01.06 |