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

Unity中ScreenPointToRay射线方向异常问题求助

Unity 2021.3.12 3D物体点击检测故障排查方案

问题现象

  • OnMouseDown、EventTrigger均无响应,手动射线检测时ScreenPointToRay生成的射线方向严重偏离预期:相机位于(0,0,-10)、Cube(带Box Collider)位于(0,0,0)的场景下,正常射线应从相机指向Cube方向,但实际射线指向-X方向,仅鼠标移至屏幕右上角时接近正确方向。

核心排查与修复方案(基础设置遗漏点)

1. 新输入系统坐标适配问题

你使用了新输入系统的Mouse.current.position.ReadValue(),但ScreenPointToRay需要的是屏幕像素坐标(以屏幕左下角为原点),而新输入系统返回的是设备无关像素(DP)坐标,二者不匹配导致射线方向错误。

修复代码:

private void Update()
{
    Vector2 mouseDP = Mouse.current.position.ReadValue();
    // 将DP坐标转换为屏幕像素坐标
    Vector2 screenPixelPos = new Vector2(
        mouseDP.x * Screen.width / Display.main.systemWidth,
        mouseDP.y * Screen.height / Display.main.systemHeight
    );
    Ray ray = Camera.main.ScreenPointToRay(screenPixelPos);
    Debug.DrawRay(ray.origin, ray.direction * 100, Color.yellow);

    if (Mouse.current.leftButton.wasPressedThisFrame)
    {
        print("mouse is down");
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit, 10000f))
        {
            print($"hit object: {hit.collider.gameObject.name}");
        }
    }
}

或者直接切换回旧输入系统:打开Edit > Project Settings > Player,将Active Input Handling设为Input Manager (Old),然后用Input.mousePosition替代Mouse.current.position.ReadValue()。

2. 相机基础设置检查

  • 确认相机Projection模式为Perspective(透视模式),正交模式下射线方向逻辑与你的场景预期不符。
  • 检查相机Transform的欧拉角是否为(0,0,0),意外旋转会导致射线整体偏移。
  • 确保相机已勾选MainCamera标签,否则Camera.main会返回null,射线生成逻辑完全失效。

3. Collider与层设置验证

  • 确认Cube的Box Collider未被禁用,且Is Trigger未勾选(OnMouseDown需要非Trigger的Collider才能触发)。
  • 若使用了自定义层,射线检测时需指定层掩码,避免忽略Cube所在层:
int cubeLayer = 1 << LayerMask.NameToLayer("Default"); // 替换为Cube实际所在层
if (Physics.Raycast(ray, out hit, 10000f, cubeLayer))
{
    print("hit it");
}

4. 遮挡与碰撞忽略检查

  • 排查场景中是否有其他物体的Collider遮挡Cube,导致射线无法命中。
  • 检查是否存在Physics.IgnoreCollision设置,禁止了相机射线与Cube Collider的交互。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:01:29