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
相关产品推荐
相关产品推荐

