如何解决Unity正交相机绕玩家旋转后松开鼠标滑动问题
问题原因
你遇到的松开鼠标后相机滑动偏移问题由三个逻辑错误导致:
RotateAroundPlayer默认值设为true,游戏启动后、第一次点击鼠标前,相机就会全局响应鼠标移动输入,积累初始偏移。- 位置移动误用
Vector3.Slerp(球面插值,设计用于旋转计算),插值路径是弧形而非直线,松开鼠标停止旋转后,弧形位移没有走完,就会出现持续滑动的视觉效果。 - 相机朝向逻辑的触发条件有误:仅当
LookAtPlayer或RotateAroundPlayer为true时才执行LookAt,松开鼠标后RotateAroundPlayer变为false,如果没有手动勾选LookAtPlayer,相机角度会停止更新,和位置插值不同步,进一步放大偏移感。
修复步骤
- 将
RotateAroundPlayer默认值改为false,初始状态下不触发旋转逻辑,仅在鼠标按住时开启旋转权限。 - 位置插值从
Vector3.Slerp换成Vector3.Lerp,走直线路径平滑移动,消除弧形滑动。 - 调整相机朝向的判断逻辑,保证位置移动时角度同步更新;如果不需要始终看向玩家,可保留原判断,但建议适当调高
SmoothFactor避免不同步。 - (可选)旋转输入改用
Input.GetAxisRaw("Mouse X"),关闭Unity输入系统自带的轴值平滑衰减,避免松开鼠标瞬间的输入残留导致多余旋转。
修复后完整代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerFollow : MonoBehaviour { public Transform PlayerTransform; private Vector3 _cameraOffset; [Range(0.01f, 1.0f)] [SerializeField] float SmoothFactor = 0.5f; [SerializeField] bool LookAtPlayer = false; // 修正默认值:初始状态不开启旋转 [SerializeField] bool RotateAroundPlayer = false; [SerializeField] float RotationsSpeed = 5.0f; void Start () { _cameraOffset = transform.position - PlayerTransform.position; } void LateUpdate () { // 直接判断鼠标按住状态,避免Down/Up事件帧丢失导致的状态异常 RotateAroundPlayer = Input.GetMouseButton(0); if (RotateAroundPlayer) { // 用GetAxisRaw读取无平滑的鼠标增量,避免松开后的输入残留 Quaternion camTurnAngle = Quaternion.AngleAxis(Input.GetAxisRaw("Mouse X") * RotationsSpeed, Vector3.up); _cameraOffset = camTurnAngle * _cameraOffset; } Vector3 newPos = PlayerTransform.position + _cameraOffset; // 改用Lerp做直线位置插值 transform.position = Vector3.Lerp(transform.position, newPos, SmoothFactor); // 始终保持看向玩家,若需要可改回原判断条件 transform.LookAt(PlayerTransform); } }
如果你不需要相机始终朝向玩家,可以把最后一行的
LookAt逻辑换回原判断条件,注意将SmoothFactor调整到0.3以上,避免位置和角度更新速度差导致的滑动感。
内容的提问来源于stack exchange,提问作者elaaa
相关产品推荐
相关产品推荐

