private void Recalculate(bool changeTarget) { List <GameObject> agents = new List <GameObject>(); agents.Add(gameObject); // Source to Target if (changeTarget || Target != null) { Destroy(Target); Target = SpawnAgentsScript.Spawn(false, agents, color); replans = 0; // can't forget this } var edge = DrawVisibilityGraphScript.DrawVisibilityEdge( transform.position, Target.transform.position, Color.green, false, true, false, true ); Path = new List <Vector2>(); if (edge != null) { Path.Add(edge[1]); } if (Path.Count > 0) // if there's a direct path between two points, no need to even compute A*, just walk the path! { return; } // Clone a fresh new graph Graph = new VisibilityGraph(); Graph.Vertices = OriginalGraph.ClonedVertices(); Graph.AdjList = OriginalGraph.ClonedAdjList(); Graph.SetSource(transform.position); Graph.SetTarget(Target.transform.position); // Debug.DrawLine(transform.position, Target, color, 100); // Graph.PrintNumEdges(); // Edges from source/target to boundaries/obstacles DrawVisibilityGraphScript.DrawFromBoundaries( transform.position, Target.transform.position, color, Graph ); DrawVisibilityGraphScript.DrawFromObstacles( transform.position, Target.transform.position, color, Graph ); // Graph.PrintNumEdges(); /* * if (Graph.AdjList.ContainsKey(transform.position)) { * Debug.Log(Graph.AdjList[transform.position].Count); * } else { * Debug.Log("Nada"); * } */ if ( Graph.AdjList.ContainsKey(transform.position) && Graph.AdjList[transform.position].Count > 0 && Graph.AdjList.ContainsKey(Target.transform.position) && Graph.AdjList[Target.transform.position].Count > 0 ) { // Debug.Log("A Star time."); // Debug.Log(Time.realtimeSinceStartup); float planningTime = Time.realtimeSinceStartup; Path = Graph.AStar(); planningTime = Time.realtimeSinceStartup - planningTime; StatsScript.TotalPlanningTime += planningTime; // Debug.Log(Time.realtimeSinceStartup); } }
public GameObject Spawn( // Purpose is to make sure no overlap bool isSource, List <GameObject> agents, Color color ) { Vector2[] spots = { new Vector2(-2.94f, 0.66f), new Vector2(0.01f, 0.66f), new Vector2(2.22f, 0.66f), new Vector2(-1.96f, -1.68f) }; float randX; float randY; Vector2 rand = Vector2.up; GameObject agent; if (isSource) { agent = Instantiate(AgentPrefab, AgentContainer.transform); } else { agent = Instantiate(TargetPrefab, TargetContainer.transform); } agent.GetComponent <SpriteRenderer>().color = color; bool guarantee = true; RaycastHit2D hit = Physics2D.Raycast( Vector2.up, Vector2.up, 0 ); // placeholder, Unity won't let me set it to null while (guarantee || ( hit.collider != null && ( hit.collider.gameObject.CompareTag("Barbed Wire") || hit.collider.gameObject.CompareTag("Boundaries") ) ) || IsPointInObstacle(rand) || Touching(agent, agents) ) { guarantee = false; randX = Random.Range(-7.25f, 5.25f); randY = Random.Range(-5.61f, 3.69f); rand = new Vector2(randX, randY); agent.transform.position = rand; // Physics2D.SyncTransforms(); foreach (Vector2 spot in spots) { hit = Physics2D.Raycast( rand, spot - rand, Vector2.Distance(spot, rand), 1, -0.5f, 0.5f ); /* * Debug.Log(hit.collider); * Debug.DrawRay( * rand, * spot - rand, * color, 1000, false * ); */ if (!( hit.collider != null && ( hit.collider.gameObject.CompareTag("Barbed Wire") || hit.collider.gameObject.CompareTag("Boundaries") ) )) { break; } } } /* FAILED ATTEMPT AT RAYCASTHITALL * bool fail = true; * while (fail || IsPointInObstacle(rand) || Touching(agent, agents)) { * randX = Random.Range(-7.25f, 5.25f); * randY = Random.Range(-5.61f, 3.69f); * rand = new Vector2(randX, randY); * agent.transform.position = rand; * * foreach (Vector2 spot in spots) { * RaycastHit2D[] hits = Physics2D.RaycastAll( * rand, * spot - rand, * Vector2.Distance(spot, rand) * ); * * int falseCalls = 0; * bool exit = false; * foreach (RaycastHit2D hit in hits) { * if (hit.collider == null) { * fail = false; * break; * } else if (!hit.collider.gameObject.CompareTag("Agent")) { * Debug.Log(hit.collider); * if ( * hit.collider.gameObject.CompareTag("Barbed Wire") || hit.collider.gameObject.CompareTag("Boundaries") || ) { || exit = true; || } else { || fail = false; || } || break; || } else { || falseCalls++; || } || } || || if (!exit) { || if (hits.Length - falseCalls <= 0) { || fail = false; || } || } || } ||} */ // Passing down graphs, stats, id if (isSource) { VisibilityGraph graph = GetComponent <DrawVisibilityGraph>().Graph; VisibilityGraph graphCopy = new VisibilityGraph(); graphCopy.Vertices = graph.ClonedVertices(); graphCopy.AdjList = graph.ClonedAdjList(); agent.GetComponent <Pathing>().OriginalGraph = graphCopy; agent.GetComponent <Pathing>().SpawnAgentsScript = GetComponent <SpawnAgents>(); agent.GetComponent <Pathing>().DrawVisibilityGraphScript = GetComponent <DrawVisibilityGraph>(); agent.GetComponent <Pathing>().StatsScript = StatsScript; agent.GetComponent <Pathing>().Id = Id; Id++; } return(agent); }