void GenerarCirculosBox(BoxCollider2D coll) { if (!coll.enabled) { return; } if (coll.usedByComposite) { return; } CirculoVertice[] vertices = new CirculoVertice[4]; vertices[0] = (new CirculoVertice() { actualizador = ActualizadorTransPointConOffset, puntoReferencia = coll.size / 2f /*pos = coll.transform.TransformPoint(coll.offset.x + coll.size.x / 2f, coll.offset.y + coll.size.y / 2f, 0f)*/, radio = coll.edgeRadius, padre = coll }); vertices[1] = (new CirculoVertice() { actualizador = ActualizadorTransPointConOffset, puntoReferencia = new Vector2(-coll.size.x, coll.size.y) / 2f /*pos = coll.transform.TransformPoint(coll.offset.x - coll.size.x / 2f, coll.offset.y + coll.size.y / 2f, 0f)*/, radio = coll.edgeRadius, padre = coll }); vertices[2] = (new CirculoVertice() { actualizador = ActualizadorTransPointConOffset, puntoReferencia = new Vector2(coll.size.x, -coll.size.y) / 2f /*pos = coll.transform.TransformPoint(coll.offset.x + coll.size.x / 2f, coll.offset.y - coll.size.y / 2f, 0f)*/, radio = coll.edgeRadius, padre = coll }); vertices[3] = (new CirculoVertice() { actualizador = ActualizadorTransPointConOffset, puntoReferencia = -coll.size / 2f /*pos = coll.transform.TransformPoint(coll.offset.x - coll.size.x / 2f, coll.offset.y - coll.size.y / 2f, 0f)*/, radio = coll.edgeRadius, padre = coll }); colliders.Add(coll, vertices); }
void GenerarCirculosCircle(CircleCollider2D coll) { if (!coll.enabled) { return; } if (coll.usedByComposite) { return; } CirculoVertice[] vertices = new CirculoVertice[1]; vertices[0] = (new CirculoVertice() { actualizador = ActualizadorTransPointConOffset, puntoReferencia = Vector2.zero /*pos = coll.transform.TransformPoint(coll.offset)*/, radio = coll.transform.TransformVector(Vector3.right).magnitude *coll.radius, padre = coll }); colliders.Add(coll, vertices); }
void GenerarCirculosPolygon(PolygonCollider2D coll) { if (!coll.enabled) { return; } if (coll.usedByComposite) { return; } CirculoVertice[] vertices = new CirculoVertice[coll.GetTotalPointCount()]; int count = 0; foreach (var p in coll.points) { vertices[count++] = (new CirculoVertice() { actualizador = ActualizadorTransPointConOffset, puntoReferencia = p /*pos = coll.transform.TransformPoint(p + coll.offset)*/, radio = 0f, padre = coll }); } colliders.Add(coll, vertices); }
public void Actualizar(CirculoVertice referencia, Vector2 desde, ContactFilter2D filtro, float radio = 0f, float umbralAngulo = 180f, Vector2 referenciaAngulo = new Vector2()) { origen = desde; puntoDestino = referencia.Pos; colliderPadre = referencia.padre; puntoDestinoRelativo = puntoDestino - origen; distancia = puntoDestinoRelativo.magnitude; distanciaSq = distancia * distancia; anguloRelativo = angulo = Mathf.Atan2(-puntoDestinoRelativo.y, puntoDestinoRelativo.x); rayo = new Ray2D(origen, puntoDestinoRelativo.normalized); if (referencia.radio > 0f) { float r2 = referencia.radio * referencia.radio; float h = Mathf.Sqrt(distanciaSq - r2) * referencia.radio / distancia; float d_ = Mathf.Sqrt(r2 - h * h); Vector2 offsetPerp = Vector2.Perpendicular(puntoDestinoRelativo).normalized *h; Vector2 offsetParal = (puntoDestinoRelativo).normalized * d_; horizonteAlfa = new VectorDeLuz(this, -offsetPerp, -offsetParal, umbralAngulo, referenciaAngulo); horizonteBeta = new VectorDeLuz(this, offsetPerp, -offsetParal, umbralAngulo, referenciaAngulo); horizonteAlfa.CalcularRayo(filtro, radio); horizonteBeta.CalcularRayo(filtro, radio); } if (umbralAngulo < 180f) { anguloRelativo = Vector2.SignedAngle(puntoDestinoRelativo, referenciaAngulo); enRangoAngular = anguloRelativo <umbralAngulo && anguloRelativo> -umbralAngulo; anguloRelativo *= Mathf.Deg2Rad; } else { enRangoAngular = true; } CalcularRayo(filtro, radio); }
public VectorDeLuz(CirculoVertice referencia, Vector2 desde, ContactFilter2D filtro, float radio = 0f, float umbralAngulo = 180f, Vector2 referenciaAngulo = new Vector2()) { Actualizar(referencia, desde, filtro, radio, umbralAngulo, referenciaAngulo); }