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

透视相机下2D射线检测无碰撞返回问题求助

问题分析与解决方案

你的代码核心问题在于射线方向的计算逻辑错误:ScreenToViewportPoint返回的是相机视口空间的坐标(范围0~1,以相机左下角为原点),和世界空间中的玩家位置transform.position直接相减,得到的方向完全不符合透视相机下的世界空间方向逻辑,这就是切换透视相机后功能失效的原因。

修正后的代码

void RaycastToCollider()
{
    // 获取从透视相机指向鼠标位置的世界空间射线
    Ray cameraRay = Camera.main.ScreenPointToRay(Input.mousePosition);
    
    // 提取射线的方向(从玩家朝向鼠标对应的世界方向)
    Vector3 worldDirection = cameraRay.direction;
    
    // 创建从玩家位置出发,朝向鼠标方向的射线
    Ray playerRay = new Ray(transform.position, worldDirection);
    
    // 检测2D碰撞体
    RaycastHit2D hit = Physics2D.GetRayIntersection(playerRay, Mathf.Infinity);
    
    if (hit.collider != null)
    {
        // 绘制射线到命中点,方便调试
        Debug.DrawLine(playerRay.origin, hit.point, Color.red);
    }
    else
    {
        // 未命中时绘制长射线,验证方向是否正确
        Debug.DrawLine(playerRay.origin, playerRay.origin + worldDirection * 100f, Color.blue);
    }
}

额外注意事项

  • 确认相机已设置为透视模式(Camera组件Projection属性选择Perspective)
  • 目标对象的2D碰撞体组件(如BoxCollider2D、CircleCollider2D)已启用,且所在图层未被Physics2D射线检测排除
  • 如需限制检测特定图层,可使用Physics2D.GetRayIntersection的重载版本,传入LayerMask参数

内容的提问来源于stack exchange,提问作者Tommy Steenrod

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:45:36