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

Unity中如何正确获取鼠标在XY平面的世界坐标

原代码问题

你现有代码的计算逻辑存在本质偏差:

  • ScreenToWorldPoint方法传入的z参数,是相对于相机本地视锥体的深度值,不是世界坐标系下的Z轴坐标
  • 你在拿到深度为1单位的转换点后,硬将其Z轴值改为0,得到的根本不是鼠标视线与XY平面(Z=0)的真实交点,透视相机下坐标偏移会非常明显,完全达不到瞄准功能的精度要求。
正确实现(无碰撞体依赖、全相机模式适配)

最稳定的方案是通过射线与数学平面求交实现,不需要在场景中添加额外碰撞组件,性能开销极低,精度完全满足瞄准、射线检测类需求:

// 全局缓存XY平面对象:法线沿Z轴正方向,过世界原点
private readonly Plane _xyPlane = new Plane(Vector3.forward, Vector3.zero);
private Camera _mainCam;

private void Awake()
{
    _mainCam = Camera.main;
}

private void Get3dMousePoint()
{
    // 从相机发射穿过鼠标屏幕位置的射线
    Ray mouseRay = _mainCam.ScreenPointToRay(Input.mousePosition);
    // 计算射线与XY平面的相交距离
    if (_xyPlane.Raycast(mouseRay, out float enterDist))
    {
        // 沿射线取相交距离对应的点,就是XY平面上的准确世界坐标
        Vector3 worldPosition = mouseRay.GetPoint(enterDist);
        // 该坐标z值天然为0,无需额外强制赋值
    }
}
适配说明
  • 该方法同时兼容正交相机、透视相机,不受相机位置、旋转、FOV参数影响
  • 如果你的目标XY平面不在Z=0的位置,只需要调整平面构造参数即可,例如平面位于Z=3高度时,将平面初始化改为new Plane(Vector3.forward, new Vector3(0,0,3))
  • 计算过程完全走数学运算,不会和场景中其他碰撞体产生误交互,适合2D游戏、3D游戏顶视角瞄准类功能开发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:24:21