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
相关产品推荐
相关产品推荐

