您的位置:首页 > 移动开发 > Unity3D

Unity心得(1)-使用一个整数保存状态

2016-09-25 15:42 260 查看

前言

使用习惯了unity和c#,有时候可能会忽略掉一些当初学习C/C++小技巧,最近开发项目的时候,项目组那些有经验的前辈介绍了有关使用一个整数保存多个状态的方法,使用的就是以前C/C++中常用的位运算。

使用场景

先试想一个场景,比如一个套装装备有十多个插槽,需要检测这些插槽是否插有加成的宝石,就需要十多个变量来代表有或者没有,使用多个bool变量或者int数组,显得结构臃肿且难以管理,既然只是表示有或者无,那么用0,1就可以表示,所以想到使用二进制来表示这些变量。

具体方法

所以,设置一个int类型的状态变量

int slotState = 0;


好了,现在我们在插槽全空的状态下在3号插槽插上了一个加成宝石,用二进制表示就应该是100,即第三号插槽有宝石,显然,不能直接写slotState = 4,这样就失去了我们使用这种方法的初衷,应该按照下面的这样写。

slotState = slotState|(1<<2)


其中1<<2 是按照二进制计算的,1<<2 = 100,将slotState = 000与100进行“|”或运算,则得到100,可以这个slotState的第三位已经被置为1了。系统因此可以记录三号插槽已经使用。

那么相应的,我们也需要检测插槽的使用,比如有用户试图在3号插槽安装宝石,那么假设

slotState = 20;


20的二进制为10100,那么相应的即为3、5号插槽是有宝石的,那么因为用户尝试使用3号插槽,那么我检测3号插槽使用如下方法。

bool isSlotUsed = ((slotState >> 2) %2 == 0);


其中slotState >> 2,使得slotState = 101,此时对2取余,因为最后一项为1,所以取余结果为0,那么isSlotUsed为真,证明该插槽被使用。

以上就是最近学习到的一个小技巧,当然这个小技巧有个限制,倘若状态变量(比如此例中的slotState)是带符号的int,那么无论其为32位或者64位,其中的最后一位都是符号位,不要占用该位来保存状态,否则容易出错,失去这个状态变量的唯一性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity c#
相关文章推荐