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

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

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

相关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[]结构体。

列子如下:
using
 UnityEngine;
using System.Collections;

public class RayTest : MonoBehaviour {

    // Use this for initialization
    void Start ()
    {
        mainCrma = Camera.main;
    }
    private Camera mainCrma;
    private RaycastHit objhit;
    private Ray _ray;
    void Update () 
    {
        if (Input.GetMouseButtonDown(0)) 
        {
            _ray=mainCrma.ScreenPointToRay(Input.mousePosition);//从摄像机发出一条射线,到点击的坐标
            Debug.DrawLine(_ray.origin,objhit.point,Color.red,2);//显示一条射线,只有在scene视图中才能看到

            if (Physics.Raycast (_rayout objhit100)) 
            {
                GameObject gameObj = objhit.collider.gameObject;

                Debug.Log("Hit objname:"+gameObj.name+"Hit objlayer:"+gameObj.layer);
            }
        }
    }

图片
    




layerMask参数:  

Raycast (ray : Ray, out hitInfo : RaycastHit, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers)

其实很简单:1 << 10  打开第10的层。

~(1 << 10) 打开除了第10之外的层。

~(1 << 0) 打开所有的层。

(1 << 10) | (1 << 8) 打开第10和第8的层。

列子如下:
using UnityEngine;
using System.Collections;

public class LayerMaskTest : MonoBehaviour {
    
    // Use this for initialization
    void Start () 
    {
        mainCrma = Camera.main;
        mask = 1<<( LayerMask.NameToLayer("cube"));//实例化mask到cube这个自定义的层级之上。
    }
    
    //private LayerMask mask 1<<10;
    private LayerMask mask;
    private Camera mainCrma;
    private RaycastHit objhit;
    private Ray _ray;
    void Update () 
    {
        if (Input.GetMouseButtonDown(0)) 
        {
            _ray=mainCrma.ScreenPointToRay(Input.mousePosition);//从摄像机发出一条射线,到点击的坐标
            Debug.DrawLine(_ray.origin,objhit.point,Color.red,2);//划出射线,只有在scene视图中才能看到

            if (Physics.Raycast (_ray,out objhit100mask.value))
            {
                GameObject gameObj = objhit.collider.gameObject;

                Debug.Log("Hit objname:"+gameObj.name+"--Hit objlayerName:"+LayerMask.LayerToName (10));
            }
            
        }
        
    }
}
 
 创建2个cube,一个layer设置为:cube  一个layer设置为:Default
运行如下:
图片


相关文章
|
图形学
Unity射线检测的避坑指南
Unity射线检测的避坑指南
|
11天前
|
安全 图形学
Unity射线检测的“坑”
在 Unity 中,射线检测是常用功能,但也存在一些常见问题。首先是层(Layer)设置问题,如射线忽略某些层或误检测到不期望的层,需正确设置 LayerMask。其次是碰撞体相关问题,包括碰撞体未启用或类型不匹配,确保碰撞体启用并合理设置属性。再者是射线起始点和方向问题,错误的位置或方向计算会导致检测失败,需准确设置起始点和方向。此外,频繁进行射线检测或检测范围过大会影响性能,应减少检测次数并合理设置范围。最后,在多线程中进行射线检测可能导致错误,应避免在非主线程中直接调用射线检测。
|
11天前
|
图形学
Unity 射线移动物体Ray
在Unity中,通过射线检测实现3D物体的拖拽和移动。射线由起点和方向组成,使用`Physics.Raycast`检测与物体的交点。点击物体时,记录位置偏移量,拖动过程中更新物体位置。代码包括基本拖拽和上下拖动功能,适用于正交摄像机场景。测试时为物体设置特定标签(如&quot;JQR&quot;)以便区分和操作。 示例代码展示了如何通过鼠标事件控制物体移动,并结合层级掩码优化射线检测。具体实现包括:点击选中物体、拖动更新位置、释放鼠标取消选择。此外,提供了上下拖动的额外功能,通过按键切换模式。
|
12天前
|
图形学
unity 扇形范围检测目标
本文介绍了两种实现扇形范围检测的方法。第一种方法通过计算目标点与技能释放者之间的距离和夹角,判断目标是否在指定的扇形范围内。代码主要利用了`Vector3.Distance`和`Vector3.Dot`进行距离和角度的计算。 第二种方法则使用摄像机射线检测,分为两个脚本:一个挂载在摄像机上,负责发射多条射线并检测碰撞对象;另一个挂载在目标物体上,处理被发现后的逻辑。摄像机脚本通过`Physics.Raycast`检测敌人或障碍物,并调用目标物体的响应函数。该方法适用于更复杂的场景,如视野检测和敌人发现机制。
|
6月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
340 6
|
6月前
|
图形学
小功能⭐️Unity解决物体移动速度过快不能检测到碰撞
小功能⭐️Unity解决物体移动速度过快不能检测到碰撞
|
9月前
|
C# 图形学
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
142 0
|
图形学
Unity小游戏——武士和怪物的碰撞检测
Unity小游戏——武士和怪物的碰撞检测
115 0
|
数据可视化 图形学
Unity射线编程详解
Unity射线编程详解
132 0