如何实现摄像机垂直旋转控制上下移动?Unity游戏视角配置咨询
实现水平旋转+FOV垂直视角控制的解决方案
我明白你想要的效果:玩家身体仅跟随鼠标X轴水平旋转,垂直方向不旋转摄像机,而是通过调整视场角(FOV)来模拟上下瞄准的视觉体验。下面是适配需求的代码修改方案:
核心思路
- 保留玩家水平旋转的原有逻辑,完全移除摄像机垂直旋转的代码
- 新增FOV控制参数,用鼠标Y轴输入来动态调整相机的视场角,同时限制FOV在合理范围避免过度拉伸
- 适配Cinemachine VM Camera和普通Main Camera两种场景
修改后的完整代码
using System.Collections; using System.Collections.Generic; using UnityEngine; using Cinemachine; // 使用Cinemachine时需要添加此命名空间 public class PlayerMovement : MonoBehaviour { public CharacterController characterController; public float speed = 35f; public Animator animator; // 水平旋转控制参数 public float mouseSensitivity = 2f; // FOV垂直视角控制参数 public CinemachineVirtualCamera vmCamera; // 拖拽你的Cinemachine VM Camera到这里 // 如果不用Cinemachine,替换为:public Camera mainCamera; public float minFOV = 50f; // 最小允许的视场角 public float maxFOV = 80f; // 最大允许的视场角 public float fovAdjustSpeed = 2f; // FOV调整的灵敏度 // 重力相关 private float gravity = 9.87f; private float verticalSpeed = 0; void Update() { Move(); RotateAndAdjustFOV(); } public void RotateAndAdjustFOV() { // 处理玩家水平旋转:仅跟随鼠标X轴控制身体转向 float horizontalRotation = Input.GetAxis("Mouse X"); transform.Rotate(0, horizontalRotation * mouseSensitivity, 0); // 处理垂直视角:用FOV调整代替摄像机旋转 float verticalInput = Input.GetAxis("Mouse Y"); // 鼠标上移→减小FOV(模拟向上瞄准的窄视野),鼠标下移→增大FOV(模拟向下瞄准的宽视野) float targetFOV = vmCamera.m_Lens.FieldOfView - verticalInput * fovAdjustSpeed; // 限制FOV在设定范围内,避免极端值 targetFOV = Mathf.Clamp(targetFOV, minFOV, maxFOV); // 平滑过渡FOV,让变化更自然无跳变 vmCamera.m_Lens.FieldOfView = Mathf.Lerp(vmCamera.m_Lens.FieldOfView, targetFOV, Time.deltaTime * 10f); // 【非Cinemachine版本代码】如果用普通Main Camera,替换上面的FOV逻辑: // float targetFOV = mainCamera.fieldOfView - verticalInput * fovAdjustSpeed; // targetFOV = Mathf.Clamp(targetFOV, minFOV, maxFOV); // mainCamera.fieldOfView = Mathf.Lerp(mainCamera.fieldOfView, targetFOV, Time.deltaTime * 10f); } private void Move() { float horizontalMove = Input.GetAxis("Horizontal"); float verticalMove = Input.GetAxis("Vertical"); if (characterController.isGrounded) verticalSpeed = 0; else verticalSpeed -= gravity * Time.deltaTime; Vector3 gravityMove = new Vector3(0, verticalSpeed, 0); Vector3 move = transform.forward * verticalMove + transform.right * horizontalMove; characterController.Move(speed * Time.deltaTime * move + gravityMove * Time.deltaTime); } }
关键修改说明
- 移除了原代码中
cameraHolder的垂直旋转和角度限制逻辑,确保玩家仅做水平转向 - FOV控制逻辑:通过鼠标Y轴输入动态调整视场角,配合平滑插值让视角变化更流畅
- 适配两种相机场景:注释中提供了普通Main Camera的替代代码,按需切换即可
- 参数可自定义:你可以根据游戏手感调整
fovAdjustSpeed、minFOV和maxFOV的数值,找到最适合的体验
内容的提问来源于stack exchange,提问作者Jopan




