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

Unity对象旋转后相对相机平移方向错误问题求解

核心问题出在Transform.Translate的默认行为:不传第二个参数时默认以Space.Self(对象自身坐标系)为基准计算位移,你传入的基于相机朝向的世界坐标系位移向量,在对象自身有旋转时就会出现方向偏移。

修正后完整代码

private bool ApplyPan_XZ(Vector2 old0, Vector2 new0)
{
    Vector2 panDirection = old0 - new0;

    Vector3 newDirection = new Vector3(panDirection.x, 0f, panDirection.y);
    if (newDirection.magnitude < PanMagnitudeThreshold)
        return false;

    // 处理相机前向量,Y轴归零后标准化,避免俯仰角度影响移动速度
    Vector3 cameraForwardXZ = Vector3.Scale(myCamera.forward, new Vector3(1, 0, 1)).normalized;
    
    Vector3 movementX = myCamera.right * panDirection.x;
    Vector3 movementZ = cameraForwardXZ * panDirection.y;
    Vector3 movement = movementX + movementZ;
    movement.y = 0f;

    // 显式指定按世界坐标系位移,不受对象自身旋转影响
    transform.Translate(panSpeed * Time.deltaTime * movement, Space.World);

    return true;
}

修改点说明

  • 新增相机前向量的XZ平面归一化处理:避免相机俯仰角度变化时,forward向量的Y分量不同导致XZ平面移动速度不稳定的问题
  • 调用Translate时显式传入Space.World参数:指定位移向量是世界坐标系下的数值,Unity不会再根据对象自身的旋转做坐标转换,无论对象怎么旋转,都会严格按照相机朝向的XZ平面方向移动

如果不想用Translate方法,也可以直接修改对象的世界坐标位置,效果完全一致:

transform.position += panSpeed * Time.deltaTime * movement;

内容的提问来源于stack exchange,提问作者Matteo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:24:04