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

