Unity 之`Physics.Raycast()`方法,射线检测


在这里插入图片描述

总述

当你在Unity中使用Physics.Raycast()方法时,你实际上是在进行一种射线检测,以查看一条射线是否与场景中的碰撞体相交。这可以用来实现很多不同的功能,如点击选择物体、射击命中检测等。以下是Physics.Raycast()方法的详细介绍:

public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal)

参数解释

参数解释:

  • origin:射线的起点(3D世界坐标)。
  • direction:射线的方向(3D向量),通常应该是标准化的向量。
  • hitInfo:用于存储射线命中信息的RaycastHit结构的实例。如果命中发生,这个结构将包含有关命中的各种信息。
  • maxDistance:射线的最大长度。这是射线从起点向方向延伸的最大距离。如果射线未与碰撞体相交,或相交点距离起点超过最大距离,那么命中将被认为未发生。默认值为正无穷大(Mathf.Infinity)。
  • layerMask:一个可选的层级遮罩,用于指定射线应该检测哪些碰撞体。只有在指定的层级上的碰撞体会被考虑在内。默认为DefaultRaycastLayers,这通常是场景中的所有层级。
  • queryTriggerInteraction:一个枚举,用于控制射线是否应该与触发器碰撞体发生作用。你可以选择忽略触发器碰撞体,仅与非触发器碰撞体交互,或者与所有碰撞体都进行交互。默认为QueryTriggerInteraction.UseGlobal

形参

Physics.Raycast() 方法有五个必须的形参,以及两个可选的形参。以下是这些形参的详细说明:

  1. origin(必须):

    • 类型:Vector3
    • 描述:射线的起点,即射线发出的位置。
  2. direction(必须):

    • 类型:Vector3
    • 描述:射线的方向,通常应该是标准化的向量。
  3. hitInfo(必须):

    • 类型:out RaycastHit
    • 描述:用于存储射线命中信息的 RaycastHit 结构的实例。如果命中发生,这个结构将包含有关命中的各种信息。
  4. maxDistance(必须,可选):

    • 类型:float
    • 默认值:Mathf.Infinity
    • 描述:射线的最大长度。这是射线从起点向方向延伸的最大距离。如果射线未与碰撞体相交,或相交点距离起点超过最大距离,那么命中将被认为未发生。
  5. layerMask(必须,可选):

    • 类型:int
    • 默认值:DefaultRaycastLayers
    • 描述:一个可选的层级遮罩,用于指定射线应该检测哪些碰撞体。只有在指定的层级上的碰撞体会被考虑在内。
  6. queryTriggerInteraction(必须,可选):

    • 类型:QueryTriggerInteraction
    • 默认值:QueryTriggerInteraction.UseGlobal
    • 描述:一个枚举,用于控制射线是否应该与触发器碰撞体发生作用。你可以选择忽略触发器碰撞体,仅与非触发器碰撞体交互,或者与所有碰撞体都进行交互。

注意 前两个变量 射线的起点以及方向可以用 Ray 类型的变量来代替

前两个变量可以用Ray 来代替

Physics.Raycast() 方法的前两个形参分别是射线的起点和方向。这两个形参可以用一个完整的Ray对象来代替,因为Ray对象包含了起点和方向信息,从而更方便地表示一个射线。

Ray是一个Unity中的结构体,它包含了射线的起点和方向。当你在调用Physics.Raycast()时,你可以直接传递一个Ray对象作为第一个形参,而不需要单独提供起点和方向。

这种方式的好处是:

  1. 更简洁: 你不需要在每次调用Physics.Raycast()时单独提供起点和方向,而是将它们合并成一个Ray对象,使代码更简洁。
  2. 更可读: 传递一个Ray对象可以使代码更易读,因为它更清楚地表示了这是一个射线,并且将起点和方向联系在一起。

以下是使用Ray对象的示例:

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);  // 创建一个射线
if (Physics.Raycast(ray, out hitInfo, maxDistance)) {
    // 射线命中了某个物体
    // 在这里可以处理命中的物体信息
}

在这个示例中,我们创建了一个Ray对象,该对象代表了从主摄像机发出的射线,起点和方向都在ray对象中得到了体现。然后,我们将这个Ray对象传递给Physics.Raycast()方法,用于进行射线命中检测。

综上所述,传递一个Ray对象作为Physics.Raycast()的前两个形参可以提高代码的可读性和简洁性。

返回值

返回值:

  • 类型:bool
  • 描述:如果射线与碰撞体相交,返回 true,否则返回 false

如果Physics.Raycast()返回true,表示射线命中了一个碰撞体,你可以通过hitInfo变量来访问有关碰撞的信息,如:

  • hitInfo.point:碰撞点在世界空间中的位置。
  • hitInfo.normal:碰撞点处的碰撞体法线方向。
  • hitInfo.collider:被命中的碰撞体的引用。
  • 等等。

示例用法:

Ray ray = new Ray(rayOrigin, rayDirection);
if (Physics.Raycast(ray, out hitInfo, maxDistance)) {
    Debug.Log("Raycast hit at: " + hitInfo.point);
    Debug.Log("Hit object: " + hitInfo.collider.gameObject.name);
}

这个示例在rayOrigin处发射一条射线,如果射线命中了某个碰撞体,它将输出碰撞点和被命中对象的名称。

请注意,射线命中是基于物理模拟的,因此需要在物理场景中才会生效。同时,射线检测是一种较为简单的碰撞检测方法,适用于许多场景,但在某些情况下可能需要更复杂的碰撞检测方法。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>