139 lines
3.2 KiB
C#
139 lines
3.2 KiB
C#
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<Camera>();
|
|
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();
|
|
}
|
|
}
|
|
}
|
|
} |