Unity自由漫游相机触发鼠标旋转时丢失键盘旋转效果问题求助
问题根源
你的两套旋转逻辑数据没有同步,直接导致键盘修改的旋转被鼠标逻辑覆盖:
- 键盘逻辑直接调用
RotateAround修改transform的旋转,但没有同步更新你自定义存储的pitch、yaw变量 - 鼠标逻辑第一次触发时,会直接用初始值为0的
pitch、yaw覆盖transform.eulerAngles,直接清空了键盘操作的效果 - 两种操作使用了完全独立的旋转修改路径,没有共用同一套状态存储,自然无法实现累加效果
修复方案
统一所有旋转操作的修改入口,所有旋转都只修改pitch、yaw两个变量,最后统一赋值给相机变换,避免数据不一致。
步骤1:初始化同步变量
在脚本初始化阶段就把当前相机的默认角度同步到pitch、yaw变量:
private float pitch; private float yaw; private void Start() { pitch = transform.eulerAngles.x; yaw = transform.eulerAngles.y; }
步骤2:修改键盘旋转逻辑
不要直接修改transform,改为修改yaw变量:
private void RotateCameraKeyboard() { if (Input.GetKey(KeyCode.Q)) { yaw -= rotationSpeed * Time.deltaTime * 30; } if (Input.GetKey(KeyCode.E)) { yaw += rotationSpeed * Time.deltaTime * 30; } }
步骤3:精简鼠标旋转逻辑
移除鼠标逻辑里的角度限制和赋值操作,只保留变量修改:
private void RotateCameraMouse() { if (Input.GetMouseButton(2)) { pitch -= rotationSpeed * Input.GetAxis("Mouse Y"); yaw += rotationSpeed * Input.GetAxis("Mouse X"); } }
步骤4:统一在LateUpdate处理角度赋值
把角度限制、归一化、赋值操作统一放到LateUpdate执行,保证所有输入处理完成后再更新相机姿态:
private void LateUpdate() { RotateCameraKeyboard(); RotateCameraMouse(); // 限制俯仰角范围 pitch = Mathf.Clamp(pitch, -90f, 90f); // 统一处理航向角360度循环,代替原有的两个while循环 yaw = Mathf.Repeat(yaw, 360f); transform.eulerAngles = new Vector3(pitch, yaw, 0f); }
修改完成后键盘和鼠标的旋转操作都会累加,不会再出现之前的覆盖问题。
内容的提问来源于stack exchange,提问作者drake10k
相关产品推荐
相关产品推荐

