es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Raycast2D rotativo de ida y vuelta con objeto.

Hice un círculo y le adjunté una caja láser encima.

El láser disparará un raycast hacia su eje y superior (directamente hacia arriba). También agregué un line renderer para visualizarlo.

Quiero que el raycast rote 90 grados de ida y vuelta, como escaneando todo en la parte superior. Mi problema es que no está funcionando correctamente. Rota de un lado a otro, pero si cambio la posición en el eje x del objeto láser, el raycast rotará en un ángulo extraño.

Script para el objeto láser:

public LineRenderer lineRenderer;
public LayerMask layerMask;
public float laserSpeed;

Vector3 pointA;
Vector3 pointB;
Vector3 castPosition;
RaycastHit2D rayCast;

float time;

void Start()
{
    pointA = transform.eulerAngles + new Vector3(0f, 0f, 90f);

    pointB = transform.eulerAngles + new Vector3(0f, 0f, -90f);
}

void Update()
{
    time = Mathf.PingPong(Time.time * laserSpeed, 1);
    transform.eulerAngles = Vector3.Lerp(pointA, pointB, time);
    castPosition = new Vector3(transform.position.x, transform.position.y, transform.position.z);
    rayCast = Physics2D.Raycast(castPosition, transform.TransformDirection(Vector2.up), 10f, layerMask);

    lineRenderer.SetPosition(0, castPosition);
    lineRenderer.SetPosition(1, transform.TransformDirection(Vector2.up) * 10f);
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La solución propuesta es que la dirección del rayo siempre apunta hacia arriba (en el espacio mundial) en lugar de seguir la dirección de rotación del objeto láser. Para solucionar esto, se puede cambiar la dirección del rayo utilizando la rotación actual del objeto láser.

    Reemplaza esta línea:

    rayCast = Physics2D.Raycast(castPosition, transform.TransformDirection(Vector2.up), 10f, layerMask);
    

    con:

    Vector3 rayDirection = Quaternion.Euler(0f, 0f, transform.eulerAngles.z) * Vector3.up;
    rayCast = Physics2D.Raycast(castPosition, rayDirection, 10f, layerMask);
    

    Esto creará un vector de dirección de rayo basado en la rotación z actual del objeto láser y lo utilizará para el raycast. Ahora, la dirección del rayo seguirá la dirección de rotación del objeto láser.

    Nota: Puede ser necesario ajustar la longitud del line renderer para que coincida con la longitud del raycast, y también ajustar la máscara de capa para detectar solo los objetos que se desean analizar.

Comments are closed.