Unity第三人称控制器实现角色跟随Cinemachine自由视角旋转不停转问题求助
问题根源
你遇到的无限旋转是两个逻辑形成了循环依赖:
- 你的Cinemachine自由视角相机的
Follow/LookAt绑定了玩家本体Transform,玩家旋转会带动相机同步旋转 - 代码中每帧强制让玩家对齐相机的Y轴旋转,相机转玩家就转,玩家转相机又跟着转,最终形成死循环
另外你当前的移动逻辑也不符合第三人称控制器的相机相对移动需求,现在的输入是直接对应玩家自身的前后左右,不会跟随相机朝向变化。
解决方案
步骤1:调整Cinemachine配置打断循环
- 在玩家对象下新建一个空物体,命名为
CameraFollowTarget,调整它的位置到你想要的相机跟随锚点(比如玩家头顶1.5m、身前0.2m位置) - 将Cinemachine虚拟相机的
Follow和LookAt参数都修改为绑定这个CameraFollowTarget,不要直接绑定玩家本体Transform
步骤2:替换修正后的代码
修正后逻辑为:只有当玩家有移动输入时,才将玩家转向相机当前朝向对应的移动方向,无输入时玩家不会跟随相机旋转,同时适配了相机相对的移动逻辑:
using UnityEngine; public class PlayerMovement : MonoBehaviour { public float speed; public float rotateSpeed = 4f; public GameObject Hoverboard_script; public GameObject cinemachine_Hoverboard; public Transform main_cam_tf; void Update() { Hoverboard_script.SetActive(false); cinemachine_Hoverboard.SetActive(false); PlayerMovement_void(); } void PlayerMovement_void() { float hor = Input.GetAxisRaw("Horizontal"); float ver = Input.GetAxisRaw("Vertical"); // 把输入转换为相机相对的方向向量,忽略Y轴倾角影响 Vector3 camForward = Vector3.Scale(main_cam_tf.forward, new Vector3(1,0,1)).normalized; Vector3 camRight = Vector3.Scale(main_cam_tf.right, new Vector3(1,0,1)).normalized; Vector3 moveDir = (camForward * ver + camRight * hor).normalized; if (moveDir.magnitude > 0.1f) { // 有输入时才执行移动+转向逻辑 transform.Translate(moveDir * speed * Time.deltaTime, Space.World); Quaternion targetRot = Quaternion.LookRotation(moveDir); transform.rotation = Quaternion.Lerp(transform.rotation, targetRot, Time.deltaTime * rotateSpeed); } } }
补充说明
如果你的需求是自由视角旋转时玩家始终保持朝向相机前方,只需要把代码中旋转逻辑的判断条件去掉,同时确认Cinemachine的跟随目标是刚才新建的锚点对象即可,不会再出现循环旋转问题。
内容的提问来源于stack exchange,提问作者fanti
相关产品推荐
相关产品推荐

