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;
}