namespace Mapbox.Unity.Map
{
using System.Collections;
using Mapbox.Unity.Location;
using UnityEngine;
public class UpdateMapWithLocationProvider : MonoBehaviour
{
[SerializeField]
AbstractMap _map;
ILocationProvider _locationProvider;
Vector3 _targetPosition;
bool _isMapInitialized = false;
///
/// The time taken to move from the start to finish positions
///
public float timeTakenDuringLerp = 1f;
//Whether we are currently interpolating or not
private bool _isLerping;
//The start and finish positions for the interpolation
private Vector3 _startPosition;
private Vector3 _endPosition;
private Utils.Vector2d _startLatLong;
private Utils.Vector2d _endLatlong;
//The Time.time value when we started the interpolation
private float _timeStartedLerping;
private void Awake()
{
// Prevent double initialization of the map.
_map.InitializeOnStart = false;
}
IEnumerator Start()
{
yield return null;
_locationProvider = LocationProviderFactory.Instance.DefaultLocationProvider;
_locationProvider.OnLocationUpdated += LocationProvider_OnFirstLocationUpdate;
}
void LocationProvider_OnFirstLocationUpdate(Unity.Location.Location location)
{
_locationProvider.OnLocationUpdated -= LocationProvider_OnFirstLocationUpdate;
_map.OnInitialized += () =>
{
_isMapInitialized = true;
_locationProvider.OnLocationUpdated += LocationProvider_OnLocationUpdated;
};
_map.Initialize(location.LatitudeLongitude, _map.AbsoluteZoom);
}
void LocationProvider_OnLocationUpdated(Unity.Location.Location location)
{
if (_isMapInitialized && location.IsLocationUpdated)
{
StartLerping(location);
}
}
///
/// Called to begin the linear interpolation
///
void StartLerping(Unity.Location.Location location)
{
_isLerping = true;
_timeStartedLerping = Time.time;
//Debug.Log(Time.deltaTime);
timeTakenDuringLerp = Time.deltaTime;
//We set the start position to the current position
_startLatLong = _map.CenterLatitudeLongitude;
_endLatlong = location.LatitudeLongitude;
_startPosition = _map.GeoToWorldPosition(_startLatLong, false);
_endPosition = _map.GeoToWorldPosition(_endLatlong, false);
}
//We do the actual interpolation in FixedUpdate(), since we're dealing with a rigidbody
void LateUpdate()
{
if (_isMapInitialized && _isLerping)
{
//We want percentage = 0.0 when Time.time = _timeStartedLerping
//and percentage = 1.0 when Time.time = _timeStartedLerping + timeTakenDuringLerp
//In other words, we want to know what percentage of "timeTakenDuringLerp" the value
//"Time.time - _timeStartedLerping" is.
float timeSinceStarted = Time.time - _timeStartedLerping;
float percentageComplete = timeSinceStarted / timeTakenDuringLerp;
//Perform the actual lerping. Notice that the first two parameters will always be the same
//throughout a single lerp-processs (ie. they won't change until we hit the space-bar again
//to start another lerp)
//_startPosition = _map.GeoToWorldPosition(_map.CenterLatitudeLongitude, false);
_startPosition = _map.GeoToWorldPosition(_startLatLong, false);
_endPosition = _map.GeoToWorldPosition(_endLatlong, false);
var position = Vector3.Lerp(_startPosition, _endPosition, percentageComplete);
var latLong = _map.WorldToGeoPosition(position);
_map.UpdateMap(latLong, _map.Zoom);
//When we've completed the lerp, we set _isLerping to false
if (percentageComplete >= 1.0f)
{
_isLerping = false;
}
}
}
}
}