Unity中相机控制视野旋转和拉近拉远效果

本文详细介绍了一个Unity中用于控制相机视角的脚本,包括如何使用鼠标滚轮和鼠标按钮来调整相机的缩放和旋转,同时介绍了如何限制相机的旋转角度以及自动旋转功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class CameraController : MonoBehaviour
    {
        [SerializeField]
        private Transform target;
        //位置偏移
        private Vector3 offsetPosition;
        //是否开始滑动拉近和拉远视角
        private bool isAdjustDistance= false;
        //是否开始滑动旋转视角
        private bool isRotating = false;
        //相机与目标的距离
        private float distance = 0;
        [Header("鼠标滚轮调节速率")]
        public float scrollSpeed = 10;
        [Header("鼠标左键调节旋转速率")]
        public float rotateSpeed = 2;
        [Header("自动旋转速率")]
        public float autoRotateSpeed = 10;
        private void Start()
        {
            transform.LookAt(target.position);
            offsetPosition = transform.position - target.position;
        }

        private void Update()
        {
            //处理视野的旋转
            RotateView();
            //处理视野的拉近和拉远效果
            ScrollView();           
        }
        /// <summary>
        /// 视野的拉近和拉远
        /// </summary>
        private void ScrollView()
        {
            
            //向后滑动返回负值 (拉近视野),向前滑动返回正值(拉远视野)
            //print(Input.GetAxis("Mouse ScrollWheel"));
            //得到距离

            distance = offsetPosition.magnitude;
            if (Input.GetMouseButtonDown(1))
            {
                isAdjustDistance = true;
            }
            if (Input.GetMouseButtonUp(1))
            {
                isAdjustDistance = false;
            }
            if(isAdjustDistance)
            {

                distance += Input.GetAxis("Mouse Y") * scrollSpeed*Time.deltaTime;         //通过鼠标右键在垂直方向的滑动调节

            }
            
            distance += Input.GetAxis("Mouse ScrollWheel") * scrollSpeed;                 //通过鼠标滚轮调节
            //限制拉近和拉远的距离
            distance = Mathf.Clamp(distance, 2, 18);
            offsetPosition = offsetPosition.normalized * distance;
            //相机的跟随
            transform.position = offsetPosition + target.position;
        }
        /// <summary>
        /// 视野的旋转
        /// </summary>
        private void RotateView()
        {
            //得到鼠标在水平方向的滑动
            //Input.GetAxis("Mouse X");
            //得到鼠标在垂直方向的滑动
            //Input.GetAxis("Mouse Y");
            if (Input.GetMouseButtonDown(0))
            {
                isRotating = true;
            }
            if (Input.GetMouseButtonUp(0))
            {
                isRotating = false;
            }

            if (isRotating)
            {

                transform.RotateAround(target.position, Vector3.up, rotateSpeed * Input.GetAxis("Mouse X"));
                //保存原来的位置
                Vector3 originalPos = transform.position;
                //保存原来的旋转(四元数)
                Quaternion originalRotation = transform.rotation;
                //旋转影响的属性有两个:一个是position 一个是rotation
                transform.RotateAround(target.position, transform.right, -rotateSpeed * Input.GetAxis("Mouse Y"));
                float x = transform.eulerAngles.x;
                if (x < 10 || x > 80)
                {
                    //当超出范围之后,我们将属性归位原来的,就是让旋转无效 
                    transform.position = originalPos;
                    transform.rotation = originalRotation;
                }
            }
            offsetPosition = transform.position - target.position;
        }
        /// <summary>
        /// 自动旋转
        /// </summary>
        /// <param name="isAuto"></param>
        private void AutoRotateAround(bool isAuto)
        {            
            if(isAuto)
            {               
                transform.RotateAround(target.position, Vector3.up, -autoRotateSpeed * Time.deltaTime);
            }
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值