Unity3d LayerMask 通过名字设置层

LayerMask  设置层时,多层设置支持int类型,而不支持string类型,使用起来不方便

调用   
//只检测 Occluder 和 Player 的碰撞器层
var layerMask =  Want_Collider_Lay_Name("Occluder", "Player");
var collider_array = Physics.CheckSphere(transform.position, transform.localScale.x, layerMask);


 /// <summary>
    /// 想要碰撞的层
    /// </summary>
    /// <param name="arr"></param>
    /// <returns></returns>
    public static int Want_Collider_Lay_Name(params string[] arr)
    {
        //int是 32位二进制,第一位是符号位,代表正负,0表示正数,1表示负数.
        string layer_w = "0000000000000000000000000000000";//31个0
        var CharArray = layer_w.ToCharArray();
        //打开需要的层
        foreach (var item in arr)
        {
            int layer = LayerMask.NameToLayer(item);
            //Debug.Log(item+":layer="+layer+ "layerMask="+ layer_w + " ,2="+ new string(CharArray));
            //LayerMask 是0-31,等于1表示打开,0表示关闭
            CharArray[layer] = '1';
        }
        //LayerMask值是从后到前的,所以要数组倒序排序
        Array.Reverse(CharArray);
        layer_w = new string(CharArray);
        //Debug.Log(layer_w);
        System.Int32 num32Max = Convert.ToInt32(layer_w, 2);
        return num32Max;
    }

  /// <summary>
    /// 忽略碰撞的层
    /// </summary>
    /// <param name="arr"></param>
    /// <returns></returns>
    public static int Ignore_Collider_Lay_Name(params string[] arr)
    {
        //int是 32位二进制,第一位是符号位,代表正负,0表示正数,1表示负数.
        string layer_w = "1111111111111111111111111111111";//31个1
        var CharArray = layer_w.ToCharArray();
        //打开需要的层
        foreach (var item in arr)
        {
            int layer = LayerMask.NameToLayer(item);
            //Debug.Log(item+":layer="+layer+ "layerMask="+ layer_w + " ,2="+ new string(CharArray));
            //LayerMask 是0-31,等于1表示打开,0表示关闭
            CharArray[layer] = '0';
        }
        //数组倒序排序
        Array.Reverse(CharArray);
        layer_w = new string(CharArray);
        //Debug.Log(layer_w);
        System.Int32 num32Max = Convert.ToInt32(layer_w, 2);
        return num32Max;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值