unity3d 射线检测层_unity3d射线检测 - CSDN
  • Unity中用int32数据类型来表示32个Layer,int32表示二进制一共有32位(0—31)。在Unity中每个GameObject都有Layer属性,默认的Layer都是Default。在Unity中可编辑的Layer共有24个(8—31),官方已使用的是0...

    在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射线检测方法

    2018-06-27 00:11:23
    在开发中,尤其是跟模型与交互的时候,都会用到射线检测,这篇文章给大家分享一些射线检测的方法实现。射线:射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射...
    在开发中,尤其是跟模型与交互的时候,都会用到射线检测,这篇文章给大家分享一些射线检测的方法实现。

    射线:射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射 。

    用途:射线应用范围比较广, 多用于碰撞检测(如:子弹飞行是否击中目标)、角色移动等。

    相关API:

    1、Ray Camera.main.ScreenPointToRay(Vector3 pos)   返回一条射线Ray从摄像机到屏幕指定一个点

    2、Ray Camera.main.ViewportPointToRay(Vector3 pos)  返回一条射线Ray从摄像机到视口(视口之外无效)指定一个点

    3、Ray 射线类

    4、RaycastHit 光线投射碰撞信息

    5、bool Physics.Raycast(Vector3 origin, Vector3 direction, float distance, int layerMask)
    当光线投射与任何碰撞器交叉时为真,否则为假。

    bool Physics.Raycast(Ray ray, Vector3 direction, RaycastHit out hit, float distance, int layerMask)
    在场景中投下可与所有碰撞器碰撞的一条光线,并返回碰撞的细节信息()。

    bool Physics.Raycast(Ray ray, float distance, int layerMask)
    当光线投射与任何碰撞器交叉时为真,否则为假。

    bool Physics.Raycast(Vector3 origin, Vector3 direction, RaycastHit out hit,float distance, int layerMask)
    当光线投射与任何碰撞器交叉时为真,否则为假。

    注意:如果从一个球型体的内部到外部用光线投射,返回为假。

    参数理解:
    • origin : 在世界坐标中射线的起始点
    • direction : 射线的方向
    • distance :  射线的长度
    • hit : 使用c#中out关键字传入一个空的碰撞信息类,然后碰撞后赋值。可以得到碰撞物体的transform,rigidbody,point等信息。
    • layerMask : 只选定Layermask层内的碰撞器,其它层内碰撞器忽略。 选择性的碰撞

    6、RaycastHit[] RaycastAll(Ray ray, float distance, int layerMask)
    投射一条光线并返回所有碰撞,也就是投射光线并返回一个RaycastHit[]结构体。

    下面一个利用射线做的拾取的小例子(将代码直接拖拽到主相机上)
    AخA
     
    1
    using UnityEngine;  
    2
       using System.Collections;  
    3
       public class RayTest : MonoBehaviour   
    4
           // Use this for initialization  
    5
           void Start ()   
    6
            
    7
           // Update is called once per frame  
    8
           void Update ()  
    9
             
    10
               if(Input.GetMouseButton(0))  
    11
                 
    12
                   Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//从摄像机发出到点击坐标的射线  
    13
                   RaycastHit hitInfo;  
    14
                  if(Physics.Raycast(ray,out hitInfo))  
    15
                    
    16
                       Debug.DrawLine(ray.origin,hitInfo.point);//划出射线,只有在scene视图中才能看到  
    17
                       GameObject gameObj = hitInfo.collider.gameObject;  
    18
                       Debug.Log("click object name is " + gameObj.name);  
    19
                       if(gameObj.tag == "boot")//当射线碰撞目标为boot类型的物品 ,执行拾取操作  
    20
                         
    21
                           Debug.Log("pick up!");  
    22
                         
    23
                     
    24
                 
    25
             
    26
         


    nainaitea.com

    展开全文
  • Unity3D射线检测

    2017-08-08 17:01:35
    开发中我们经常遇到鼠标和三维物体交互的需求,要操作三维空间的物体,首先要选中这个物体,这时候就需要我们经常用到的射线检测。 一.单射线检测单个物体 代码使我们通用的射线检测代码,注释也已经标识上去了。 //...

    开发中我们经常遇到鼠标和三维物体交互的需求,要操作三维空间的物体,首先要选中这个物体,这时候就需要我们经常用到的射线检测。

    一.单射线检测单个物体

    代码使我们通用的射线检测代码,注释也已经标识上去了。

    // Update is called once per frame
    	void Update ()
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//从摄像机沿着屏幕鼠标位置方向发射一条射线
            RaycastHit hit; //射线检测返回的信息
            if (Physics.Raycast(ray, out hit)
            {
                if (hit.collider.CompareTag("model"))
                {
                    Debug.Log("选中Tag为model的物体");
                }
            }
        }
    当然如果项目中有些物体因为需要发生物理碰撞必须要加上collider而又不想被射线检测到,这时候我们就可以使用layMasker来选择性射线检测。代码如下:

     private float maxDistance = 1000f;//射线的最大长度
    
        private LayerMask lm1=1 <<8; // 只检测到Layer层id为8的物体
    
        private LayerMask lm2 = ~(1 << 8);//只检测不到Layer层id为8的物体
    
        private LayerMask lm3 = (1 << 8) | (1 << 9);//只检测不到Layer层id为8和9的物体
    
    
        // Update is called once per frame
        void Update ()
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//从摄像机沿着屏幕鼠标位置方向发射一条射线
            RaycastHit hit; //射线检测返回的信息
            if (Physics.Raycast(ray, out hit, 1000, lm1))//射线只能检测到layer层id为8的物体
            {
                if (hit.collider.CompareTag("model"))
                {
                    Debug.Log("选中Tag为model的物体");
                }
            }
        }
    二.射线检测返回物体信息数组

    获取射线检测到的所有物体。以数组的形式返回所有碰撞体信息。

    private RaycastHit[] hits;
    
        private void Update()
        {
            Ray ray= Camera.main.ScreenPointToRay(Input.mousePosition);//从摄像机沿着屏幕鼠标位置方向发射一条射线
            hits = Physics.RaycastAll(ray);  //将所有射线检测到的物体以数组形式保存下来
    
            Debug.Log("改射线碰撞检测到"+hits.Length+"个物体");
        }
    以上代码是我觉得我们会经常使用到的射线代码,可是满足大部分项目需求。希望对你有帮助。

    好记性不如烂笔头。我觉得即使我现在了解的滚瓜烂熟,只怕时间一长还是会忘了部分细节。所以在记录下来的同时还可以给大家一个帮助。一起进步吧!



    展开全文
  • unity中的射线检测方法Physics.Raycast,可以从目标点朝目标方向发射一条无限长或固定长度的射线,此外我们可以设置其与特定的碰撞:Ray ray = new Ray(Vector3.zero, Vector3.forward); int layerMask = 1 ; if ...

    unity中的射线检测方法Physics.Raycast,可以从目标点朝目标方向发射一条无限长或固定长度的射线,此外我们可以设置其与特定层的碰撞:

    Ray ray = new Ray(Vector3.zero, Vector3.forward);
    int layerMask = 1 << 10;
    if (Physics.Raycast(ray, 30.0f, layerMask))
    {
        ......
    }

    这样就可以检测在目标方向上30距离内是否有第10层的物体存在。

    在Edit->Project Settings->Tags and Layers中可以看到Layers的编号
    此外,如果想射线不与某层发生碰撞,只需要将layerMask按位求补,表示检测除第10层以外的层的碰撞:

    Ray ray = new Ray(Vector3.zero, Vector3.forward);
    int layerMask = 1 << 10;
    layerMask = ~layerMask;
    if (Physics.Raycast(ray, 30.0f, layerMask))
    {
        ......
    }

    这样Raycast将无视与第10层的碰撞。

    layermask参数设置的一些总结:
    1 << 10 打开第10的层。
    ~(1 << 10) 打开除了第10之外的层。
    ~(1 << 0) 打开所有的层。
    (1 << 10) | (1 << 8) 打开第10和第8的层。

    展开全文
  • Unity中的射线检测做一个记录 射线检测: 记录一下Unity射线检测的基本用法: if (Input.GetMouseButtonDown(0)) //点击了鼠标左键 { //以主摄像机,将屏幕上的一个点转换为射线 Ray ray=Camera....
  • 这一篇是纯技术讨论,看过我前面文章的童鞋应该清楚,我的奔跑是靠鼠标响应的,鼠标点到哪就跑到哪,...那界面多了会累死的, 好在我们有标签和这两个神器,所以我这里介绍两种方案,都能达到效果。 方...
  • Unity3D射线检测

    2019-10-25 14:40:15
    射线检测主要用于像子弹是否打中物体,捡取物品等情况,本来面向百度想找例子看看, 不过没找到合适的,还是自己总结尝试吧。 以下测试Unity3D版本:2017.4.2f2 射线的检测步骤如下: 1.Ray 这个类为了产生一...
  • unity3D 射线检测

    2018-05-07 13:22:02
    在开发中,尤其是跟模型与交互的时候,都会用到射线检测,这篇文章给大家分享一些射线检测的方法实现。 射线:射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止...
  • 这一篇是纯技术讨论,看过我前面文章的童鞋应该清楚,我的奔跑是靠鼠标响应的,鼠标点到哪就跑到哪,后来又有了界面,麻烦就来了,我的界面竟然能点 穿,我不希望点界面的时候还能点到界面后面的地面上,角色傻不拉...
  • [Unity3D]射线碰撞检测+LayerMask的使用 转射线射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射 。 用途:在unity中射线应用范围比较广, 多用于碰撞检测...
  • Unity3D 射线碰撞检测

    2018-12-22 20:59:19
    //鼠标位置 private Vector3 ... //3D射线的碰撞信息,就存储在这里 private RaycastHit hitInfo3D; //射线碰撞的标记,与哪些进行碰撞 private int hitMask; // Use this for initialization ...
  • 射线是在三维世界中从一个点沿一个方向发射的一条无限长的线。在射线的轨迹上,一旦与添加了碰撞器的模型发生碰撞,将停止发射。我们可以利用射线实现子弹击中目标的检测,鼠标点击拾取物体等功能。Ray射线类和...
  • 这阵子通过看视频,看书对unity射线碰撞检测,有了一些了解,这里我把它总结一下写下来,希望能帮助到你们,也希望通过各位大神来指正不足之处; 射线碰撞检测,就是由某一物体发射出一道射线射线碰撞到物体...
  • unity中的射线检测方法Physics.Raycast 有时侯我们想在射线检测的时候忽略掉某些物体的碰撞,从而达到检测物体背后的物体的碰撞,这是个时候我们使用layerMask layerMask参数使用按位与&lt;&lt;设置的...
  • unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子 最近开始研究U3D,它的强大就不多说了, 今天研究了研究射线相关东西,总结了些东西放上来,一来做个笔记,二来和大家分享分享!嘿嘿~ 如果有不对的...
  • //3D射线 if (Input.GetMouseButton(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//从摄像机发出到点击坐标的射线 RaycastHit hitInfo; if (Physics.Raycast(r
  • 射线射线3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射。 用途:射线应用范围比较广,多用于碰撞检测(如:子弹飞行是否击中目标)、角色移动等 等。 ...
  • Ray2D ray = new Ray2D(transform.position, Vector2.right); Debug.DrawRay(ray.origin, ray.direction, Color.blue); RaycastHit2D info = Physics2D.Raycast(ray.origin, ray.direction...
  • unity 射线检测总结

    2019-12-13 16:35:58
    3D射线检测: 1.射线普通检测,如果 Ray 跟系统命名冲突,只需要在前面加上 UnityEngine. 就行了 UnityEngine.Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; ...
1 2 3 4 5 ... 20
收藏数 1,032
精华内容 412
关键字:

unity3d 射线检测层