Unity 射线检测(Raycast)检测图层(LayerMask)的设置

发布时间:2023年12月17日

目录

主要内容

拓展:


主要内容

Raycast函数有很多重载(函数的重载根据函数的参数来决定)

这里只涉及这个重载,其余重载可以很方便得在Visual Studio中看源码获取;

    public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance, int layerMask)
    {
        return defaultPhysicsScene.Raycast(origin, direction, out hitInfo, maxDistance, layerMask);
    }

关于第四个参数:int layerMask;

一开始时,我认为这里的int 就是在Inspector里图层的索引;

如下图,被红色圈起来的就是图层的索引:

我实现的这个射线检测无论怎样都无法检测出Player图层;

Physics.Raycast(CharacterCamera.transform.position, transform.TransformDirection(Vector3.forward),out hitInfo, maxShootDistance, 6);

? 其实这里第四个参数其实对应的是2^(索引);

如果要获得Player图层的话,第四个参数应该填上2的6次方,也就是64才对;

使用LayerMask.GetMask("Player")代替64也是同样的效果,因为它的返回值就是64;

Physics.Raycast(CharacterCamera.transform.position, transform.TransformDirection(Vector3.forward),out hitInfo, maxShootDistance, LayerMask.GetMask("Player"));

拓展:

如果要检测多个图层的话,直接用LayerMask.GetMask("图层名1",“图层名2”,“图层名3”....);

返回值是各个图层对应的LayerMask.GetMask的返回值相加得到的和;

LayerMask.GetMask("图层名1",“图层名2”,“图层名3”)

等价于

LayerMask.GetMask("图层名1")+LayerMask.GetMask(“图层名2”)+LayerMask.GetMask(“图层名3”);

因为unity的图层使用int32来表示的,也就是2的32次方,公有32个图层(0~31),如图

图层相加的值能被唯一分解;

假设图层和是65的话,那么能确定图层分别是图层0和图层6,就是(2^0+2^6);


另外,可以用LayerMask.NameToLayer("图层名")获取图层的索引;

例如:

LayerMask.NameToLayer("Player") 等于 6;

所以上面的代码可以替换:

1.位运算,右移

LayerMask.GetMask("Player")?

等价于

1<<LayerMask.NameToLayer("Player")

2.右移位运算和按位或(图层都有32位,每个图层都只有一位为1,其余都为0,在这个条件下,按位或运算等于加法)

LayerMask.GetMask("图层名1",“图层名2”)

等价于?

1<<LayerMask.NameToLayer("图层1")|1<<LayerMask.NameToLayer("图层2")

文章来源:https://blog.csdn.net/weixin_73569934/article/details/134960730
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。