/* 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 } }