/* INFINITY CODE 2013-2016 */
/* http://www.infinity-code.com */
using UnityEngine;
namespace InfinityCode.OnlineMapsExamples
{
[AddComponentMenu("Infinity Code/Online Maps/Examples (API Usage)/SmoothMoveExample")]
public class SmoothMove : MonoBehaviour
{
///
/// Move duration (sec)
///
public float time = 3;
///
/// Relative position (0-1) between from and to
///
private float angle;
///
/// Movement trigger
///
private bool isMovement;
private Vector2 fromPosition;
private Vector2 toPosition;
private OnlineMapsMarker marker;
private void Start(){
OnlineMaps api = OnlineMaps.instance;
marker = api.AddMarker(api.position);
// Subscribe to UpdateBefore event.
// OnlineMapsLocationService.instance.OnCompassChanged += OnCompassChanged;
// Create a new marker.
marker = OnlineMaps.instance.AddMarker(new Vector2(), "Player");
// Subscribe to UpdateBefore event.
OnlineMaps.instance.OnUpdateBefore += OnUpdateBefore;
}
private void Update()
{
moveCenter ();
}
private void LateUpdate(){
// if not movement then return
if (!isMovement) return;
// update relative position
angle += Time.deltaTime / time;
if (angle > 1)
{
// stop movement
isMovement = false;
angle = 1;
}
// Set new position
OnlineMaps.instance.position = Vector2.Lerp(fromPosition, toPosition, angle);
marker.position = Vector2.Lerp(fromPosition, toPosition, angle);
}
private Vector2 getCurrentMapPosition(){
// from current map position
fromPosition = OnlineMaps.instance.position;
return fromPosition;
}
private Vector2 getCurrentGPSPosition(){
// to GPS position;
toPosition = OnlineMaps.instance.GetComponent().position;
return toPosition;
}
private Vector2 calculateCurrentTilePosition(){
Vector2 fromTile = OnlineMapsUtils.LatLongToTilef(getCurrentMapPosition(), OnlineMaps.instance.zoom);
return fromTile;
}
private Vector2 calculateNewTilePosition(){
Vector2 toTile = OnlineMapsUtils.LatLongToTilef(getCurrentGPSPosition(), OnlineMaps.instance.zoom);
return toTile;
}
private float setAngleToZero(){
// set relative position 0
return angle = 0;
}
private void moveCenterWhenMovementIsFar(){
OnlineMaps.instance.position = getCurrentGPSPosition();
}
private void moveCenter(){
// On click button, starts movement
if (getCurrentMapPosition() != getCurrentGPSPosition())
{
// if tile offset < 4, then start smooth movement
if ((calculateCurrentTilePosition() - calculateNewTilePosition()).magnitude < 4)
{
// set relative position 0
setAngleToZero ();
// start movement
isMovement = true;
}
else // too far
{
moveCenterWhenMovementIsFar ();
}
}
}
// private void OnCompassChanged(float f)
// {
// OnlineMapsTileSetControl.instance.cameraRotation.y = f * 360;
// }
private void OnUpdateBefore()
{
// Update camera rotation
OnlineMapsTileSetControl.instance.cameraRotation = new Vector2(0, marker.rotation * 360);
}
//End Class
}
}