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; }