using System; using UnityEngine; public class JumpToLocation : MonoBehaviour { public double destinationLng; public double destinationLat; public float destinationZoom; public float duration; public AnimationCurve zoomCurve; public AnimationCurve locationCurve; private bool started; private float progress; private float originZoom; private double originMercatX; private double originMercatY; private double destinationMercatX; private double destinationMercatY; private float farZoom; private void OnGUI() { if (started) { if (GUILayout.Button("Stop")) started = false; } else if (GUILayout.Button("Start")) StartAnimation(); } private void StartAnimation() { started = true; progress = 0; originZoom = OnlineMaps.instance.floatZoom; if (Math.Abs(destinationZoom) < float.Epsilon) destinationZoom = originZoom; OnlineMaps.instance.GetPosition(out originMercatX, out originMercatY); Vector2 center; int z; OnlineMapsUtils.GetCenterPointAndZoom(new[] { new Vector2((float)originMercatX, (float)originMercatY), new Vector2((float)destinationLng, (float)destinationLat) }, out center, out z); farZoom = z; destinationMercatX = destinationLng; destinationMercatY = destinationLat; OnlineMapsUtils.LatLongToMercat(ref originMercatX, ref originMercatY); OnlineMapsUtils.LatLongToMercat(ref destinationMercatX, ref destinationMercatY); double dx = originMercatX - destinationMercatX; if (dx < -0.5) destinationMercatX -= 1; else if (dx > 0.5) destinationMercatX += 1; } private void Update() { if (!started) return; progress += Time.deltaTime / duration; if (progress >= 1) { progress = 0; OnlineMaps.instance.SetPositionAndZoom(destinationLng, destinationLat, destinationZoom); started = false; return; } float lp = locationCurve.Evaluate(progress); float zp = zoomCurve.Evaluate(progress); double mx = (destinationMercatX - originMercatX) * lp + originMercatX; if (mx < 0) mx += 1; else if (mx > 1) mx -= 1; double my = (destinationMercatY - originMercatY) * lp + originMercatY; float z = progress < 0.5 ? originZoom : destinationZoom; z = (farZoom - z) * zp + z; int zs = 1 << (int) z; mx = mx * zs; my = my * zs; OnlineMaps.instance.projection.TileToCoordinates(mx, my, (int)z, out mx, out my); OnlineMaps.instance.SetPositionAndZoom(mx, my, z); } }