多显示器扩展模式下正交相机调用ScreenToWorldPoint坐标转换错误问题
问题根因
- 该异常由Unity多显示器扩展模式下的坐标系适配缺陷导致:
Input.mousePosition默认返回系统全局虚拟桌面的鼠标坐标,而Camera.ScreenToWorldPoint默认仅以游戏窗口所在显示器的分辨率作为坐标转换基准,两者的坐标系原点不一致时就会出现偏移 - 先启动游戏再接入第二显示器时不会触发问题,是因为Unity启动时仅读取一次显示器参数,运行过程中不会主动更新多显示器的坐标配置
- 你观测到的左下角偏右(180,0)像素为校准点,恰好是全局虚拟桌面原点到游戏窗口左边缘的水平偏移量,该点下全局坐标与游戏窗口相对坐标值相等,因此转换结果正确,距离该点越远偏移量越大
修复方案
- 先将全局鼠标坐标转换为游戏窗口的相对坐标,再传入
ScreenToWorldPoint做转换,替换原有转换逻辑即可,示例代码如下:
// 获取全局鼠标坐标 Vector3 globalMousePos = Input.mousePosition; // 获取Unity游戏窗口在全局虚拟桌面的偏移量(Unity2021及以上版本直接支持Screen.mainWindowPosition) Vector2 windowOffset = Screen.mainWindowPosition; // 换算为游戏窗口内的相对坐标 Vector3 localMousePos = new Vector3( globalMousePos.x - windowOffset.x, globalMousePos.y - windowOffset.y, // Z值设为相机到游戏逻辑平面的距离,正交相机可直接用近裁剪面距离 Camera.main.nearClipPlane ); // 得到正确的世界坐标 Vector3 correctWorldPos = Camera.main.ScreenToWorldPoint(localMousePos);
- 若使用低于2021的Unity版本,无法直接获取
Screen.mainWindowPosition,可调用对应系统的窗口API(如Windows的GetWindowRect)获取Unity窗口的全局位置计算偏移量 - 若游戏仅需单显示器运行,可在Player Settings中勾选Force Single Display配置项,启动时强制禁用多显示器坐标适配逻辑
- 若两台显示器的系统DPI缩放比例不同,需要将窗口偏移量乘以对应显示器的DPI缩放系数后再做坐标换算
内容的提问来源于stack exchange,提问作者User826481
相关产品推荐
相关产品推荐

