private IEnumerator testPathfinding(Vector2 targetPosition) { ClearPath(); pathCalculated = false; PathfindingNode nodoInicial = new PathfindingNode(redondearPosicion(player.basicMovementServer.characterTransform.position), 0, null, redondearPosicion(targetPosition)); // Si la posicion a ir esta vacia... if (Scenario.scenarioRef.isWalkable(targetPosition)) { // Insertamos el primer nodo en la lista a explorar listaNodosAExplorar.Add(nodoInicial); // Expandimos nodos hasta que no queden mas... o hayamos encntrado el final while (listaNodosAExplorar.Count() > 0 && !pathCalculated) { GameObject gameObjectDebug = (GameObject)Instantiate(Resources.Load("Prefabs/Debug_Node")); gameObjectDebug.GetComponent <DebugIANode>().textoHeu.text = "h " + listaNodosAExplorar.Peek().heuristicaParcial.ToString(); gameObjectDebug.GetComponent <DebugIANode>().textoPeso.text = "p " + listaNodosAExplorar.Peek().distance.ToString(); gameObjectDebug.transform.position = listaNodosAExplorar.Peek().position; pathCalculated = listaNodosAExplorar.First().ExpandAll(listaNodosAExplorar, diccionarioNodosExplorados); yield return(new WaitForEndOfFrame()); } // Si se ha llegado al final reconstruimos y almacenamos el camino if (pathCalculated) { PathfindingNode nodoFinal = listaNodosAExplorar.First(); while (nodoFinal.parent != null) { AddNewWaypoint(nodoFinal.position); nodoFinal = nodoFinal.parent; } } } }
static void Main() { #region Test create list // Создание двух односвязных сортированных списков с разной сортировкой: SortedNodeList <int> sorterList1 = new SortedNodeList <int>(SortedNodeList <int> .SortedNodeListType.SortAscending) { 5, -15, 10, 1, 9, 4, -5, 1, -20, 50, -11, 0, 6 }; SortedNodeList <int> sorterList2 = new SortedNodeList <int>(SortedNodeList <int> .SortedNodeListType.SortDescending) { 5, -15, 10, 1, 9, 4, -5, 1, -20, 50, -11, 0, 6 }; //Вывод на экран двух списков Console.Write("List sort Ascending: "); PrintList(sorterList1); Console.WriteLine(); Console.Write("List sort Descending: "); PrintList(sorterList2); Console.WriteLine(); #endregion #region Add and remove test sorterList1.Add(-101); sorterList2.Add(-102); sorterList1.RemoveElement(10); sorterList2.RemoveElement(10); Console.Write("List one: "); PrintList(sorterList1); Console.WriteLine(); Console.Write("List two: "); PrintList(sorterList2); Console.WriteLine(); #endregion Console.WriteLine("Finish"); Console.ReadLine(); }
public static SortedNodeList <Node> GetChildren(Node node) { SortedNodeList <Node> children = new SortedNodeList <Node>(); if (node != null) { for (int i = 0; i < node.SlotCount; i++) { children.Add(node.GetNodeSlot(i)); } } return(children); }
public bool ExpandEach(SortedNodeList listaNodosAExplorar, Dictionary <Vector2, PathfindingNode> diccionarioNodos, Vector2 posicionAExplorar) { nodoExtraido = null; // Primero nos aseguramos de que estemos en una posicion dentro del mapa if (Scenario.scenarioRef.isWalkable(posicionAExplorar) && distance < 40) { diccionarioNodos.TryGetValue(posicionAExplorar, out nodoExtraido); // Si es la primera vez que alcanzamos ese nodo... if (nodoExtraido == null) { // Y no es el objetivo la anyadimos a la lista para explorar if (posicionAExplorar != targetPosition) { nodoCreado = new PathfindingNode(posicionAExplorar, (short)(distance + 1), this); nodoCreado.actualizarPesos(); listaNodosAExplorar.Add(nodoCreado); } // Si la posicion es la objetivo la encabezamos en la lista y detenemos la busqueda else { nodoCreado = new PathfindingNode(posicionAExplorar, (short)(distance + 1), this); listaNodosAExplorar.AddResultAtFirst(nodoCreado); return(true); } } // Si hemos llegado a un caso mejor... reordenamos los punteros else if (distance + 1 < nodoExtraido.distance) { nodoExtraido.distance = (short)(distance + 1); nodoExtraido.parent = this; nodoExtraido.actualizarPesos(); } } return(false); }