Unity第一人称相机过场动画后复位异常问题求助
第一人称相机过场后跳变问题解决思路
问题根源
过场动画时,你用_lookAtTarget让相机插值看向目标,但核心视角参数xRotation和玩家身体的Y轴旋转并未同步更新。结束过场开启mayLook后,HandleLook直接沿用之前保存的旧参数计算视角,导致相机瞬间跳回之前的状态——这才是视觉怪异的核心原因,和光标锁定无关。
具体修复步骤
同步过场中的视角参数
在过场动画的相机旋转逻辑里,每次插值更新后,把当前相机的旋转值同步到xRotation和玩家身体,确保结束过场时,玩家控制的起始状态和当前相机一致:void Update() { if (mayLook) { HandleLook(); } if (_lookAtTarget) { Quaternion targetRotation = Quaternion.LookRotation(_target.position - transform.position); transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, 5f * Time.deltaTime); // 同步xRotation(相机X轴旋转) xRotation = transform.localEulerAngles.x; // 同步玩家身体的Y轴旋转(和相机Y轴保持一致) playerBody.rotation = Quaternion.Euler(0, transform.rotation.eulerAngles.y, 0); } }修正光标锁定逻辑
当前resetCamera里连续设置Locked和None等于没生效,第一人称游戏通常需要保持光标锁定状态,直接设置即可:public void resetCamera() { _lookAtTarget = false; Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; // 可选,隐藏光标更符合第一人称体验 mayLook = true; }可选优化:添加过渡平滑效果
如果想让过场到玩家控制的切换更自然,可以加一个短暂的过渡状态,避免硬切换:// 新增过渡相关变量 private bool _isTransitioning; private float _transitionDuration = 0.3f; private float _transitionTimer; // 修改resetCamera方法 public void resetCamera() { _lookAtTarget = false; _isTransitioning = true; _transitionTimer = 0; Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; // 先关闭玩家控制,过渡完成后再开启 mayLook = false; } // 修改Update方法 void Update() { if (_isTransitioning) { _transitionTimer += Time.deltaTime; float progress = Mathf.Clamp01(_transitionTimer / _transitionDuration); // 过渡期间保持当前相机旋转,进度满后开启玩家控制 if (progress >= 1f) { _isTransitioning = false; mayLook = true; } return; } if (mayLook) { HandleLook(); } if (_lookAtTarget) { Quaternion targetRotation = Quaternion.LookRotation(_target.position - transform.position); transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, 5f * Time.deltaTime); xRotation = transform.localEulerAngles.x; playerBody.rotation = Quaternion.Euler(0, transform.rotation.eulerAngles.y, 0); } }
内容的提问来源于stack exchange,提问作者Zeepblok
相关产品推荐
相关产品推荐

