如何在Cinemachine Free Look相机中单独锁定Z轴旋转?
解决Cinemachine Free Look相机Z轴(Roll)旋转锁定问题
没问题,我之前做飞行模拟项目时刚好碰到过一模一样的需求,给你两个最实用的解决办法:
方法1:通过Cinemachine Free Look内置参数锁定Roll轴
Cinemachine其实自带了控制Roll旋转的选项,不用额外写代码就能搞定:
- 选中你的Cinemachine Free Look相机对象,打开Inspector面板
- 找到Body模块下的
Framing Transposer(Free Look默认用这个Body类型) - 展开
Rotation折叠面板,找到Roll相关设置:- 把
Roll Damping设为0,相机就不会继承目标的Roll旋转了 - 如果需要强制固定Roll角度,勾选
Lock Roll选项,再在Roll输入框里设置你想要的固定角度(比如0,让相机始终保持水平)
- 把
方法2:用空物体做中间层级隔离(适合复杂挂载场景)
如果你的飞机挂载结构比较复杂,或者上面的方法没生效,可以试试这个“隔离法”:
- 在飞机对象下创建一个空物体(比如命名为
CameraMount) - 把这个空物体的Z轴旋转值固定为0(或者你需要的固定角度),确保它不会继承飞机的Z轴翻滚
- 再把Cinemachine Free Look相机挂载到这个空物体上
- 最后调整Free Look的
Follow和Look At目标为飞机本身,这样相机只会跟随飞机的位置和其他轴旋转,不会跟着Z轴翻滚
补充:代码控制(适合动态切换锁定状态)
要是你需要在游戏过程中动态开启/关闭Z轴锁定,可以写个简单的脚本挂在Free Look相机上:
using UnityEngine; using Cinemachine; public class LockCameraRoll : MonoBehaviour { public CinemachineFreeLook freeLookCam; public bool lockRoll = true; public float fixedRollAngle = 0f; void Update() { if (lockRoll && freeLookCam != null) { // 获取当前相机旋转,仅锁定Z轴角度 Quaternion currentRot = freeLookCam.transform.rotation; currentRot = Quaternion.Euler(currentRot.eulerAngles.x, currentRot.eulerAngles.y, fixedRollAngle); freeLookCam.transform.rotation = currentRot; } } }
使用时记得把Free Look相机拖到脚本的freeLookCam字段里,就能随时通过lockRoll变量控制是否锁定Z轴旋转了。
内容的提问来源于stack exchange,提问作者Artem Volkov
相关产品推荐
相关产品推荐

