Bootstrap

unity 摄像机镜头跟随鼠标拖拽

通过update方法记录变化量然后通过坐标换算移动摄像机

一.获取上一帧到当前帧鼠标位移变化量,计算过相机从上一针位置到当前帧位置移动的距离

 /// <summary>
        /// 计算上一帧到当前帧移动距离
        /// </summary>
        /// <param name="moveDetla"></param>
        /// <returns></returns>
        bool isCameraMove(out Vector3 moveDetla)
        {
            moveDetla = Vector3.zero;
            if (Input.GetMouseButtonDown(0))
            {
                setBeginState();
            }
            else if (Input.GetMouseButton(0))
            {
                Debug.DrawLine(cameraRay.origin, cameraRay.origin + cameraRay.direction * 50, Color.red);
                Vector3 curMousePos = getMouseWorldPos();
                Vector3 detla = curMousePos - curTouchPos;
                if (detla.sqrMagnitude > 0)
                {
                    Vector3 temp = dragCamera.ScreenToWorldPoint(curMousePos);
                    onToutch(temp);
                    moveDetla = dragCamera.ScreenToWorldPoint(startTouchPos) - temp;

                     //计算过相机从上一针位置到当前帧位置移动的位置
                    cameraTargetPos = cameraOriginPos + moveDetla;
                    curDragComeraPos = dragCamera.transform.position;
                    LaunchCameraMove();
                    // moveDetla = temp - dragCamera.ScreenToWorldPoint(startTouchPos);
                    curTouchPos = curMousePos;
                    return true;
                }
            }

            return false;
        } 

二.实现摄像机移动阻尼和曲线移动派生类CameraDragSmoothDamp和CameraDragByCurve

重写CameraDragSmoothDamp的OnCameraMove()实现摄像机阻尼运动效果

 protected override void OnCameraMove()
    {
        base.OnCameraMove();
        if (!isLaunchMove)
        {
            return;
        }

        Vector3 result =
            Vector3.SmoothDamp(dragCamera.transform.position, cameraTargetPos, ref curVelocity, moveTime);
        if (curVelocity == Vector3.zero)
        {
            isLaunchMove = false;
        }

        SetCameraPos(result);
    }

重写CameraDragByCurve的OnCameraMove()实现摄像机曲线运动效果

 protected override void OnCameraMove()
    {
        base.OnCameraMove();
        if (Curve==null)
        {
            return;;
        }
        if (!isLaunchMove)
        {
            return;
        }

 

;