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

原创 2016年09月08日 12:57:49

在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正无穷等值

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

[Unity3D]射线碰撞检测+LayerMask的使用

射线:射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射 。用途:在unity中射线应用范围比较广, 多用于碰撞检测(如:子弹飞行是否击中目标)、角色...

Unity3D中Layers和LayerMask解析

Unity中是用int32来表示32个Layer层。int32表示二进制一共有32位(0—31)。 在Unity中可编辑的Layer如下图所示:在Unity中每个GameObject都有Layer属...
  • Vytal
  • Vytal
  • 2015年05月06日 10:30
  • 264

U3D 射线碰撞检测+LayerMask的使用

射线:射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射 。 用途:在unity中射线应用范围比较广, 多用于碰撞检测(如:子弹飞行是否击中目标)、...

Unity3D LayerMask 的使用

转自:https://www.cnblogs.com/mimime/p/6145744.html Unity是用 int32来表示32个Layer层,int32用二进制来表示一共有32位。 0000...

Unity3D的射线检测Physics.Raycast

Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo); Camera.main.ScreenPointToRay()

unity3D 从摄像机发射射线,检测画线

最近做项目的时候,有一个需要从摄像机发出一条射线,当射线检测到有碰撞物体的时候,点击鼠标左键开始画线。我是创立了一个平板drawing,当然Cube什么的也是可以的。                ...

unity射线碰撞检测+LayerMask的使用

unity射线碰撞检测+LayerMask的使用 http://www.unitymanual.com/thread-21402-1-1.html (出处: -游戏开发者社区【游戏蛮牛】unity...

[Unity]Ray射线物理检测碰撞和LayerMask的使用

射线:射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射 。用途:在unity中射线应用范围比较广, 多用于碰撞检测(如:子弹飞行是否击中目标)、角色...

Unity3D Ray射线

  • 2013年08月24日 22:00
  • 66KB
  • 下载

【Unity3D游戏开发】基础知识之Tags和Layers (三二)

Tags和Layers分别表示是Unity引擎里面的标签和层,他们都是用来对GameObject进行标识的属性,Tags常用于单个GameObject,Layers常用于一组的GameObject。添...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity3D射线检测如何使用Layers和LayerMask
举报原因:
原因补充:

(最多只允许输入30个字)