Unity 键盘控制摄像机镜头旋转,并限制旋转角度

把脚本挂到摄像机上即可,设置一下需要限制角度的区间值。此脚本中有加入滑动条来显示摄像机缩放,如不需要可删除。

注:需要引入DoTween插件,如不需要相机复位功能,可删除代码段,不引入DoTween

using DG.Tweening;
using UnityEngine;
using UnityEngine.UI;

public class ExperimentalCameraController : MonoBehaviour
{
    public static ExperimentalCameraController Instance;
    public Camera mainCamera; //主相机
    public Camera shotCamera; //拍照相机
    public Slider zoomSlider; //相机缩放滑动条

    private float _speed = 20f;

    [HideInInspector] public bool onOff;

    //限制拖动范围的区间值
    public float xValue, yValue;

    //记录当前相机的X轴和Y轴的坐标
    public float cameraX;
    public float cameraY;

    private void Awake()
    {
        Instance = this;
    }

    // Update is called once per frame
    private void LateUpdate()
    {
        if (onOff)
        {
            //鼠标滚轮控制相机缩放 最大值100 最小值20
            if (Input.GetAxis("Mouse ScrollWheel") < 0)
            {
                if (zoomSlider.value < 1f)
                    zoomSlider.value += 0.02f;
            }

            if (Input.GetAxis("Mouse ScrollWheel") > 0)
            {
                if (zoomSlider.value > 0.2f)
                    zoomSlider.value -= 0.02f;
            }

            if (zoomSlider.value < 0.2f)
            {
                zoomSlider.value = 0.2f;
            }

            //方向键左右,控制左右旋转
            if (Input.GetAxis("Horizontal") != 0)
            {
                mainCamera.transform.Rotate(0, Input.GetAxis("Horizontal") * _speed * Time.deltaTime, 0, Space.Self);
            }

            //方向键上下,控制上下的旋转(俯仰)
            if (Input.GetAxis("Vertical") != 0)
            {
                mainCamera.transform.Rotate(Input.GetAxis("Vertical") * -_speed * Time.deltaTime, 0, 0, Space.Self);
            }

            //按R键使摄像机复位
            if (Input.GetKeyDown(KeyCode.R))
            {
                mainCamera.transform.DOLocalRotate(new Vector3(0, cameraY, 0), 1);
            }

            //限制相机视角移动范围
            var eulerAngles = gameObject.transform.localEulerAngles;
            eulerAngles.x = CheckAngle(eulerAngles.x);
            eulerAngles.y = CheckAngle(eulerAngles.y);
            cameraX = CheckAngle(cameraX);
            cameraY = CheckAngle(cameraY);
            eulerAngles = new Vector3(Mathf.Clamp(eulerAngles.x, cameraX - xValue, cameraX + xValue),
                Mathf.Clamp(eulerAngles.y, cameraY - yValue, cameraY + yValue),
                0f);
            gameObject.transform.localEulerAngles = eulerAngles;
        }

        //相机焦距同步Slider
        mainCamera.fieldOfView = zoomSlider.value * 100;
        shotCamera.fieldOfView = zoomSlider.value * 100;
    }


    /// <summary>
    /// 万向锁
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    public float CheckAngle(float value)
    {
        value -= 180;

        if (value < 0)
        {
            return value + 180;
        }
        else
        {
            return value - 180;
        }
    }
}


版权声明:本文为qq_38859767原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。