void Zoom(float deltaTime)
        {
            var zoomInput = 0f;

            if (UseTouchInput)
            {
                if (Input.touchCount == 2)
                {
                    var touchZero = Input.GetTouch(0);
                    var touchOne  = Input.GetTouch(1);

                    var touchZeroPrevPos = touchZero.position - new Vector2(touchZero.deltaPosition.x / Screen.width, touchZero.deltaPosition.y / Screen.height);
                    var touchOnePrevPos  = touchOne.position - new Vector2(touchOne.deltaPosition.x / Screen.width, touchOne.deltaPosition.y / Screen.height);

                    var prevTouchDeltaMag = (touchZeroPrevPos - touchOnePrevPos).magnitude;
                    var touchDeltaMag     = (touchZero.position - touchOne.position).magnitude;

                    // Zoom input
                    zoomInput = prevTouchDeltaMag - touchDeltaMag;

                    // Zoom point
                    var midTouch = Vector2.Lerp(touchZero.position, touchOne.position, .5f);
                    _zoomPoint = new Vector3(midTouch.x, midTouch.y, Mathf.Abs(Vector3D(ProCamera2D.LocalPosition)));

                    // Smoothness to 0
                    if (!_zoomStarted)
                    {
                        _zoomStarted        = true;
                        _panTarget.position = ProCamera2D.LocalPosition - ProCamera2D.InfluencesSum;
                        UpdateCurrentFollowSmoothness();
                        RemoveFollowSmoothness();
                    }

                    // Save time
                    _touchZoomTime = Time.time;
                }
                else
                {
                    // Reset smoothness
                    if (_zoomStarted && Mathf.Abs(_zoomAmount) < .001f)
                    {
                        RestoreFollowSmoothness();
                        _zoomStarted = false;
                    }
                }
            }

            if (UseMouseInput)
            {
                // Zoom input
                zoomInput = Input.GetAxis("Mouse ScrollWheel");

                // Zoom point
                _zoomPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, Mathf.Abs(Vector3D(ProCamera2D.LocalPosition)));
            }

            // Stop zoom if zoomPoint not on this camera
            if (!ProCamera2D.GameCamera.pixelRect.Contains(_zoomPoint))
            {
                return;
            }

            // Different zoom speed according to the platform
            var zoomSpeed = UseTouchInput ? PinchZoomSpeed * 10f : MouseZoomSpeed;

            // Cancel zoom if max/min reached
            if ((_onMaxZoom && zoomInput * zoomSpeed < 0) || (_onMinZoom && zoomInput * zoomSpeed > 0))
            {
                CancelZoom();
                return;
            }

            // Zoom amount
            _zoomAmount = Mathf.SmoothDamp(_prevZoomAmount, zoomInput * zoomSpeed * deltaTime, ref _zoomVelocity, ZoomSmoothness, float.MaxValue, deltaTime);

            if (UseMouseInput)
            {
                // Reset smoothness once zoom stops
                if (Mathf.Abs(_zoomAmount) <= .0001f)
                {
                    if (_zoomStarted)
                    {
                        RestoreFollowSmoothness();
                    }

                    _zoomStarted    = false;
                    _prevZoomAmount = 0;
                    return;
                }

                // Smoothness to 0
                if (!_zoomStarted)
                {
                    _zoomStarted        = true;
                    _panTarget.position = ProCamera2D.LocalPosition - ProCamera2D.InfluencesSum;
                    UpdateCurrentFollowSmoothness();
                    RemoveFollowSmoothness();
                }
            }

            // Clamp zoom amount
            var targetSize    = (ProCamera2D.ScreenSizeInWorldCoordinates.y / 2) + _zoomAmount;
            var minScreenSize = _initialCamSize / MaxZoomInAmount;
            var maxScreenSize = MaxZoomOutAmount * _initialCamSize;

            _onMaxZoom = false;
            _onMinZoom = false;
            if (targetSize < minScreenSize)
            {
                _zoomAmount -= targetSize - minScreenSize;
                _onMaxZoom   = true;
            }
            else if (targetSize > maxScreenSize)
            {
                _zoomAmount -= targetSize - maxScreenSize;
                _onMinZoom   = true;
            }

            // Save previous zoom amount
            _prevZoomAmount = _zoomAmount;

            // Move camera towards zoom point
            if (ZoomToInputCenter && _zoomAmount != 0)
            {
                var multiplier = _zoomAmount / (ProCamera2D.ScreenSizeInWorldCoordinates.y / 2);
                _panTarget.position += ((_panTarget.position - ProCamera2D.GameCamera.ScreenToWorldPoint(_zoomPoint)) * multiplier);
            }

            // Zoom
            ProCamera2D.Zoom(_zoomAmount);

            IsZooming = true;
        }