public void AnyadirPuntoRuta(PuntoRecorrido nuevo) { if (ruta == null) { ruta = new PuntoRecorrido[1]; ruta[0] = nuevo; } else { if (ruta[ruta.Length - 1] != nuevo) { PuntoRecorrido[] aux = new PuntoRecorrido[ruta.Length + 1]; for (int i = 0; i < ruta.Length; i++) { aux[i] = ruta[i]; } aux[ruta.Length] = nuevo; ruta = new PuntoRecorrido[aux.Length]; for (int i = 0; i < ruta.Length; i++) { ruta[i] = aux[i]; } } } }
public Nodo(Nodo _padre, PuntoRecorrido _este, Nodo _hijo, float _g, float _f) { padre = _padre; este = _este; hijo = _hijo; g = _g; f = _f; }
int IndicePuntoRuta(PuntoRecorrido punto) { int i = 0; while (i < ruta.Length && punto != ruta[i]) { i++; } return(i); }
void OnTriggerStay2D(Collider2D other) { if (other.gameObject.tag == "Path") { if (monstruo.EstadoMonstruoActual() != EstadosMonstruo.EnRuta) { PuntoRecorrido punto = other.GetComponent <PuntoRecorrido>(); puntoRutaActual = IndicePuntoRuta(punto); } } }
//Metodo que pone como posiciones conectadas a aquellas con las que se puede unir el punto en linea recta sin que choque contra ningun obstáculo. public void ReiniciarContactos() { gameObject.GetComponent <Collider2D>().enabled = false; int j = puntosDentro; PuntoRecorrido[] aux = new PuntoRecorrido[4]; for (int i = 0; i < puntosDentro; i++) { aux[i] = posiblesPosicionesConectadas[i]; posiblesPosicionesConectadas[i].GetComponent <Collider2D>().enabled = false; } PuntoRecorrido aux1; for (int i = 0; i < 4; i++) { if (!Vector2.Equals(cuatroPosiciones[i], Vector2.negativeInfinity)) { RaycastHit2D[] hit = new RaycastHit2D[2] { Physics2D.Raycast((Vector2)transform.position + cuatroCardinales[(i + 1) % 4], cuatroCardinales[i], Mathf.Infinity, conQueColisiona), Physics2D.Raycast((Vector2)transform.position + cuatroCardinales[(i + 3) % 4], cuatroCardinales[i], Mathf.Infinity, conQueColisiona) }; if (hit[0].collider != null && hit[1].collider != null && (aux[j] = hit[0].collider.gameObject.GetComponent <PuntoRecorrido>()) != null && (aux1 = hit[1].collider.gameObject.GetComponent <PuntoRecorrido>()) != null) { if (!(Mathf.Approximately(posiblesPosicionesConectadas[j].transform.position.x - transform.position.x, 0f) || Mathf.Approximately(posiblesPosicionesConectadas[j].transform.position.y - transform.position.y, 0f))) { aux[j] = aux1; } j++; } } } //Actualizamos las posiciones conectadas posicionesConectadas = new PuntoRecorrido[j]; for (int i = 0; i < j; i++) { posicionesConectadas[i] = aux[i]; } //Volvemos a activar su collider. gameObject.GetComponent <Collider2D>().enabled = true; for (int i = 0; i < j; i++) { posiblesPosicionesConectadas[i].GetComponent <Collider2D>().enabled = true; } }
PuntoRecorrido AjustarseAPuntoRecorrido(Vector3 punto, PuntoRecorrido[] pR) { float distancia = float.PositiveInfinity; PuntoRecorrido v = null; for (int i = 0; i < pR.Length; i++) { float aux = (punto - pR[i].transform.position).sqrMagnitude; if (aux < distancia) { distancia = aux; v = pR[i]; } } return(v); }
//Introduce los nodos en la lista que se encuentren en el punto y los que esten proyectando un raycast en las cuatro direcciones cardinales. public void IntroducirNodosEnCruz(Vector2 posicion, PuntoRecorrido[] puntosDistanciaManhattan) { //funcionVacia LlamadaDesactivar; //LlamadaDesactivar = () => { }; //Comprobamos que el punto no este dentro de uno de los puntos de la red. int i = 0; while (i < puntosTotales.Length && !puntosTotales[i].GetComponent <Collider2D>().bounds.Contains(posicion)) { i++; } if (i != puntosTotales.Length) { float distancia = puntosTotales[i].DistanciaHasta(posicion); IntroducirNodo(new Nodo(null, puntosTotales[i], null, distancia, distancia + ControladorRecorrido.instance.DistanciaMasCorta(posicion, puntosDistanciaManhattan))); } else { RaycastHit2D[] hit = new RaycastHit2D[4]; hit[0] = Physics2D.Raycast(posicion, Vector2.up, Mathf.Infinity, ControladorRecorrido.instance.conQueColisiona); Debug.DrawRay(posicion, Vector2.up, Color.green, 10f); hit[1] = Physics2D.Raycast(posicion, Vector2.right, Mathf.Infinity, ControladorRecorrido.instance.conQueColisiona); Debug.DrawRay(posicion, Vector2.right, Color.green, 10f); hit[2] = Physics2D.Raycast(posicion, Vector2.down, Mathf.Infinity, ControladorRecorrido.instance.conQueColisiona); Debug.DrawRay(posicion, Vector2.down, Color.green, 10f); hit[3] = Physics2D.Raycast(posicion, Vector2.left, Mathf.Infinity, ControladorRecorrido.instance.conQueColisiona); Debug.DrawRay(posicion, Vector2.left, Color.green, 10f); PuntoRecorrido aux = null; for (int j = 0; j < 4; j++) { if (hit[j].collider != null && (aux = hit[j].collider.GetComponent <PuntoRecorrido>()) != null) { float distancia = aux.DistanciaHasta(posicion); IntroducirNodo(new Nodo(null, aux, null, distancia, distancia + ControladorRecorrido.instance.DistanciaMasCorta(posicion, puntosDistanciaManhattan))); } } } }
public void QuitarUltimoPuntoRuta() { if (ruta != null) { if (ruta.Length == 1) { ruta = null; } else { PuntoRecorrido[] aux = new PuntoRecorrido[ruta.Length - 1]; for (int i = 0; i < aux.Length; i++) { aux[i] = ruta[i]; } ruta = new PuntoRecorrido[aux.Length]; for (int i = 0; i < ruta.Length; i++) { ruta[i] = aux[i]; } } } }
private void OnSceneGUI() { PoligonoRecorrido recorrido = target as PoligonoRecorrido; DetectarRuta detector = recorrido.GetComponent <DetectarRuta>(); recorrido.transform.position = (Vector2)recorrido.transform.position; Transform agarraderaTransform = recorrido.transform; Quaternion agarraderaDeRotacion = Tools.pivotRotation == PivotRotation.Local ? agarraderaTransform.rotation : Quaternion.identity; Vector2[] puntos = new Vector2[recorrido.numeroDePuntos]; if (recorrido.Puntos() == null || recorrido.numeroDePuntos != recorrido.Puntos().Length) { recorrido.CrearPuntos(recorrido.numeroDePuntos); } for (int i = 0; i < recorrido.numeroDePuntos; i++) { Undo.RecordObject(target, "Move Point"); EditorUtility.SetDirty(target); puntos[i] = recorrido.Puntos()[i]; } PuntoRecorrido[] puntosRecorrido = GameObject.FindObjectsOfType <PuntoRecorrido>(); PuntoRecorrido[] puntosAuxiliares = new PuntoRecorrido[puntosRecorrido.Length]; int j = 0; for (int i = 0; i < puntos.Length; i++) { Handles.color = Color.white; Handles.DrawLine(puntos[i], puntos[(i + 1) % puntos.Length]); Vector2 distancia = puntos[(i + 1) % puntos.Length] - puntos[i]; Handles.ArrowHandleCap(0, puntos[i], Quaternion.LookRotation(distancia), 3, EventType.Repaint); string aux = "<color=red>" + i + "</color>"; Handles.Label(puntos[i], aux, estilo); EditorGUI.BeginChangeCheck(); puntos[i] = Handles.FreeMoveHandle(i, puntos[i], agarraderaDeRotacion, 0.5f, Vector3.one * 0.1f, DibujarAgarraderaPunto); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(detector, "Move Point"); EditorUtility.SetDirty(detector); recorrido.Puntos()[i] = puntos[i]; } else { Undo.RecordObject(detector, "Move Point"); EditorUtility.SetDirty(detector); puntosAuxiliares[j] = AjustarseAPuntoRecorrido(puntos[i], puntosRecorrido); recorrido.Puntos()[i] = puntosAuxiliares[j].transform.position; j++; DibujarAgarraderaPunto(i, puntos[i], agarraderaDeRotacion, 0.5f, EventType.Repaint); } } PuntoRecorrido[] puntosFinales = new PuntoRecorrido[j]; for (int i = 0; i < j; i++) { puntosFinales[i] = puntosAuxiliares[i]; } detector.CrearPuntosRuta(puntosFinales); }
private void OnEnable() { todosLosPuntos = GameObject.FindObjectOfType <PuntoRecorrido>(); }
public void CrearPrimerosContactos() { conQueColisiona = LayerMask.GetMask("Obstaculos", "Recorrido"); //Desactiva su collider para que el rayo a proyectar no interfiera. unCuarto = GetComponent <Collider2D>().bounds.size.x / 8f; gameObject.GetComponent <Collider2D>().enabled = false; //Busca todos los puntos del mapa. PuntoRecorrido[] puntosMapa = GameObject.FindObjectsOfType <PuntoRecorrido>(); //Creamos un vector auxiliar que guardara los puntos en contacto PuntoRecorrido[] aux = new PuntoRecorrido[puntosMapa.Length]; int j = 0; PuntoRecorrido[] puntosTotales = GameObject.FindObjectsOfType <PuntoRecorrido>(); // cuatroPosiciones = new Vector2[4]; cuatroCardinales = new Vector2[4]; for (int i = 0; i < 4; i++) { cuatroPosiciones[i] = new Vector2(SucesionZeroUnoZeroMenosUno(i), SucesionZeroUnoZeroMenosUno(i + 1)) * unCuarto; cuatroCardinales[i] = cuatroPosiciones[i]; } //Comprobamos que el punto no este dentro de uno de los puntos de la red. for (int i = 0; i < puntosTotales.Length; i++) { if (puntosTotales[i].GetComponent <Collider2D>().bounds.Contains(transform.position) && puntosTotales[i] != this) { aux[j] = puntosTotales[i]; aux[j].GetComponent <Collider2D>().enabled = false; j++; puntosDentro++; } } for (int i = 0; i < j; i++) { Vector2 esaPosicion = aux[i].transform.position; if (esaPosicion.y - transform.position.y < 0f) { cuatroPosiciones[2] = Vector2.negativeInfinity; } else if (esaPosicion.x - transform.position.x < 0f) { cuatroPosiciones[3] = Vector2.negativeInfinity; } else if (esaPosicion.y - transform.position.y > 0f) { cuatroPosiciones[0] = Vector2.negativeInfinity; } else if (esaPosicion.x - transform.position.x > 0f) { cuatroPosiciones[1] = Vector2.negativeInfinity; } } PuntoRecorrido aux1; for (int i = 0; i < 4; i++) { if (!Vector2.Equals(cuatroPosiciones[i], Vector2.negativeInfinity)) { RaycastHit2D[] hit = new RaycastHit2D[2] { Physics2D.Raycast((Vector2)transform.position + cuatroCardinales[(i + 1) % 4], cuatroCardinales[i], Mathf.Infinity, conQueColisiona), Physics2D.Raycast((Vector2)transform.position + cuatroCardinales[(i + 3) % 4], cuatroCardinales[i], Mathf.Infinity, conQueColisiona) }; if (hit[0].collider != null && hit[1].collider != null && (aux[j] = hit[0].collider.gameObject.GetComponent <PuntoRecorrido>()) != null && (aux1 = hit[1].collider.gameObject.GetComponent <PuntoRecorrido>()) != null) { if (!(Mathf.Approximately(aux[j].transform.position.x - transform.position.x, 0f) || Mathf.Approximately(aux[j].transform.position.y - transform.position.y, 0f))) { aux[j] = aux1; } j++; } else { cuatroPosiciones[i] = Vector2.negativeInfinity; } } } //Actualizamos las posiciones conectadas posiblesPosicionesConectadas = new PuntoRecorrido[j]; for (int i = 0; i < j; i++) { posiblesPosicionesConectadas[i] = aux[i]; } //Volvemos a activar su collider. gameObject.GetComponent <Collider2D>().enabled = true; for (int i = 0; i < j; i++) { posiblesPosicionesConectadas[i].GetComponent <Collider2D>().enabled = true; } }
public float DistanciaHasta(PuntoRecorrido objetivo) { return(((Vector2)(transform.position - objetivo.transform.position)).sqrMagnitude); }