自制Unity3d的Layer功能

216 阅读1分钟

现在游戏里面寻路在用的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;
    }
}