namespace Mapbox.Examples { using UnityEngine; using UnityEngine.EventSystems; using Mapbox.Unity.Map; public class CameraMovement : MonoBehaviour { [SerializeField] AbstractMap _map; [SerializeField] float _panSpeed = 20f; [SerializeField] float _zoomSpeed = 50f; [SerializeField] Camera _referenceCamera; Quaternion _originalRotation; Vector3 _origin; Vector3 _delta; bool _shouldDrag; void HandleTouch() { float zoomFactor = 0.0f; //pinch to zoom. switch (Input.touchCount) { case 1: { HandleMouseAndKeyBoard(); } break; case 2: { // Store both touches. Touch touchZero = Input.GetTouch(0); Touch touchOne = Input.GetTouch(1); // Find the position in the previous frame of each touch. Vector2 touchZeroPrevPos = touchZero.position - touchZero.deltaPosition; Vector2 touchOnePrevPos = touchOne.position - touchOne.deltaPosition; // Find the magnitude of the vector (the distance) between the touches in each frame. float prevTouchDeltaMag = (touchZeroPrevPos - touchOnePrevPos).magnitude; float touchDeltaMag = (touchZero.position - touchOne.position).magnitude; // Find the difference in the distances between each frame. zoomFactor = 0.05f * (touchDeltaMag - prevTouchDeltaMag); } ZoomMapUsingTouchOrMouse(zoomFactor); break; default: break; } } void ZoomMapUsingTouchOrMouse(float zoomFactor) { var y = zoomFactor * _zoomSpeed; transform.localPosition += (transform.forward * y); } void HandleMouseAndKeyBoard() { if (Input.GetMouseButton(0) && !EventSystem.current.IsPointerOverGameObject()) { var mousePosition = Input.mousePosition; mousePosition.z = _referenceCamera.transform.localPosition.y; _delta = _referenceCamera.ScreenToWorldPoint(mousePosition) - _referenceCamera.transform.localPosition; _delta.y = 0f; if (_shouldDrag == false) { _shouldDrag = true; _origin = _referenceCamera.ScreenToWorldPoint(mousePosition); } } else { _shouldDrag = false; } if (_shouldDrag == true) { var offset = _origin - _delta; offset.y = transform.localPosition.y; transform.localPosition = offset; } else { if (EventSystem.current.IsPointerOverGameObject()) { return; } var x = Input.GetAxis("Horizontal"); var z = Input.GetAxis("Vertical"); var y = Input.GetAxis("Mouse ScrollWheel") * _zoomSpeed; if (!(Mathf.Approximately(x, 0) || Mathf.Approximately(y, 0) || Mathf.Approximately(z, 0))) { transform.localPosition += transform.forward * y + (_originalRotation * new Vector3(x * _panSpeed, 0, z * _panSpeed)); _map.UpdateMap(); } } } void Awake() { _originalRotation = Quaternion.Euler(0, transform.eulerAngles.y, 0); if (_referenceCamera == null) { _referenceCamera = GetComponent(); if (_referenceCamera == null) { throw new System.Exception("You must have a reference camera assigned!"); } } } void LateUpdate() { if (Input.touchSupported && Input.touchCount > 0) { HandleTouch(); } else { HandleMouseAndKeyBoard(); } } } }