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.

¿Cómo puedo hacer que un elemento de la interfaz de usuario apunte hacia una posición que se encuentra en coordenadas mundiales en Unity?

Así que estoy tratando de hacer que una flecha apunte hacia una posición en mi escena, quiero rotar la flecha hacia esa posición. He intentado convertir la posición del mundo en una posición de pantalla y luego restar la posición de la flecha de eso y luego establecer la rotación, pero tengo problemas para convertir la rotación para que quede bien (o tal vez hice algo mal en otro lugar). El script está adjunto al objeto hacia el que quiero que apunte, aquí está mi código actual:

    Vector3 viewportPos = Camera.main.WorldToViewportPoint(transform.position);
    Vector2 worldObjScreenPos = new Vector2(
        (viewportPos.x * canvasRectTrans.sizeDelta.x) - (canvasRectTrans.sizeDelta.x * 0.5f),
        (viewportPos.y * canvasRectTrans.sizeDelta.y) - (canvasRectTrans.sizeDelta.y * 0.5f));

Vector3 rot = worldObjScreenPos - arrowRectTrans.anchoredPosition;
arrowRectTrans.rotation = Quaternion.Euler(rot);

Pero esto me da algunos resultados extraños donde la flecha comienza a girar como loca.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema puede estar relacionado con cómo estás calculando la rotación. En lugar de restar la posición de la flecha de la posición mundial convertida a posición en pantalla, intenta usar la función Mathf.Atan2() para calcular el ángulo entre las dos posiciones.

    Aquí tienes un ejemplo de cómo puedes modificar tu código para lograr esto:

    // Obtén el vector de dirección desde la posición de la flecha hasta la posición mundial a la que queremos apuntar
    Vector3 dir = (worldPos - arrowPos).normalized;
    
    // Usa trigonometría para obtener el ángulo entre los dos vectores
    float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
    
    // Establece la rotación de la flecha al ángulo calculado
    arrowRectTrans.rotation = Quaternion.Euler(new Vector3(0, 0, angle));
    

    Esto debería rotar la flecha para que apunte hacia la posición deseada sin problemas de giro. Asegúrate de reemplazar worldPos y arrowPos con las posiciones apropiadas en tu escena.

Comments are closed.