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

如何在使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:54:03