UE4中的位掩碼(Bitmask)的介紹和使用
簡介
環境:UE 4.25
位掩碼(Bitmask)
位掩碼是一串二進位制數(比如子網掩碼),每一位是一個Flag,表示一種狀態,一個32位的位掩碼就可以表示32種狀態的組合。如果期望使用多個bool變數共同作用與同一個地方,就可以使用位掩碼來實現。
- 使用位掩碼是為了控制一組bool變數,用一個變數就可以表示豐富的狀態。
- 使用列舉是為了給每個Flag命名,增強可讀性。
位操作
由於位掩碼是使用二進位制來表示一個Flag,所以最常使用的操作就是位運算:與(&)、非(~)、或(|)、異或(^)、左移(<<)和右移(>>)。
藍圖位掩碼
藍圖建立位掩碼可檢視官方教程
建立位掩碼
總結一下過程可分為3步:
-
建立一個藍圖列舉,並將Bitmask Flags設為true
-
在藍圖中建立一個整型變數,設定為Bitmask,最多支援32個Flags
-
使用它
其中常用的操作為:
• 隱式轉化為bool:判斷Bitmask中是否含有Flags。
• 按位非(Bitwise NOT):得到一個相反的Bitmask。
• 按位與(Bitwise AND):得到一個含有共同Flags的Bitmask。
• 按位或(Bitwise OR):得到一個含有所有Flags的Bitmask。
使用方式示例
• 開啟Flag:
• 關閉Flag:
• 判斷是否包含Flag:
C++位掩碼
在C++中使用位掩碼有更大的自由度。可以使用int32、int64、uint32等表示掩碼,而藍圖只支援int32。同時,表示Bitflags的列舉型別也可以使用uint32、uint64等,而藍圖只支援uint8。
Bitmask常用的操作(變數作為示範):
//int32 MyBitmask = 3;
//int32 MyFlag = 1;
MyBitmask |= MyFlag; //開啟Flag
MyBitmask &= ~MyFlag; //關閉Flag
if (MyBitmask & MyFlag) { /*Do something*/ }//判斷Flag是否開啟
方式一
可以利用左移操作設定列舉值,使得列舉變數對應的值與它的Bitmask的Flag值是一樣的。
UENUM(meta = (Bitflags))
enum class EMyTypeEnum :uint32
{
Type1 = (1 << 0),
Type2 = (1 << 1),
Type3 = (1 << 2),
Type4 = (1 << 3),
Type5 = (1 << 4),
Type6 = (1 << 5)
};
UPROPERTY(EditAnywhere, BlueprintReadWrite,meta = (Bitmask,BitmaskEnum = "EMyTypeEnum"))
int32 MyTypeBitmask;
判斷Bitmask中是否包含列舉對應的Flag(直接轉化即可得到Flag值):
if (MyTypeBitmask & static_cast<uint32>(EMyTypeEnum::Type2))
{
//Do something
}
方式二
如果需要同時在C++和藍圖中都獲得良好的體驗,則需要新增函式或巨集來獲得列舉對應正確的Bitmask值。
使用巨集從正常順序的列舉值得到Flag值:
#define TOFLAG(Enum) (1 << static_cast<uint8>(Enum))
藍圖和C++都可以使用該列舉作為Bitflags:
UENUM(BlueprintType, meta = (Bitflags))
enum class EMyTypeEnum :uint8
{
Type1, //= 0
Type2, //= 1
Type3, //= 2
Type4, //= 3
Type5, //= 4
Type6 //= 5
};
UPROPERTY(EditAnywhere, BlueprintReadWrite,meta = (Bitmask,BitmaskEnum = "EMyTypeEnum"))
int32 MyTypeBitmask;
判斷Bitmask中是否包含列舉對應的Flag(使用巨集得到Flag值)
if (MyTypeBitmask & TOFLAG(EMyTypeEnum::Type2))
{
//Do something
}
相關文章
- langchain中的chat models介紹和使用LangChain
- MongoDB Oplog中的欄位介紹MongoDB
- LayerMask 的介紹和使用
- BlockingQueue 的介紹和使用BloC
- MT6169 PVT時間掩碼測試中的TPC事件定時和修改MIPI TX資料介紹事件
- web worker的介紹和使用Web
- 原始碼管理工具——GitHub的介紹和使用原始碼Github
- clang-format的介紹和使用ORM
- Web Storage API的介紹和使用WebAPI
- Google guava工具類的介紹和使用GoGuava
- Redis介紹和使用Redis
- The Graph介紹和使用
- Nacos使用和註冊部分原始碼介紹原始碼
- 寶付介紹ELK中kibana的使用
- React中10種Hook的使用介紹ReactHook
- 介紹 Linux 中的管道和命名管道Linux
- Hbase原理的介紹和使用場景分析
- ccs的介紹,安裝和使用入門
- babel-runtime和babel-polyfill的介紹和使用Babel
- Hanlp在ubuntu中的使用方法介紹HanLPUbuntu
- JVM中記憶體和GC的介紹JVM記憶體GC
- iOS Runtime介紹和使用iOS
- ddddocr基本使用和介紹
- Python JWT 介紹和使用PythonJWT
- mybatis中@Mapper使用介紹MyBatisAPP
- OutputStreamWriter介紹&程式碼實現和InputStreamReader介紹&程式碼實現
- LangChain的Agent使用介紹LangChain
- layui 的基本使用介紹UI
- JQuery的介紹與使用jQuery
- certutil工具的使用介紹
- lightdb的merge into使用介紹
- Graph Explore的使用介紹
- XML和JSON的介紹XMLJSON
- HTTPS 和HTTP的介紹HTTP
- Kafka中的segment的介紹Kafka
- Shell指令碼介紹與使用指令碼
- Hanlp在java中文分詞中的使用介紹HanLPJava中文分詞
- JVM中堆的介紹JVM