Unity中跟随飞机的相机如何禁止绕z轴旋转,仅同步x、y轴旋转
错误原因排查
你之前的写法存在两个核心问题:
- 直接读取
Transform.rotation的x/y分量是四元数的组成部分,并非你直观理解的欧拉角度数,四元数的分量取值范围是[-1,1],直接作为角度传入会出现完全不符合预期的旋转效果 Transform.Rotate是增量旋转方法,每次调用都会在当前旋转基础上叠加新的旋转角度,每帧调用的话会导致旋转值无限累加,完全不适合用来做姿态同步场景
最简实现方案
直接构造仅包含飞机X、Y轴旋转的四元数赋值给相机即可,Z轴固定为0或者相机初始的Z轴旋转值:
// 如需要保留相机初始Z轴旋转,可在Awake中提前存储初始值再替换下方的0f this.transform.rotation = Quaternion.Euler( Cube.transform.eulerAngles.x, Cube.transform.eulerAngles.y, 0f );
注意:请将这段代码放在
LateUpdate生命周期中执行,确保飞机的旋转逻辑先执行完毕再更新相机姿态,避免出现画面抖动。
平滑跟随优化方案
如果需要更丝滑的跟随效果,可以添加差值逻辑:
// 可在Inspector中调整平滑系数,数值越大跟随响应越快 public float smoothRotateSpeed = 6f; private float initialCamZRot; void Awake() { // 存储相机初始Z轴旋转值,避免覆盖相机原有设置 initialCamZRot = transform.eulerAngles.z; } void LateUpdate() { Quaternion targetRotation = Quaternion.Euler( Cube.transform.eulerAngles.x, Cube.transform.eulerAngles.y, initialCamZRot ); transform.rotation = Quaternion.Lerp( transform.rotation, targetRotation, smoothRotateSpeed * Time.deltaTime ); }
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

