美文网首页
Unity 仿Orb控制

Unity 仿Orb控制

作者: ShawnWeasley | 来源:发表于2023-03-28 16:26 被阅读0次
    using UnityEngine;
    
    public class CameraOrbitController : MonoBehaviour {
        public float orbitSpeed = 10f; // 控制相机旋转速度的变量
        public float distance = 10f; // 相机到目标的距离
        public float minRotationY = -89f; // 相机的最小旋转角度
        public float maxRotationY = 89f; // 相机的最大旋转角度
        public Transform target; // 要围绕旋转的目标对象的Transform组件
        public float waitTime = 5f; // 等待时间
        public float autoOrbitSpeed = 5f; // 自转速度
        public bool autoOrbitClockwise = true; // 自转方向
        public bool canZoom = true; // 是否可以滚轮缩放
        public float minZoom = 1; // 是否可以滚轮缩放
        public float maxZoom = 100; // 是否可以滚轮缩放
    
        private Vector3 cameraPosition; // 相机的位置向量
        private float orbitX = 0f; // 相机在X轴上的旋转角度
        private float orbitY = 0f; // 相机在Y轴上的旋转角度
        private Vector3 lastMousePosition; // 上一次鼠标的位置
        private bool isDragging = false; // 是否正在拖动鼠标
        private float idleTime = 0f; // 相机空闲时的计时器
    
        void Start () {
            cameraPosition = new Vector3 (0f, 0f, -distance); // 初始化相机的位置向量
            transform.position = target.position + cameraPosition; // 将相机的位置设置为目标的位置加上相机的位置向量
        }
    
        void Update () {
            if (Input.GetMouseButtonDown (0)) {
                // 如果按下鼠标左键
                lastMousePosition = Input.mousePosition; // 记录下鼠标的位置
                isDragging = true; // 开始拖动鼠标
            } else if (Input.GetMouseButtonUp (0)) {
                // 如果松开鼠标左键
                isDragging = false; // 停止拖动鼠标
            }
    
            if (isDragging) {
                // 如果正在拖动鼠标
                idleTime = 0f; // 重置相机空闲计时器
                Vector3 delta = Input.mousePosition - lastMousePosition; // 计算鼠标的移动距离
                lastMousePosition = Input.mousePosition; // 记录下当前鼠标的位置
    
                orbitX += delta.x * orbitSpeed * Time.deltaTime; // 根据鼠标在X轴上的移动距离,调整相机在X轴上的旋转角度
                orbitY -= delta.y * orbitSpeed * Time.deltaTime; // 根据鼠标在Y轴上的移动距离,调整相机在Y轴上的旋转角度
                orbitY = Mathf.Clamp (orbitY, minRotationY, maxRotationY); // 将相机在Y轴上的旋转角度限制在最小角度和最大角度之间
    
                Quaternion rotation = Quaternion.Euler (orbitY, orbitX, 0f); // 根据相机的旋转角度创建一个旋转四元数
                cameraPosition = rotation * new Vector3 (0f, 0f, -distance); // 根据相机的旋转角度计算相机的位置向量
                transform.position = target.position + cameraPosition; // 将相机的位置设置为目标的位置加上相机的位置向量
                transform.LookAt (target); // 将相机的朝向设置为目标的位置
            } else {
                // 如果没有在拖动鼠标
                idleTime += Time.deltaTime; // 增加相机的空闲计时器
                if (idleTime >= waitTime) {
                    // 如果相机空闲时间达到5秒
                    orbitX += (autoOrbitClockwise ? -1 : 1) * autoOrbitSpeed * Time.deltaTime; // 根据相机旋转速度,调整相机在X轴上的旋转角度
                    Quaternion rotation = Quaternion.Euler (orbitY, orbitX, 0f); // 根据相机的旋转角度创建一个旋转四元数
                    cameraPosition = rotation * new Vector3 (0f, 0f, -distance); // 根据相机的旋转角度计算相机的位置向量
                    transform.position = target.position + cameraPosition; // 将相机的位置设置为目标的位置加上相机的位置向量
                    transform.LookAt (target); // 将相机的朝向设置为目标的位置
                }
            }
    
            if (canZoom && Input.mouseScrollDelta != Vector2.zero) {
                // 如果鼠标滚轮有滚动
                float scroll = Input.mouseScrollDelta.y; // 获取鼠标滚动的值
                distance -= scroll; // 根据鼠标滚动的值调整相机到目标的距离
                distance = Mathf.Clamp (distance, minZoom, maxZoom); // 将相机到目标的距离限制在最小值和最大值之间
    
                Quaternion rotation = Quaternion.Euler (orbitY, orbitX, 0f); // 根据相机的旋转角度创建一个旋转四元数
                cameraPosition = rotation * new Vector3 (0f, 0f, -distance); // 根据相机的旋转角度和相机到目标的距离计算相机的位置向量
                transform.position = target.position + cameraPosition; // 将相机的位置设置为目标的位置加上相机的位置向量
                transform.LookAt (target); // 将相机的朝向设置为目标的位置
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:Unity 仿Orb控制

          本文链接:https://www.haomeiwen.com/subject/excxddtx.html