創作內容

0 GP

[UE4] BitMask 使用介紹

作者:dorgon│2017-05-24 10:50:50│巴幣:0│人氣:1040
部落格版本
=============================

BitMask是使用bit來表達True或false的概念,它可以使用一個int來表達多組的功能是否啟用。
先讓我們來看下圖:
若我們想要依照PlayerLevel跟Speed來進行排序的話,一般不知道這個技巧的人可能會使用二個int來處理這件事。在使用了BitMask之後我們就可以藉由將第一跟第三個bit設為1來表達這件事。在一般的C++中我們常常在enum的設定中就直接將該bit位移,如下面的code:

enum class EHorizonPlayerSortType
{
Invalidated     = ( 1 << 0),
Leve= ( 1 << 1),
Power           = ( 1 << 2),
Speed= ( 1 << 3),
PlaceHolder1    = ( 1 << 4),
PlaceHolder2= ( 1 << 5),
PlaceHolder3= ( 1 << 6),
PlaceHolder4    = ( 1 << 7),
};
void Usage(){
  int flag = EHorizonPlayerSortType::Level | EHorizonPlayerSortType::Speed;
}
但在UE4中的Bitmask沒辦法使用跟上面一樣的做法,由於enum class被限制成只能使用uint8,因此在UE4中是直接將enum中的值當成位移數,如下面的code:

UENUM(BlueprintType, meta = (Bitflags))
enum class EHorizonPlayerSortType : uint8
{
Invalidated     = 0,
LevelUMETA(DisplayName = "PlayerLevel"),
PowerUMETA(DisplayName = "Power"),
SpeedUMETA(DisplayName = "Speed"),
PlaceHolder1 UMETA(DisplayName = "PlaceHolder1"),
PlaceHolder2UMETA(DisplayName = "PlaceHolder2"),
PlaceHolder3UMETA(DisplayName = "PlaceHolder3"),
PlaceHolder4UMETA(DisplayName = "PlaceHolder4"),
};
ENUM_CLASS_FLAGS(EHorizonPlayerSortType)
USTRUCT(BlueprintType)
struct HORIZONTWEEN_API FHorizonPlayerParameters
{
GENERATED_BODY()
FHorizonPlayerParameters()
: PlayerSortTypeFlags((int)EHorizonPlayerSortType::Level)
{
}
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (Bitmask, BitmaskEnum = "EHorizonPlayerSortType"))
int PlayerSortTypeFlags;
};
bool HasFlag(const INT32& Flags, EHorizonPlayerSortType TestFlag)
{
     INT32 bitFlag = static_cast<int32>(1 << (INT32)TestFlag); //shift to the bit corresponding to the enum value
     return (Flags & bitFlag ) != 0;
}
void Usage(const FHorizonPlayerParameters& param){
INT32 bitFlag = static_cast<int32>((1 << (INT32)EHorizonPlayerSortType::Level) |
   (1 << (INT32)EHorizonPlayerSortType::Speed));  // 10
bool b1 = HasFlag(param.PlayerSortTypeFlags, EHorizonPlayerSortType::Level);  //true
bool b2 = HasFlag(param.PlayerSortTypeFlags, EHorizonPlayerSortType::Power); //false
bool b3 = HasFlag(param.PlayerSortTypeFlags, EHorizonPlayerSortType::Speed); //true
}
其中
INT32 bitFlag = static_cast<int32>((1 << (INT32)EHorizonPlayerSortType::Level) |
                                       (1 << (INT32)EHorizonPlayerSortType::Speed));
就是模擬Blueprint中選擇要啟用哪個enum的C++實作。
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=3586625
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:Unreal Engine 4

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

喜歡★dorgonman 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:[UE4] 關於UE4中... 後一篇:[UE4]GENERAT...

追蹤私訊切換新版閱覽

作品資料夾

MoeTakoヾ(●゜▽゜●)♡
來一起陪雪糕畫畫喵✧◝(⁰▿⁰)◜✧看更多我要大聲說昨天20:24


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】