如何让GameObject的Y轴旋转与Cinemachine Freelook相机保持一致
你之前的方案存在两个核心问题:一是错误获取了位置的Y值而非相机旋转的Y值,二是没有做角度平滑、且更新时机和Cinemachine相机更新时机不匹配,所以出现了抖动问题。正确实现方案如下:
实现方案
1. Cinemachine Freelook 基础配置
- 把Freelook相机的
Follow和LookAt都绑定到角色的根节点(也可以绑定胸部以上的骨节点,避免上下视角转动时出现穿模问题) - 打开Freelook的Orbits设置,将三个环的Binding Mode改为
World Space或者Lock To Target On Assign,避免相机相对位置随角色旋转发生偏移 - 关闭Cinemachine自带的相机旋转绑定角色的选项,保证相机旋转完全由输入控制,不受角色旋转影响
2. 角色跟随Y轴旋转的代码实现
核心逻辑为仅取主相机欧拉角的Y值,平滑赋值给角色的Y轴旋转,完全忽略X、Z轴的旋转值,这样上下移动鼠标时仅相机会发生俯仰、角色不会跟着转动,左右移动鼠标时角色会跟着相机朝向转动,保证相机始终处于角色身后。
将以下脚本挂载到角色根节点即可:
using UnityEngine; public class PlayerRotation : MonoBehaviour { // 旋转平滑系数,数值越大转得越快,0.1-0.3区间的手感和《Skyrim》原版比较接近 public float rotationSmoothTime = 0.15f; private float _currentVelocity; // 放在LateUpdate中执行,等Cinemachine相机更新完成后再转角色,避免时序不同步导致的抖动 private void LateUpdate() { // 只取相机的Y轴欧拉角,忽略X、Z轴的俯仰、翻滚角度 float targetYRotation = Camera.main.transform.eulerAngles.y; // 用角度平滑插值方法计算当前角色应该转到的Y轴角度,避免生硬跳动 float smoothedY = Mathf.SmoothDampAngle(transform.eulerAngles.y, targetYRotation, ref _currentVelocity, rotationSmoothTime); // 仅修改Y轴旋转,X、Z保持原数值 transform.rotation = Quaternion.Euler(transform.eulerAngles.x, smoothedY, transform.eulerAngles.z); } }
如果需要实现《Skyrim》原版的仅移动时才跟随旋转、静止时可以360度观察角色效果,可以加一个移动状态判断,只有当输入的移动向量不为0的时候才执行上述旋转逻辑,示例如下:
// 对接你自己的角色移动输入即可 if (moveInput.magnitude > 0.01f) { // 放入上面的旋转代码 }
如果出现轻微抖动,可以适当调大rotationSmoothTime的数值,或者确认Freelook的更新模式和游戏的更新时机匹配。
内容的提问来源于stack exchange,提问作者Fghjkgcfxx56u
相关产品推荐
相关产品推荐

