You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity 2D射线检测问题:如何仅检测射线端点命中物体

问题:仅当射线端点(鼠标世界位置)落在物体上时触发检测

问题场景示意图

当前实现的射线检测在射线经过物体时就会触发检测,但需要仅当射线的端点(鼠标对应的世界位置)正好落在物体上时才进行检测。以下是当前使用的代码:

void RaycastSystem()
{
    Vector2 mousePosition = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
    Vector2 worldMousePosition = Camera.main.ScreenToWorldPoint(mousePosition);

    Vector2 rayDirection = worldMousePosition - (Vector2)transform.position;

    RaycastHit2D hit = Physics2D.Raycast(transform.position, rayDirection, rayDirection.magnitude, mask);
    Debug.DrawRay(transform.position, rayDirection, Color.red);
    //Debug.Log(worldMousePosition.x + " | " + worldMousePosition.y);

    if (hit.collider != null)
    {
        Debug.Log(hit.collider.gameObject);
    }
}

解决方案

你需要的不是射线检测,而是直接检测鼠标世界位置处的碰撞体,用Physics2D.OverlapPoint方法就能实现,它会检查指定世界坐标点是否在某个碰撞体内,完全匹配你的需求。

修改后的代码如下:

void RaycastSystem()
{
    Vector2 mousePosition = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
    Vector2 worldMousePosition = Camera.main.ScreenToWorldPoint(mousePosition);

    // 直接检测鼠标世界位置对应的碰撞体
    Collider2D hitCollider = Physics2D.OverlapPoint(worldMousePosition, mask);
    
    // 保留Debug绘制辅助调试,新增圆点标记鼠标位置
    Debug.DrawLine(transform.position, worldMousePosition, Color.red);
    Debug.DrawCircle(worldMousePosition, 0.1f, Color.blue);

    if (hitCollider != null)
    {
        Debug.Log(hitCollider.gameObject);
    }
}

核心说明

  • Physics2D.OverlapPoint会返回指定点上的第一个碰撞体(存在的话),精准实现“仅端点落在物体上才触发”的逻辑
  • 新增的Debug.DrawCircle可以直观标记鼠标的世界位置,方便你确认检测点是否正确
  • 无需再计算射线方向和长度,代码逻辑更简洁高效

内容的提问来源于stack exchange,提问作者Muhammed Eren

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:12:21