You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何实现摄像机垂直旋转控制上下移动?Unity游戏视角配置咨询

实现水平旋转+FOV垂直视角控制的解决方案

我明白你想要的效果:玩家身体仅跟随鼠标X轴水平旋转,垂直方向不旋转摄像机,而是通过调整视场角(FOV)来模拟上下瞄准的视觉体验。下面是适配需求的代码修改方案:

核心思路

  1. 保留玩家水平旋转的原有逻辑,完全移除摄像机垂直旋转的代码
  2. 新增FOV控制参数,用鼠标Y轴输入来动态调整相机的视场角,同时限制FOV在合理范围避免过度拉伸
  3. 适配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的替代代码,按需切换即可
  • 参数可自定义:你可以根据游戏手感调整fovAdjustSpeedminFOVmaxFOV的数值,找到最适合的体验

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

火山引擎 最新活动