You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

第三人称相机绕玩家旋转阻尼过大问题求助(自定义脚本)

第三人称相机旋转阻尼过大的解决方案

问题根源

原脚本存在几个核心问题导致阻尼过大且参数调整无效:

  • 插值权重计算错误:Time.deltaTime * SmoothTime的数值过小,每次插值比例极低,相机无法快速跟进目标状态
  • 位置依赖当前相机旋转:相机位置计算基于当前的transform.forward,而旋转是平滑过渡的,导致位置更新滞后于旋转,加剧拖沓感
  • 缩放逻辑异常:Mathf.Lerp的参数顺序颠倒,导致缩放效果不符合预期

修改后的相机脚本

using UnityEngine;

public class CameraController : MonoBehaviour // 避免与Unity内置Camera类重名
{
    public float mouseSensitivity = 100f;
    public Transform player;
    public float smoothSpeed = 5f; // 数值越大,相机跟进速度越快,阻尼感越弱

    public float defaultZoom = 5f;
    public float zoomSpeed = 10f;
    public float minZoom = 3f;
    public float maxZoom = 9f;

    private float mouseX;
    private float mouseY;
    private Vector3 desiredPosition;
    private Quaternion desiredRotation;

    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
        player = player ?? GameObject.Find("Player").transform;
        
        // 初始化鼠标旋转值为相机当前角度,避免初始帧跳跃
        mouseY = transform.eulerAngles.x;
        mouseX = transform.eulerAngles.y;
    }

    void Update()
    {
        // 处理鼠标旋转输入
        mouseX += Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
        mouseY -= Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;
        mouseY = Mathf.Clamp(mouseY, -75f, 75f);

        // 处理滚轮缩放
        defaultZoom -= Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
        defaultZoom = Mathf.Clamp(defaultZoom, minZoom, maxZoom);
    }

    void LateUpdate()
    {
        // 计算目标旋转角度
        desiredRotation = Quaternion.Euler(mouseY, mouseX, 0f);
        // 平滑旋转:使用Quaternion.Slerp,权重由smoothSpeed控制
        transform.rotation = Quaternion.Slerp(transform.rotation, desiredRotation, smoothSpeed * Time.deltaTime);

        // 基于目标旋转计算相机目标位置,避免位置滞后
        desiredPosition = player.position - desiredRotation * Vector3.forward * defaultZoom;
        // 平滑移动位置:使用Vector3.Lerp
        transform.position = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed * Time.deltaTime);
    }
}

核心优化点

  • 参数逻辑调整:将原SmoothTime改为smoothSpeed,直接控制插值速度,数值越大相机响应越快,阻尼感越弱
  • 旋转与位置解耦:计算目标位置时使用最终的desiredRotation,而非相机当前旋转,确保位置和旋转的目标同步,消除滞后
  • 类名重命名:避免与Unity内置Camera类冲突,减少潜在bug
  • 初始化优化:初始时将鼠标旋转值设为相机当前角度,避免游戏启动时相机突然跳转
  • 缩放逻辑修正:调整滚轮输入方向符合常规操作直觉,移除错误的Lerp调用,确保缩放平滑自然

内容的提问来源于stack exchange,提问作者Rusydi Rosli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 23:15:55