본문 바로가기
언리얼_엔진_게임개발_공부/언리얼 C++

[언리얼/C++] 비트마스크 Bitmask / TryFindType, UnknownFunction 경고 해결

by jaboy 2025. 1. 21.

언리얼 엔진의 리플렉션 시스템에 대해 학습하며

언리얼 엔진에서 비트마스크를 활용할 수 있는 방식에 대해 추가로 공부한 내용을 정리했다.

 

리플렉션 시스템

클래스, 변수, 또는 함수를 등록시키면, 엔진이 이를 인식할 뿐만 아니라 가비지 콜렉션 등 기본 기능을 수행하며, 매크로의 지정자 설정에 따라 에디터 / 블루프린트 그래프에 노출시키거나 편집 가능하게 할 수 있다.

 

비트마스크 활용

이 중에서도 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 (인풋 핀) 를 통해 정상적으로 각 열거형 비트마스크에 맞는 플래그 값을 지정할 수 있게 된다.

Bitmask 값을 Set 하는 C++ 함수를 블루프린트 그래프에서 호출하였고, 파라미터를 통해 flag 값을 정할 수 있다.

 

클래스 디폴트:

 

인스턴스 디테일 패널에서 편집:

 

 

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