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中射线应用范围比较广, 多用于碰撞检测(如:子弹飞行是否击中目标)、角色...
  • s10141303
  • s10141303
  • 2014年05月26日 19:45
  • 10634

【Unity】射线中LayerMask参数的使用方式

void Update () { if (Input.GetMouseButtonDown(0)) { // 只检测第6层 LayerMask mask1 = 1 ...
  • sinat_20559947
  • sinat_20559947
  • 2015年11月09日 17:49
  • 5283

关于Unity3d中的LayerMask使用

最近看别人写的Demo,里面这个Linecast字段的LayerMask参数看了半天也没看懂 void Update()     {         // The player is gro...
  • Monzart7an
  • Monzart7an
  • 2014年03月30日 20:46
  • 31322

Unity3D 射线指定层获取GameObject 注意 LayerMask

这一篇是纯技术讨论,看过我前面文章的童鞋应该清楚,我的奔跑是靠鼠标响应的,鼠标点到哪就跑到哪,后来又有了界面,麻烦就来了,我的界面竟然能点 穿,我不希望点界面的时候还能点到界面后面的地面上,角色傻不拉...
  • eCaiFu800
  • eCaiFu800
  • 2015年03月19日 04:48
  • 2057

Unity 3D中的射线与碰撞检测

在我们的游戏开发过程中,有一个很重要的工作就是进行碰撞检测。例如在射击游戏中子弹是否击中敌人,在RPG游戏中是否捡到装备等等。在进行碰撞检测时,我们最常用的工具就是射线,Unity 3D的物理引擎也为...
  • u014805066
  • u014805066
  • 2016年09月06日 22:44
  • 11475

unity3d 2d 射线检测

Physics2D.LinecastNonAlloc 直线投射不分配内存 C# ⇒ static int LinecastNonAlloc(Vector2 start, Vector2 end, R...
  • microsoftMSDNNET
  • microsoftMSDNNET
  • 2015年09月01日 18:39
  • 3629

射线检测与LayerMask

在游戏中,点击捡起物品可以说是比较常见的需求,今天这篇博文主要就其中用到的技术做一个简单的介绍:射线检测与LayerMask首先新建场景,在场景中新建一个Cube,并在MainCameara挂上脚本,...
  • Poisones
  • Poisones
  • 2017年10月15日 13:04
  • 83

Unity3d中的射线检测方法

Ray: 一般来讲常用的检测点击物体,是否穿过物体大多会用到发射射线来进行辅助测试,在U3D中射线Ray为只有起点和方向的结构体,例如从主摄像机发射一条射线到鼠标点击地点:Camera.main.Sc...
  • Karigurashi
  • Karigurashi
  • 2017年09月23日 17:01
  • 198

unity中射线碰撞检测总结

这阵子通过看视频,看书对unity中射线碰撞检测,有了一些了解,这里我把它总结一下写下来,希望能帮助到你们,也希望通过各位大神来指正不足之处;     射线碰撞检测,就是由某一物体发射出一道射线,射线...
  • CJB_King
  • CJB_King
  • 2016年08月02日 09:05
  • 10274

unity射线检测忽略某层的方法

unity中的射线检测方法Physics.Raycast,可以从目标点朝目标方向发射一条无限长或固定长度的射线,此外我们可以设置其与特定层的碰撞:Ray ray = new Ray(Vector3.z...
  • BIG_C_GOD
  • BIG_C_GOD
  • 2017年04月02日 22:15
  • 4072
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity3D射线检测如何使用Layers和LayerMask
举报原因:
原因补充:

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