Unity3D射线检测如何使用Layers和LayerMask

在Unity中用int32数据类型来表示32个Layer层,int32表示二进制一共有32位(0—31)。在Unity中每个GameObject都有Layer属性,默认的Layer都是Default。在Unity中可编辑的Layer共有24个(8—31层),官方已使用的是0—7层,默认不可编辑!如图:
这里写图片描述 这里写图片描述

在代码中使用layers时,先了解
按位运算符:左移运算符<<,左移表示乘以2,左移多少位表示乘以2的几次幂。

在Unity中使用LayerMask时,如何正确开启某个Layer?
LayerMask mask = 1 << 你需要开启的Layers层。
LayerMask mask = 0 << 你需要关闭的Layers层。
左移运算符右端是你希望产生碰撞的层的层号,如上图我想让名为Icon的层和射线产生碰撞,代码里应该这样写:

LayerMaks mask = 1 << 11;

或者:

LayerMaks mask = 1 << (LayerMask.NameToLayer("Icon"));

射线部分的代码:

if (Input.GetTouch(0).phase == TouchPhase.Began)
{
    Ray ray = Camera.main.ScreenPointToRay(Input.GetTouch(0).position);
             RaycastHit rh = new RaycastHit();
             if (Physics.Raycast(ray, out rh, Mathf.Infinity, mask.value))
{
     Log.log("碰撞体的名字:" + rh.collider.name);
 }

关于LayerMask的其他一些方法:

LayerMask.LayerToName 层转名称:

using UnityEngine;using System.Collections; 
public class ExampleClass : MonoBehaviour {   
    void Example() {        Debug.Log(LayerMask.LayerToName(1));   
  }}

LayerMask.NameToLayer 名称转层:

using UnityEngine;using System.Collections; 
public class ExampleClass : MonoBehaviour {    void Example() {        Debug.Log(LayerMask.NameToLayer("TransparentFX"));    }}

LayerMask.value 值:

using UnityEngine;
using System.Collections; 
public class ExampleClass : MonoBehaviour {    
public LayerMask mask = -1;    
void Update() {        
if (Physics.Raycast(transform.position, transform.forward, 100, mask.value))
            Debug.Log("Hit something");     }
            }

LayerMask.GetMask 获取蒙版:

using UnityEngine;
using System.Collections; 
public class ExampleClass : MonoBehaviour {    void Example() {        Debug.Log(LayerMask.GetMask("UserLayerA", "UserLayerB"));    }}

Unity中射线默认是碰到碰撞体就停止发射
关于Physics.Raycast射线投射:
这里写图片描述
Physics.Raycast(ray, out rh, Mathf.Infinity, mask_button.value)
注意第三个参数是距离,
(1)可以是10,100,2000等具体的值
(2)也可以是Mathf.NegativeInfinity负无穷,Mathf.Infinity正无穷等值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值