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

Unity第一人称控制器相机灵敏度乘法失效问题

问题分析与修复方案

核心问题

  1. 旋转逻辑冲突:你先通过transform.Rotate(xRot)修改了玩家物体的Y轴旋转,紧接着又用transform.localRotation = Quaternion.Euler(...)把Y轴旋转重置为之前的数值,等于完全抵消了X轴鼠标输入的旋转效果,这就是灵敏度cs对X轴无效的根本原因。
  2. Clamp未生效:Mathf.Clamp(yRot, -90, 90)只是计算了限制后的值,但没有赋值回yRot,导致上下旋转没有被限制,会出现过度翻转的问题。
  3. 相机变量未利用:你声明了public GameObject Camera但没使用,第一人称视角的上下旋转应该作用在相机上,而非玩家自身。

修复后的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MovementScript : MonoBehaviour
{
    public GameObject Camera;
    public float cs = 200f; // 建议降低数值,1000会导致视角转动过快

    private float yRot = 0f;

    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
        transform.rotation = Quaternion.identity;
    }

    void Update()
    {
        updatePlrRotation();
    }

    void updatePlrRotation()
    {
        // 先乘灵敏度再乘deltaTime,逻辑更清晰(顺序不影响结果,但可读性更好)
        float msX = Input.GetAxis("Mouse X") * cs * Time.deltaTime;
        float msY = Input.GetAxis("Mouse Y") * cs * Time.deltaTime;

        // 左右旋转:作用在玩家自身的Y轴
        transform.Rotate(0, msX, 0);

        // 上下旋转:作用在相机的X轴,并且限制旋转范围
        yRot -= msY;
        yRot = Mathf.Clamp(yRot, -90f, 90f); // 必须将Clamp结果赋值回yRot
        Camera.transform.localRotation = Quaternion.Euler(yRot, 0, 0);
    }
}

关键修改说明

  • 分离了玩家(左右旋转)和相机(上下旋转)的逻辑,避免旋转覆盖冲突。
  • 修复了Mathf.Clamp的赋值问题,确保上下旋转被限制在-90到90度之间,防止视角翻转。
  • 调整了灵敏度的乘法顺序,让逻辑更直观,同时降低了默认灵敏度数值。
  • 利用了声明的Camera变量,将上下旋转正确作用在相机上,符合第一人称视角的常规逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 01:12:35