Advertisement
Guest User

Untitled

a guest
Nov 20th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.61 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. /// <summary>
  6. /// Componente que habilita a un objeto para calcular rutas sobre un AStarGraph
  7. /// </summary>
  8. public class AStarNavigator : MonoBehaviour {
  9. protected AStarGraph _graph; // Estructura con los nodos del grafo que recorreremos
  10. public List<Vector2> lista = new List<Vector2>();
  11. // Use this for initialization
  12. void Start () {
  13. _graph = FindObjectOfType<AStarGraph>();
  14. }
  15. //MASL
  16. /// <summary>
  17. /// Devuelve el camino para ir desde la posición start hasta end
  18. /// </summary>
  19. /// <returns>The path.</returns>
  20. /// <param name="start">Posición inicial del camino.</param>
  21. /// <param name="end">Posición objetivo.</param>
  22. public List<Vector2> GetPath(Vector2 start, Vector2 end) {
  23.  
  24. //f estimacion hasta el final
  25. //h camino recorrido
  26. //g estimacion actual al final
  27. // TODO: Implementar
  28. List<Vector2> listaAbierta = new List<Vector2>();
  29. List<Vector2> listaCerrada = new List<Vector2>();
  30. listaAbierta.Add(start);
  31.  
  32. while(){
  33. Vector2 posicionActual = listaAbierta[0];
  34. AStarNode nodoActual = _graph.nodes[(int)posicionActual.x, (int)posicionActual.y];
  35. listaAbierta.RemoveAt(0);
  36. listaCerrada.Add(posicionActual);
  37. List<Vector2> hijos = new List<Vector2>();
  38. //calcular factores para cada hijo
  39. if (nodoActual.north != null)
  40. {
  41. hijos.Add(nodoActual.north.otherNode.position);
  42. }
  43. if (nodoActual.south != null)
  44. {
  45. hijos.Add(nodoActual.south.otherNode.position);
  46. }
  47. if (nodoActual.east != null)
  48. {
  49. hijos.Add(nodoActual.east.otherNode.position);
  50. }
  51. if (nodoActual.west != null)
  52. {
  53. hijos.Add(nodoActual.west.otherNode.position);
  54. }
  55. if (nodoActual.northWest != null)
  56. {
  57. hijos.Add(nodoActual.northWest.otherNode.position);
  58. }
  59. if (nodoActual.northEast != null)
  60. {
  61. hijos.Add(nodoActual.northEast.otherNode.position);
  62. }
  63. if (nodoActual.southEast != null)
  64. {
  65. hijos.Add(nodoActual.southEast.otherNode.position);
  66. }
  67. if (nodoActual.southWest != null)
  68. {
  69. hijos.Add(nodoActual.southWest.otherNode.position);
  70. }
  71. int posicionMejorHijo=0;
  72. foreach (var hijo in hijos)
  73. {
  74. AStarNode nodoHijo = _graph.nodes[(int)hijo.x, (int)hijo.y];
  75. if (hijo == end) break;
  76. if (listaCerrada.Contains(hijo))
  77. {
  78. break;
  79. }
  80. else if (listaAbierta.Contains(hijo))
  81. {
  82. if (nodoHijo.distanciaRecorrida < _graph.nodes[(int)listaAbierta[listaAbierta.BinarySearch(hijo)].x, (int)listaAbierta[listaAbierta.BinarySearch(hijo)].y].distanciaRecorrida) {
  83. //nuevoPadre=nodoActual
  84. //recalcular factores
  85. }
  86. }
  87. else
  88. {
  89. //padre=nodoActual
  90. //recalcularFactores
  91. }
  92. }
  93.  
  94. }
  95.  
  96.  
  97. //if (start == end) return lista;
  98. //List<Vector2> listaAbierta = new List<Vector2>();
  99. //List<Vector2> listaCerrada = new List<Vector2>();
  100. //listaAbierta.Add(start);
  101. //_graph.nodes[(int)start.x, (int)start.y].distanciaEstimada = Mathf.Abs(start.x - end.x) + Mathf.Abs(start.y - end.y);
  102. //_graph.nodes[(int)start.x, (int)start.y].distanciaReal = _graph.nodes[(int)start.x, (int)start.y].distanciaEstimada;
  103. //_graph.nodes[(int)start.x, (int)start.y].distanciaRecorrida = 0;
  104. //while (listaAbierta.Count!=0)
  105. //{
  106. // Vector2 mejorVector=listaAbierta[0];
  107. // for (int i = 0; i < listaAbierta.Count; i++) {
  108. // if (i == 0) { }
  109. // else if(_graph.nodes[(int)listaAbierta[i].x, (int)listaAbierta[i].y].distanciaReal< _graph.nodes[(int)listaAbierta[i-1].x, (int)listaAbierta[i - 1].y].distanciaReal)
  110. // {
  111. // mejorVector = listaAbierta[i];
  112. // }
  113. // }
  114. // _graph.nodes[(int)mejorVector.x, (int)mejorVector.y].padre = _graph.nodes[(int)_graph.nodes[(int)mejorVector.x, (int)mejorVector.y].posicionPadre.x, (int)_graph.nodes[(int)mejorVector.x, (int)mejorVector.y].posicionPadre.y];
  115.  
  116.  
  117. // listaCerrada.Add(mejorVector);
  118. // listaAbierta.Remove(mejorVector);
  119. // if (mejorVector == end) return listaCerrada;
  120. // List<Vector2> hijos = new List<Vector2>();
  121. // AStarNode nodo = _graph.nodes[(int)listaCerrada[listaCerrada.Count-1].x, (int)listaCerrada[listaCerrada.Count - 1].y];
  122. // if (nodo.north!=null)
  123. // {
  124. // Vector2 comprobante = nodo.north.otherNode.position;
  125. // if (!listaCerrada.Contains(comprobante))
  126. // {
  127. // nodo.north.otherNode.distanciaRecorrida = nodo.distanciaRecorrida + nodo.north.distance;
  128. // nodo.north.otherNode.distanciaEstimada = Mathf.Abs(nodo.north.otherNode.position.x - end.x) + Mathf.Abs(nodo.north.otherNode.position.y - end.y);
  129. // nodo.north.otherNode.distanciaReal = nodo.north.otherNode.distanciaRecorrida + nodo.north.otherNode.distanciaEstimada;
  130. // }
  131. // else if (nodo.north.otherNode.distanciaRecorrida < _graph.nodes[(int)nodo.north.otherNode.position.x, (int)nodo.north.otherNode.position.y].distanciaRecorrida) {
  132. // listaAbierta.Remove(comprobante);
  133. // }
  134. // hijos.Add(nodo.north.otherNode.position);
  135. // nodo.north.otherNode.posicionPadre = nodo.position;
  136.  
  137. // }
  138. // if (nodo.south!=null)
  139. // {
  140. // Vector2 comprobante = nodo.south.otherNode.position;
  141. // if (!listaCerrada.Contains(comprobante))
  142. // {
  143. // nodo.south.otherNode.distanciaRecorrida = nodo.distanciaRecorrida + nodo.south.distance;
  144. // nodo.south.otherNode.distanciaEstimada = Mathf.Abs(nodo.south.otherNode.position.x - end.x) + Mathf.Abs(nodo.south.otherNode.position.y - end.y);
  145. // nodo.south.otherNode.distanciaReal = nodo.south.otherNode.distanciaRecorrida + nodo.south.otherNode.distanciaEstimada;
  146. // }
  147. // else if (nodo.south.otherNode.distanciaRecorrida < _graph.nodes[(int)nodo.south.otherNode.position.x, (int)nodo.south.otherNode.position.y].distanciaRecorrida)
  148. // {
  149. // listaAbierta.Remove(comprobante);
  150. // }
  151. // hijos.Add(nodo.east.otherNode.position);
  152. // nodo.south.otherNode.posicionPadre = nodo.position;
  153.  
  154. // }
  155. // if (nodo.east!=null)
  156. // {
  157. // Vector2 comprobante = nodo.east.otherNode.position;
  158. // if (!listaCerrada.Contains(comprobante))
  159. // {
  160. // nodo.east.otherNode.distanciaRecorrida = nodo.distanciaRecorrida + nodo.east.distance;
  161. // nodo.east.otherNode.distanciaEstimada = Mathf.Abs(nodo.east.otherNode.position.x - end.x) + Mathf.Abs(nodo.east.otherNode.position.y - end.y);
  162. // nodo.east.otherNode.distanciaReal = nodo.east.otherNode.distanciaRecorrida + nodo.east.otherNode.distanciaEstimada;
  163. // }
  164. // else if (nodo.east.otherNode.distanciaRecorrida < _graph.nodes[(int)nodo.east.otherNode.position.x, (int)nodo.east.otherNode.position.y].distanciaRecorrida)
  165. // {
  166. // listaAbierta.Remove(comprobante);
  167. // }
  168. // hijos.Add(nodo.east.otherNode.position);
  169. // nodo.east.otherNode.posicionPadre = nodo.position;
  170.  
  171. // }
  172. // if (nodo.west!=null)
  173. // {
  174. // Vector2 comprobante = nodo.west.otherNode.position;
  175. // if (!listaCerrada.Contains(comprobante))
  176. // {
  177. // nodo.west.otherNode.distanciaRecorrida = nodo.distanciaRecorrida + nodo.west.distance;
  178. // nodo.west.otherNode.distanciaEstimada = Mathf.Abs(nodo.west.otherNode.position.x - end.x) + Mathf.Abs(nodo.west.otherNode.position.y - end.y);
  179. // nodo.west.otherNode.distanciaReal = nodo.west.otherNode.distanciaRecorrida + nodo.west.otherNode.distanciaEstimada;
  180. // }
  181. // else if (nodo.west.otherNode.distanciaRecorrida < _graph.nodes[(int)nodo.west.otherNode.position.x, (int)nodo.west.otherNode.position.y].distanciaRecorrida)
  182. // {
  183. // listaAbierta.Remove(comprobante);
  184. // }
  185. // hijos.Add(nodo.west.otherNode.position);
  186. // nodo.west.otherNode.posicionPadre = nodo.position;
  187.  
  188. // }
  189. // if (nodo.northWest!=null)
  190. // {
  191. // Vector2 comprobante = nodo.northWest.otherNode.position;
  192. // if (!listaCerrada.Contains(comprobante))
  193. // {
  194. // nodo.northWest.otherNode.distanciaRecorrida = nodo.distanciaRecorrida + nodo.northWest.distance;
  195. // nodo.northWest.otherNode.distanciaEstimada = Mathf.Abs(nodo.northWest.otherNode.position.x - end.x) + Mathf.Abs(nodo.northWest.otherNode.position.y - end.y);
  196. // nodo.northWest.otherNode.distanciaReal = nodo.northWest.otherNode.distanciaRecorrida + nodo.northWest.otherNode.distanciaEstimada;
  197. // }
  198. // else if (nodo.northWest.otherNode.distanciaRecorrida < _graph.nodes[(int)nodo.northWest.otherNode.position.x, (int)nodo.northWest.otherNode.position.y].distanciaRecorrida)
  199. // {
  200. // listaAbierta.Remove(comprobante);
  201. // }
  202. // hijos.Add(nodo.northWest.otherNode.position);
  203. // nodo.northWest.otherNode.posicionPadre = nodo.position;
  204.  
  205. // }
  206. // if (nodo.northEast!=null)
  207. // {
  208. // Vector2 comprobante = nodo.northEast.otherNode.position;
  209. // if (!listaCerrada.Contains(comprobante))
  210. // {
  211. // nodo.northEast.otherNode.distanciaRecorrida = nodo.distanciaRecorrida + nodo.northEast.distance;
  212. // nodo.northEast.otherNode.distanciaEstimada = Mathf.Abs(nodo.northEast.otherNode.position.x - end.x) + Mathf.Abs(nodo.northEast.otherNode.position.y - end.y);
  213. // nodo.northEast.otherNode.distanciaReal = nodo.northEast.otherNode.distanciaRecorrida + nodo.northEast.otherNode.distanciaEstimada;
  214. // }
  215. // else if (nodo.northEast.otherNode.distanciaRecorrida < _graph.nodes[(int)nodo.northEast.otherNode.position.x, (int)nodo.northEast.otherNode.position.y].distanciaRecorrida)
  216. // {
  217. // listaAbierta.Remove(comprobante);
  218. // }
  219. // hijos.Add(nodo.northEast.otherNode.position);
  220. // nodo.northEast.otherNode.posicionPadre = nodo.position;
  221.  
  222. // }
  223. // if (nodo.southWest!=null)
  224. // {
  225. // Vector2 comprobante = nodo.southWest.otherNode.position;
  226. // if (!listaCerrada.Contains(comprobante))
  227. // {
  228. // nodo.southWest.otherNode.distanciaRecorrida = nodo.distanciaRecorrida + nodo.southWest.distance;
  229. // nodo.southWest.otherNode.distanciaEstimada = Mathf.Abs(nodo.southWest.otherNode.position.x - end.x) + Mathf.Abs(nodo.southWest.otherNode.position.y - end.y);
  230. // nodo.southWest.otherNode.distanciaReal = nodo.southWest.otherNode.distanciaRecorrida + nodo.southWest.otherNode.distanciaEstimada;
  231. // }
  232. // if (nodo.southWest.otherNode.distanciaRecorrida < _graph.nodes[(int)nodo.southWest.otherNode.position.x, (int)nodo.southWest.otherNode.position.y].distanciaRecorrida)
  233. // {
  234. // listaAbierta.Remove(comprobante);
  235. // }
  236. // hijos.Add(nodo.southWest.otherNode.position);
  237. // nodo.southWest.otherNode.posicionPadre = nodo.position;
  238.  
  239. // }
  240. // if (nodo.southEast!=null)
  241. // {
  242. // Vector2 comprobante = nodo.southEast.otherNode.position;
  243. // if (!listaCerrada.Contains(comprobante))
  244. // {
  245. // nodo.southEast.otherNode.distanciaRecorrida = nodo.distanciaRecorrida + nodo.southEast.distance;
  246. // nodo.southEast.otherNode.distanciaEstimada = Mathf.Abs(nodo.southEast.otherNode.position.x - end.x) + Mathf.Abs(nodo.southEast.otherNode.position.y - end.y);
  247. // nodo.southEast.otherNode.distanciaReal = nodo.southEast.otherNode.distanciaRecorrida + nodo.southEast.otherNode.distanciaEstimada;
  248. // }
  249. // if (nodo.southEast.otherNode.distanciaRecorrida < _graph.nodes[(int)nodo.southEast.otherNode.position.x, (int)nodo.southEast.otherNode.position.y].distanciaRecorrida)
  250. // {
  251. // listaAbierta.Remove(comprobante);
  252. // }
  253. // hijos.Add(nodo.southEast.otherNode.position);
  254. // nodo.southEast.otherNode.posicionPadre = nodo.position;
  255.  
  256.  
  257. // }
  258. // listaAbierta.AddRange(hijos);
  259. //}
  260. //AStarNode nodoActual = _graph.nodes[(int)end.x, (int)end.y];
  261. //List<Vector2> listaFinal = new List<Vector2>();
  262. //while (nodoActual.position != start) {
  263. // Debug.Log("asdasd");
  264. // listaFinal.Add(nodoActual.position);
  265. // nodoActual = nodoActual.padre;
  266. //}
  267. //return listaFinal;
  268. }
  269.  
  270. /// <summary>
  271. /// Devuelve el camino para ir desde la posición start hasta end. Es un método helper para facilitar la conversión entre Vector2 y Vector3 de los parámetros
  272. /// </summary>
  273. /// <returns>The path.</returns>
  274. /// <param name="start">Posición inicial del camino.</param>
  275. /// <param name="end">Posición objetivo.</param>
  276. //public List<Vector2> GetPath(Vector3 start, Vector3 end) {
  277. // return GetPath(new Vector2(start.x, start.y), new Vector2(end.x, end.y));
  278. //}
  279.  
  280. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement