<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Infinity Code Forum — How to find a route on terrains using Online Maps API]]></title>
		<link>https://forum.infinity-code.com/viewtopic.php?id=928</link>
		<atom:link href="https://forum.infinity-code.com/extern.php?action=feed&amp;tid=928&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[The most recent posts in How to find a route on terrains using Online Maps API.]]></description>
		<lastBuildDate>Wed, 31 Oct 2018 08:28:36 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[How to find a route on terrains using Online Maps API]]></title>
			<link>https://forum.infinity-code.com/viewtopic.php?pid=4132#p4132</link>
			<description><![CDATA[<p>Example of how to find a route on terrains created in Real World Terrain using Online Maps API.</p><p><div class="fancy_video_tag_player"><iframe class="youtube-player" type="text/html" width="640" height="385" src="https://www.youtube.com/embed/4i8wCejcdnA" frameborder="0"></iframe></div></p><p>Script:<br /></p><div class="codebox"><pre><code>/*     INFINITY CODE 2013-2018      */
/*   http://www.infinity-code.com   */

using InfinityCode.RealWorldTerrain;
using UnityEngine;

namespace InfinityCode.OnlineMapsExamples
{
    public class FindRouteOnTerrainUsingOnlineMaps : MonoBehaviour
    {
        /// &lt;summary&gt;
        /// Real World Terrain Container
        /// &lt;/summary&gt;
        public RealWorldTerrainContainer container;

        /// &lt;summary&gt;
        /// Material for the route, and points on terrainsMat
        /// &lt;/summary&gt;
        public Material lineRendererMaterial;

        /// &lt;summary&gt;
        /// Index of point (click)
        /// &lt;/summary&gt;
        private int pointIndex = 0;

        /// &lt;summary&gt;
        /// Coordinates of points
        /// &lt;/summary&gt;
        private Vector2[] points;

        /// &lt;summary&gt;
        /// Instances of points
        /// &lt;/summary&gt;
        private GameObject[] pointInstances;

        /// &lt;summary&gt;
        /// Instance of LineRenderer
        /// &lt;/summary&gt;
        private LineRenderer lineRenderer;

        /// &lt;summary&gt;
        /// Screen position of last press
        /// &lt;/summary&gt;
        private Vector2 pressPoint;

        /// &lt;summary&gt;
        /// This method is called when responding from the Google Directions API
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;response&quot;&gt;Response string&lt;/param&gt;
        private void OnGoogleDirectionsComplete(string response)
        {
            OnlineMapsGoogleDirectionsResult result = OnlineMapsGoogleDirections.GetResult(response);
            if (result == null || result.routes.Length == 0) return;

            Vector2[] polyline = result.routes[0].overview_polyline;

            GameObject go = new GameObject(&quot;LineRenderer&quot;);
            lineRenderer = go.AddComponent&lt;LineRenderer&gt;();
            lineRenderer.sharedMaterial = lineRendererMaterial;
            lineRenderer.widthCurve = AnimationCurve.Constant(0, 1, 2);
            lineRenderer.startColor = lineRenderer.endColor = Color.blue;
            lineRenderer.positionCount = polyline.Length;

            for (int i = 0; i &lt; polyline.Length; i++)
            {
                Vector3 p;
                container.GetWorldPosition(polyline[i], out p);
                lineRenderer.SetPosition(i, p + new Vector3(0, 2, 0));
            }
        }

        /// &lt;summary&gt;
        /// Process click on terrain
        /// &lt;/summary&gt;
        private void ProcessClick()
        {
            bool success = container.GetCoordinatesUnderCursor(out points[pointIndex]);
            if (!success) return;

            if (pointIndex == 0)
            {
                if (lineRenderer != null)
                {
                    DestroyImmediate(lineRenderer.gameObject);
                    DestroyImmediate(pointInstances[0]);
                    DestroyImmediate(pointInstances[1]);
                    lineRenderer = null;
                }
            }

            GameObject go = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            Vector3 p;
            container.GetWorldPosition(points[pointIndex], out p);
            go.transform.position = p;
            go.transform.localScale = new Vector3(3, 3, 3);
            go.GetComponent&lt;Renderer&gt;().sharedMaterial = lineRendererMaterial;
            pointInstances[pointIndex] = go;

            pointIndex++;
            if (pointIndex &lt; 2) return;

            pointIndex = 0;

            OnlineMapsGoogleDirections.Find(points[0], points[1]).OnComplete += OnGoogleDirectionsComplete;
        }

        private void Start()
        {
            points = new Vector2[2];
            pointInstances = new GameObject[2];
        }

        private void Update()
        {
            if (Input.GetMouseButtonDown(0)) pressPoint = Input.mousePosition;
            else if (Input.GetMouseButtonUp(0))
            {
                if ((pressPoint - (Vector2) Input.mousePosition).magnitude &lt; 10) ProcessClick();
            }
        }
    }
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Alex Vertax)]]></author>
			<pubDate>Wed, 31 Oct 2018 08:28:36 +0000</pubDate>
			<guid>https://forum.infinity-code.com/viewtopic.php?pid=4132#p4132</guid>
		</item>
	</channel>
</rss>
