Unity相机平移问题:仅单向移动且ScreenToWorldPoint返回X恒为0
相机平移问题的解决方案
问题原因分析
1. X坐标始终为0的原因
Input.mousePosition是屏幕空间坐标,其Z分量默认是0。ScreenToWorldPoint需要这个Z值确定屏幕点对应的世界空间深度——对于正交相机来说,这个值应等于相机到目标交互平面的距离(通常取相机位置Z值的相反数,因为正交相机一般朝向-z轴)。若Z值为0,转换后的世界坐标会被限制在相机近裁剪平面上,导致X/Y分量计算错误,出现X始终为0的情况。
2. 仅单方向平移的原因
本质和第一个问题同源:错误的世界坐标转换导致位移差值mouseWorldPosDiff异常,进而限制了相机的移动方向。
修正后的代码
private Vector3 mouseWorldPosStart; private void Pan() { // 右键按下时记录初始鼠标对应的世界位置(手动设置Z值) if (Input.GetMouseButtonDown(1)) { Vector3 mouseScreenPos = Input.mousePosition; // 正交相机下,Z值设为相机到目标平面的距离,这里取相机位置Z值的相反数 mouseScreenPos.z = -Camera.main.transform.position.z; mouseWorldPosStart = Camera.main.ScreenToWorldPoint(mouseScreenPos); } // 按住右键时计算位移并平移相机 if (Input.GetMouseButton(1)) { Vector3 newMouseScreenPos = Input.mousePosition; newMouseScreenPos.z = -Camera.main.transform.position.z; var newMousePosition = Camera.main.ScreenToWorldPoint(newMouseScreenPos); Vector3 mouseWorldPosDiff = mouseWorldPosStart - newMousePosition; // 每次平移后更新初始位置,避免累积位移偏差 mouseWorldPosStart = newMousePosition; transform.position += mouseWorldPosDiff; } }
额外说明
- 若使用透视相机,Z值需设置为相机到交互平面的实际距离(比如地面所在平面的深度值)。
- 代码中增加了
mouseWorldPosStart = newMousePosition的更新逻辑,确保每帧都基于当前鼠标位置计算位移,避免持续按住右键时出现的位移累积错误。
内容的提问来源于stack exchange,提问作者tomy3
相关产品推荐
相关产品推荐

