public void Set(PathPlanParams planParams, Pool <PathPlanner> .Node pathPlanner, IPathAgent agent) { m_pathPlanParams = planParams; m_pathPlanner = pathPlanner; m_replanTimeRemaining = planParams.ReplanInterval; m_agent = agent; }
public void Set(PathPlanParams_Batch planParams, Pool <PathPlanner> .Node pathPlanner, IPathAgent agent) { m_pathPlanParams = planParams; m_pathPlanner = pathPlanner; m_agent = agent; m_solutionNodeList.Clear(); }
//NEEDED IF USING THE QUEUE DISPATCH SYSTEM. public static void Update() { for (int i = 0; i < maxDispatchedAgent; i++) { if (waitingForPath.Count == 0) { break; } IPathAgent agent = waitingForPath.Dequeue(); agent.ReceivePath(GetPath(agent.PathFindingStart, agent.PathFindingEnd)); } }
public IPathRequestQuery RequestPathPlan(PathPlanParams_Batch pathPlanParams, IPathAgent agent) { if (!m_bInitialized) { UnityEngine.Debug.LogError("PathManagerComponent isn't yet fully intialized. Wait until Start() has been called. Can't call RequestPathPlan."); return(null); } if (m_requestPool.Count == 0) { UnityEngine.Debug.Log("RequestPathPlan failed because it is already servicing the maximum number of requests: " + m_maxNumberOfPlanners.ToString()); return(null); } if (m_pathPlannerPool.AvailableCount == 0) { UnityEngine.Debug.Log("RequestPathPlan failed because it is already servicing the maximum number of path requests: " + m_maxNumberOfPlanners.ToString()); return(null); } // Clamp the start and goal positions within the terrain space, and make sure they are on the floor. //pathPlanParams.UpdateStartAndGoalPos( m_terrain.GetValidPathFloorPos(pathPlanParams.StartPos) ); // Make sure this agent does not have an active request if (m_activeRequests.Count > 0) { foreach (PathRequest_Batch pathRequest in m_activeRequests) { if (pathRequest.Agent.GetHashCode() == agent.GetHashCode()) { System.Diagnostics.Debug.Assert(false, "Each agent can only have one path request at a time."); return(null); } } } // Create the new request Pool <PathPlanner> .Node pathPlanner = m_pathPlannerPool.Get(); PathRequest_Batch request = m_requestPool.Dequeue(); request.Set(pathPlanParams, pathPlanner, agent); m_activeRequests.AddFirst(request); // Start the request pathPlanner.Item.StartANewPlan(request.PlanParams.GetCurrentIndex(), request.PlanParams.GetCurrentGoalIndexAndMoveNext()); return(request); }
public static void FindPath(IPathAgent agent, Vector3 endLocation) { var dir = endLocation - agent.transform.position; var hit = Physics2D.Raycast(agent.transform.position, dir, dir.magnitude, Mesh.terrainLayer); if (hit.collider == null) { agent.OnPathFound(new List <Vector3>() { endLocation }, float.Epsilon); return; } var start = Mesh[agent.transform.position]; var end = Mesh[endLocation]; if (start == null || start.disabled || end == null || end.disabled) { agent.OnPathFailed(5); return; } var request = new PathRequest() { agent = agent, start = start, end = end }; Instance.pathRequests.Enqueue(request); if (pathThreads < MaxPathThreads) { pathThreads++; Task task = new Task(PathThread); task.Start(); } }
public static void RequestPath(IPathAgent agent, Vector3 start, Vector3 end) { waitingForPath.Enqueue(agent); agent.PathFindingStart = start; agent.PathFindingEnd = end; }
public IPathRequestQuery RequestPathPlan(PathPlanParams pathPlanParams, IPathAgent agent) { if ( !m_bInitialized ) { UnityEngine.Debug.LogError("PathManagerComponent isn't yet fully intialized. Wait until Start() has been called. Can't call RequestPathPlan."); return null; } if ( m_requestPool.Count == 0 ) { UnityEngine.Debug.Log("RequestPathPlan failed because it is already servicing the maximum number of requests: " + m_maxNumberOfPlanners.ToString()); return null; } if ( m_pathPlannerPool.AvailableCount == 0 ) { UnityEngine.Debug.Log("RequestPathPlan failed because it is already servicing the maximum number of path requests: " + m_maxNumberOfPlanners.ToString()); return null; } // Clamp the start and goal positions within the terrain space, and make sure they are on the floor. pathPlanParams.UpdateStartAndGoalPos( m_terrain.GetValidPathFloorPos(pathPlanParams.StartPos) ); // Make sure this agent does not have an active request if ( m_activeRequests.Count > 0 ) { foreach ( PathRequest pathRequest in m_activeRequests ) { if ( pathRequest.Agent.GetHashCode() == agent.GetHashCode() ) { System.Diagnostics.Debug.Assert(false, "Each agent can only have one path request at a time."); return null; } } } // Make sure this agent does not have a completed request if ( m_activeRequests.Count > 0 ) { foreach ( PathRequest pathRequest in m_completedRequests ) { if ( pathRequest.Agent.GetHashCode() == agent.GetHashCode() ) { System.Diagnostics.Debug.Assert(false, "Each agent can only have one path request at a time."); return null; } } } // Create the new request Pool<PathPlanner>.Node pathPlanner = m_pathPlannerPool.Get(); PathRequest request = m_requestPool.Dequeue(); request.Set(pathPlanParams, pathPlanner, agent); m_activeRequests.AddFirst(request); // Start the request int startNodeIndex = m_terrain.GetPathNodeIndex(pathPlanParams.StartPos); int goalNodeIndex = m_terrain.GetPathNodeIndex(pathPlanParams.GoalPos); pathPlanner.Item.StartANewPlan(startNodeIndex, goalNodeIndex); return request; }