Physics.Raycast 是 Unity 提供的一个物理射线检测方法,用于从一个点沿某个方向发射一条射线,检测是否与物体(带有 Collider 的物体)发生碰撞。

它常用于:

  • 鼠标点击射线检测(如点击物体)。
  • 射击武器的命中检测。
  • 碰撞检测(如角色检测地面或墙壁)。
  • 视线检测(如判断某点是否被遮挡)。

一、函数签名

(1)Unity 提供了多种重载版本的 Physics.Raycast 函数,以下是常见的签名:

bool Raycast(Vector3 origin, Vector3 direction, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);

参数解释

  1. Vector3 origin

    • 射线的起点(世界坐标系中的位置)。
    • 通常是摄像机、角色位置或某个物体的起始点。
  2. Vector3 direction

    • 射线的方向(一个归一化的向量)。
    • 决定射线的发射方向。
  3. float maxDistance

    • 射线的最大长度(可选,默认为无穷大 Mathf.Infinity)。
    • 通过此参数可以限制射线的检测范围,超出范围的物体不会被检测到。
  4. int layerMask

    • 用于过滤检测的层级(可选,默认检测所有层)。
    • 通过设置 LayerMask,你可以选择射线仅检测某些特定的物体。
  5. QueryTriggerInteraction queryTriggerInteraction

    • 决定射线是否与触发器(isTriggertrueCollider)发生交互(可选,默认使用全局设置)。
    • 可选值:
      • UseGlobal:使用全局设置。
      • Ignore:忽略触发器。
      • Collide:检测触发器。

 (2)带返回信息的 Physics.Raycast

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

新增参数

  • out RaycastHit hitInfo
    • 通过 out 参数返回 RaycastHit 结构体,包含射线检测到的碰撞信息(如碰撞点、法线、碰撞物体等)。

RaycastHit 的常见属性

  • hitInfo.point:碰撞发生的世界坐标。
  • hitInfo.collider:与射线碰撞的 Collider组件
  • hitInfo.transform: 与射线碰撞的物体的Transform组件。
  • hitInfo.distance:射线起点到碰撞点的距离。

二、常用示例

(1)检测鼠标点击的物体

void Update()
{
    // 从摄像机发射射线到鼠标位置
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    if (Physics.Raycast(ray, out RaycastHit hit, 100f))
    {
        Debug.Log("Hit object: " + hit.collider.name); // 输出被点击的物体名称
        Debug.DrawLine(ray.origin, hit.point, Color.red); // 在 Scene 视图中画出射线
    }
}

(2)检测特定层的物体

void Update()
{
    // 设置只检测 "Enemy" 层
    int layerMask = LayerMask.GetMask("Enemy");
    
    // 从摄像机发射射线
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    if (Physics.Raycast(ray.origin, ray.direction, out RaycastHit hit, Mathf.Infinity, layerMask))
    {
        Debug.Log("Hit Enemy: " + hit.collider.name);
    }
}

(3)检测触发器和普通碰撞体

void Update()
{
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    // 忽略触发器
    if (Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity, Physics.DefaultRaycastLayers, QueryTriggerInteraction.Ignore))
    {
        Debug.Log("Hit non-trigger object: " + hit.collider.name);
    }
}

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐