/// <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); }