现在游戏里面寻路在用的Mask,因为Unity不公开源码,所以就自己写了一个,原理跟它的一样,就是用位运算来进行判断,比如要找判断是否是layer 2或者3,就用 1<<2 | 1<<3如果要判断是否是除了2和3以外的layer就用 ~(1 << 2 | 1 << 3),是不是跟Unity的Raycast函数调用方式一样?这样好处是 不用list没有动态分配内存,并且位运算效率高。坏处是只能有32个层,因为int最大32位,也可以用long,这样可以有64位,一般来说32,unity用的就是int,所以它的层数最大32层。
public class GridLayerMask {
int _LayerMask = 0;
public int LayerMask
{
get
{
return _LayerMask;
}
}
//例:ContainLayer( ~(1 << 2 | 1 << 5))
public bool ContainLayers(int layerMask)
{
return (_LayerMask & layerMask) > 0;
}
//例:AddLayers((1 << 2 | 1 << 5))
public void AddLayers(int layerMask)
{
_LayerMask = _LayerMask | layerMask;
}
//例:RemoveLayers( ~(1 << 2 | 1 << 5))
public void RemoveLayers(int layerMask)
{
_LayerMask = (_LayerMask & (_LayerMask ^ layerMask));
}
public static bool ValidateLayerMask(int sourceLayerMask, int layerMask)
{
return (sourceLayerMask & layerMask) > 0;
}
}