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

多显示器扩展模式下正交相机调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:06:01