今天使用Physics2D.OverlapAreaNonAlloc进行物理检测时候,通过LayerMask.NameToLayer传入了int值的LayerMask,结果一直识别不到,经过Debug才找到问题,竟是LayerMask的“值”传输有问题,记录一下。
直接贴代码输出结果,这里新增一个Layer: “TestLayer”,挂载脚本,运行,代码后面是对应的输出,如图:
代码如下:
using UnityEngine;
public class LayerTest : MonoBehaviour
{
public LayerMask layerMask; //=> TestLayer
private void Awake()
{
Debug.Log(layerMask.value); // => 64
Debug.Log((int)layerMask); // => 64
Debug.Log(gameObject.layer); // => 6
Debug.Log(LayerMask.NameToLayer("TestLayer")); // => 6
Debug.Log(LayerMask.GetMask("TestLayer")); // => 64
}
}
可以看到,对我们定义的LayerMask类型,无论是强转还是直接取值(前两句输出),获取到的值是枚举的实际值,是1<<6的结果, 而直接获取对象的Layer和通过LayerMask.NameToLayer
(第三,四句输出)获取到的值,都是对应在LayerManager里面的索引,这两个是完全不一样的值。而LayerMask.GetMask(第五句输出)获取到的值也是枚举的实际值,注意LayerMask.GetMask的传参的不定长的字符串数组,获取到的是传入的字符串转换成LyaerMask后做“和”运算的结果。
Physics2D.OverlapAreaNonAlloc参数里需要的LyaerMask值是枚举的实际值,而不是索引值,所以不能使用LayerMask.NameToLayer获取,所以检测不到,应该使用LayerMask.GetMask获取。
总结,在遇到LayerMask类型的参数时,要先确定是要索引值还是实际值,再确定如何获取,一般来讲,如果该参数包含多种LayerMask枚举时,那么该参数就一定是要取实际值而不是索引值的。物理引擎中,Layer检测一般是检测很多种类的,所以应该用实际值。