/// <summary>
        /// Finds path from start to goal using grid
        /// </summary>
        /// <param name="start"></param>
        /// <param name="goal"></param>
        /// <param name="settings"></param>
        /// <returns></returns>
        public Stack <Vector3> FindGridPath(Vector3 start, Vector3 goal, PathfindingSettings settings)
        {
            var pathPoints = new Stack <Vector3>();

            if (pathfindingType == PathfindingType.navmeshOnly)
            {
                return(pathPoints);
            }
            if (chunks == null)
            {
                return(pathPoints);
            }


            var tempNodes = new TempNodeDictionary();

            var gridStart = GetClosestGridNode(start);
            var gridGoal  = GetClosestGridNode(goal);

            tempNodes.AddNode(gridStart, start);
            tempNodes.AddNode(gridGoal, goal);


            pathPoints = settings.RunAlgorithm(tempNodes[gridStart], tempNodes[gridGoal], gridSettings.isoLevel, out openNodes, out closedNodes, 50000, gridNodeCount);

            tempNodes.Cleanup();

            if (settings.benchmark)
            {
                var lr = GetComponent <LineRenderer>();
                lr.positionCount = pathPoints.Count;
                lr.SetPositions(pathPoints.ToArray());
            }
            return(pathPoints);
        }
        /// <summary>
        /// Finds path from start to goal using NavMesh
        /// </summary>
        /// <param name="start"></param>
        /// <param name="goal"></param>
        /// <param name="settings"></param>
        /// <returns></returns>
        public Stack <Vector3> FindGraphPath(Vector3 start, Vector3 goal, PathfindingSettings settings)
        {
            var pathPoints = new Stack <Vector3>();

            if (pathfindingType == PathfindingType.gridOnly)
            {
                return(pathPoints);
            }
            if (chunks == null)
            {
                return(pathPoints);
            }


            var nodesClosestToHit = new List <Node>();

            var hits = GetNavMeshIntersections(start, goal);

            if (hits.Count > 1)
            {
                var tempNodes = new TempNodeDictionary();
                for (int i = 0; i < hits.Count - 1; i += 2)
                {
                    //add temp nodes at navmesh hits
                    nodesClosestToHit.Add(GetClosestGraphNode(hits[i]));
                    nodesClosestToHit.Add(GetClosestGraphNode(hits[i + 1]));
                    if (i > 0)
                    {
                        tempNodes.AddNode(nodesClosestToHit[i], hits[i]);

                        //link navmesh exiting hits with entering hits
                        if (i % 2 == 0)
                        {
                            tempNodes[nodesClosestToHit[i]].neighbours.Add(tempNodes[nodesClosestToHit[i - 1]]);
                            tempNodes[nodesClosestToHit[i - 1]].neighbours.Add(tempNodes[nodesClosestToHit[i]]);
                        }
                    }
                    if (i < hits.Count - 2)
                    {
                        tempNodes.AddNode(nodesClosestToHit[i + 1], hits[i + 1]);
                    }
                }
                tempNodes.AddNode(nodesClosestToHit[0], start);
                tempNodes.AddNode(nodesClosestToHit[hits.Count - 1], goal);

                pathPoints = settings.RunAlgorithm(tempNodes[nodesClosestToHit[0]], tempNodes[nodesClosestToHit[hits.Count - 1]], -1, out openNodes, out closedNodes, 50000, gridNodeCount / 100);
                tempNodes.Cleanup();
            }
            else
            {
                pathPoints.Push(goal);
                pathPoints.Push(start);
            }

            if (settings.benchmark)
            {
                var lr = GetComponent <LineRenderer>();
                lr.positionCount = pathPoints.Count;
                lr.SetPositions(pathPoints.ToArray());
            }
            return(pathPoints);
        }