Unity摄像机上下旋转镜头实现

Unity摄像机上下旋转镜头实现

1.上下顶点锁定

将摄像机放在某对象下面作为子类
父类左右旋转,摄像机上下旋转
在这里插入图片描述

public class MoveCameraAlpha : MonoBehaviour
{
    [Header("旋转速度")]
    [Range(0,1)]
    public float turnSpeed;
    //Main Camera的父类
    private Transform _cameraFather;
    
    private float _mousex;
    private float _mousey;
    
    private float xAxisClamp;

    private void Awake()
    {
        _cameraFather = transform.root;
    }
    

    private void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
        xAxisClamp = 0.0f;
    }

    private void Update()
    {
        if (Input.GetMouseButton(1))
        {
            _mousex = Input.GetAxis("Mouse X");
            _mousey = Input.GetAxis("Mouse Y");
            
            xAxisClamp += _mousey;
            //Debug.Log(xAxisClamp);

            if (xAxisClamp > 90.0f)
            {
                xAxisClamp = 90.0f;
                _mousey = 0.0f;
                ClampXAxisRotationToValue(270.0f);
            }
            else if (xAxisClamp < -90.0f)
            {
                xAxisClamp = -90.0f;
                _mousey = 0.0f;
                ClampXAxisRotationToValue(90.0f);
            }
            
            _cameraFather.Rotate(Vector3.up * _mousex);
            transform.Rotate(Vector3.left * _mousey);
            
            Vector3 res = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, 0);
            transform.eulerAngles = res;
        }
        
    }
    
    private void ClampXAxisRotationToValue(float value)
    {
        Vector3 eulerRotation = transform.eulerAngles;
        eulerRotation.x = value;
        transform.eulerAngles = eulerRotation;
    }
}

public class MoveCameraAlpha : MonoBehaviour
{
    [Header("旋转速度")]
    [Range(0,1)]
    public float turnSpeed;
    //Main Camera的父类
    private Transform _cameraFather;
    
    private float _mousex;
    private float _mousey;
    
    private float xAxisClamp;

    private void Awake()
    {
        _cameraFather = transform.root;
    }
    

    private void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
        xAxisClamp = 0.0f;
    }

    private void Update()
    {
        if (Input.GetMouseButton(1))
        {
            _mousex = Input.GetAxis("Mouse X");
            _mousey = Input.GetAxis("Mouse Y");
            
            xAxisClamp -= _mousey;
            //Debug.Log(xAxisClamp);

           xAxisClamp = Mathf.Clamp(xAxisClmap,-90f,90f);
            
            _cameraFather.Rotate(Vector3.up * _mousex);
            transform.localRotation = Quaternion.Euler(xAxisClamp,0f,0f);
        }
    }
}

2.镜头上下了连续旋转

public class MoveCamera : MonoBehaviour
{
    [Header("移动速度")]
    public float moveSpeed;
    [Header("旋转速度")]
    [Range(0,1)]
    public float turnSpeed;
    private float _hor;
    private float _ver;
    
    private float _mousex;
    private float _mousey;
    
    private float _yaw;
    private float _pitch;
    
    private void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
        _yaw = transform.eulerAngles.y;
        _pitch = transform.eulerAngles.x;
    }

    private void Update()
    {
        if (Input.GetMouseButton(1))
        {
            _hor = Input.GetAxis("Horizontal");
            _ver = Input.GetAxis("Vertical");
            transform.position += _hor * transform.right * Time.deltaTime * moveSpeed + 
                                  _ver * transform.forward * Time.deltaTime * moveSpeed;
        
            _mousex = Input.GetAxis("Mouse X");
            _mousey = Input.GetAxis("Mouse Y");

            //方法一,到顶点会快速水平旋转
            // transform.Rotate(-_mousey, _mousex, 0);
            // Vector3 res = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, 0);
            // transform.eulerAngles = res;
            
            //方法二,没问题的实现
            _yaw = (_yaw + _mousex) % 360f;
            _pitch = (_pitch - _mousey) % 360f;
            
            transform.rotation = Quaternion.AngleAxis(_yaw, Vector3.up) * Quaternion.AngleAxis(_pitch, Vector3.right);
            
            //方法三,到顶点会水平旋转180度
            // transform.forward = Quaternion.AngleAxis(_mousex, Vector3.up) * transform.forward;
            // transform.forward = Quaternion.AngleAxis(-_mousey, Vector3.right) * transform.forward;
        }
    }
}

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