Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9749

Unity で Bit 演算を使ったフラグ管理を作ってみる

$
0
0

Bit 演算

 Unity では、あまり見ない?(少なくとも、僕はほとんど見たことないです。C とかハードウェアに近いシステムで見た程度。。。)ので、備忘録もかねて簡単なサンプルを作ってみたお話。

ステータス異常の管理

[Github] note-nota/BitwiseOperation

BitOperation.gif

ステータス異常の状態が左のチェックボックスで表現しています。真ん中のカラムでステータス異常の追加、右側のカラムで回復の操作をそれぞれ行います。

 ステータス異常の定義は以下の enum によって行います。

StatusFlags.cs
[Flags]publicenumStatusFlags{None=0,Poisoned=1<<0,Blind=1<<1,Asleep=1<<2,Stunned=1<<3,Silenced=1<<4,Paralysed=1<<5}

 ステータス異常の操作部分はこんな感じ。
状態変化が起きるときに Event 発火するように OnUpdateStatusを定義してます。

PlayerStatus.cs
publicvoidAddStatus(byteadd){status|=(StatusFlags)add;OnUpdateStatus.Invoke(status);}publicvoidDelStatus(bytedel){status&=(StatusFlags)~del;OnUpdateStatus.Invoke(status);}

Bit 演算の説明

[Flags]

 StatusFlagsクラスは [Flags]アトリビュートによって bit 処理の明示を行います。なので、わざわざ書かなくても定義さえしっかりしていれば、bit 演算でも表現されるはず。。。(試してないけど。)

OR(|), AND(&), XOR(^)

00000
10101
01101
11110

NOT(~)

 否定:ビットが逆になる。

例:単純な演算

10101|00111// => 1011110101&00111// => 0010110101^00111// => 10010((10101^00111)|(10101&00111))==(10101|00111)// => true

例:追加/削除

state=10101// 今ある状態add=00010// 追加したい状態del=00100// 削除したい状態// 状態の追加state|add10101|00010// => 10111// 状態の削除state&~del10101&~0010010101&11011// => 10001

例:判定

state == (state | flag)あるいは flag == (state & flag)

state=10101// 今ある状態flagA=00010flagB=00100// flagA の判定1state==(state|flagA)10101==(10101|00010)10101==(10111)// => false// flagA の判定2flagA==(state&flagA)00010==(10101&00010)00010==(00000)// => false// flagB の判定1state==(state|flagB)10101==(10101|00100)10101==(10101)// => true// flagB の判定2flagB==(state&flagB)00100==(10101&00100)00100==(00100)// => true

Viewing all articles
Browse latest Browse all 9749

Trending Articles