如何在使用Cinemachine时正确获取鼠标世界坐标?
接入Cinemachine后原代码失效的原因
你原来的代码失效是因为Cinemachine会在LateUpdate阶段动态修改主相机的位置、投影等参数,如果你在Update阶段调用ScreenToWorldPoint,拿到的是上一帧的相机参数,会出现坐标偏移;另外默认传入的Input.mousePosition的Z值为0,不符合相机深度要求也会导致计算结果异常。
正确的获取方式
1. 调整调用时机+补全深度参数
把坐标计算逻辑放到LateUpdate中执行,同时手动设置正确的Z轴深度值:
private void LateUpdate() { Vector3 mouseScreenPos = Input.mousePosition; // 2D场景示例:假设相机Z轴坐标为-10,2D内容在Z=0平面,深度设为10即可 mouseScreenPos.z = 10f; // 3D场景可根据你需要检测的平面深度调整Z值 var worldPos = Camera.main.ScreenToWorldPoint(mouseScreenPos); }
2. 射线检测(更稳定,适合需要碰撞检测的场景)
如果需要获取鼠标和场景中碰撞体的交点坐标,用射线检测的方式兼容性更强,不需要手动处理深度参数:
3D场景示例
private void LateUpdate() { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit)) { var worldPos = hit.point; // 后续逻辑处理 } }
2D场景示例
private void LateUpdate() { RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero); if (hit) { var worldPos = hit.point; // 后续逻辑处理 } }
异常排查点
- 确认
Camera.main引用的是挂载了Cinemachine Brain的主相机,不要错误获取其他场景相机 - 虚拟相机切换过渡过程中相机参数动态变化,坐标出现偏移属于正常现象,可等过渡完成后再执行计算
内容的提问来源于stack exchange,提问作者HollowWyvern
相关产品推荐
相关产品推荐

