Exemplo n.º 1
0
 public void Set(PathPlanParams planParams, Pool <PathPlanner> .Node pathPlanner, IPathAgent agent)
 {
     m_pathPlanParams      = planParams;
     m_pathPlanner         = pathPlanner;
     m_replanTimeRemaining = planParams.ReplanInterval;
     m_agent = agent;
 }
Exemplo n.º 2
0
 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));
     }
 }
Exemplo n.º 4
0
    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);
    }
Exemplo n.º 5
0
    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;
    }