Trayectoria de la bola de la unidad 2d para principiantes

Hola a todos. Este art铆culo estar谩 dedicado a escribir predicciones de la trayectoria de la pelota en Unity. Versi贸n Unity 2019.0.6f

Usaremos LineRenderer para dibujar una l铆nea.

Primero, prepare LineRenderer:



lo que debe cambiarse:

  1. Grosor de la l铆nea
  2. Color de linea
  3. Material

Para dibujar LineRenderer en 2D, debe crear material con el sombreador "Sprite / Predeterminado":



Cree un script BallTrajectory y defina los campos necesarios.

Definici贸n de campo
public class TrajectoryRenderer : MonoBehaviour
{
      [SerializeField] LineRenderer lineRenderer; //  LineRenderer
      [SerializeField] int lineCount; // ,  ,     
      [SerializeField] float lineLenght; // 
      [SerializeField] Ball ball; //   
}


Al principio, establecemos el n煤mero requerido de puntos para LineRenderer.

  inicio privado vac铆o ( )
{
      lineRenderer . positionCount  =  lineCount ;
}

En el futuro, escribiremos c贸digo en la funci贸n Actualizar.

Primero debe determinar la posici贸n del mouse en el cuadro actual en coordenadas mundiales, para esto utilizaremos el m茅todo ScreenToWorldPoint de la clase de c谩mara.

Vector2 mousePos  =  C谩mara . principal . ScreenToWorldPoint ( Input . MousePosition ) ;

Despu茅s de eso, debes encontrar el vector normal que viene del centro de la pelota y se dirige a la posici贸n del mouse.
Vector2 direction  =  mousePos  -  ( Vector2 ) transform . posici贸n ;
direcci贸n . Normalizar ( ) ;

A continuaci贸n, debe determinar el componente vertical y horizontal de la velocidad de la pelota.

Crea una clase de pelota. En 茅l, determinamos su velocidad, y al presionar el bot贸n derecho del mouse lanzar谩 la pelota hacia la posici贸n del mouse a una velocidad determinada.

Gui贸n de pelota
public class Ball : MonoBehaviour
{
    Rigidbody2D rb;
    [SerializeField] float velocityScaler;
    public float velocity;
 
    Vector2 mousePos;
 
    private void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }
 
    private void Update()
    {
        mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        velocity = Vector2.Distance(transform.position, mousePos) * velocityScaler;
 
        if (Input.GetMouseButtonUp(0))
        {
            Vector2 direction = (mousePos - (Vector2)rb.transform.position);
            direction.Normalize();
            rb.velocity = direction * velocity;
        }
    }
}


Determinaci贸n de la velocidad de la bola
var vx = ball.velocity * direction.x;
var vy = ball.velocity * direction.y;


Y finalmente, debemos pasar por todos los puntos de nuestro LineRenderer y determinar su posici贸n de acuerdo con los datos recibidos.

Posicionamiento de puntos
for (int i = 0; i < lineCount; i++)
{
      float t = i * lineLenght;
      var nextPos = new Vector2(vx * t, vy * t - (-Physics2D.gravity.y * t*t) / 2);
      lineRenderer.SetPosition(i, (Vector2)transform.position + nextPos);
}


Se puede ver el c贸digo completo

aqu铆
public class BallTrajectory : MonoBehaviour
{
      [SerializeField] LineRenderer lineRenderer;
      [SerializeField] int lineCount;
      [SerializeField] float lineLenght;
      Ball ball;
 
      private void Start()
      {
            ball = GetComponent<BallController>();
            lineRenderer.positionCount = lineCount;
      }
 
      private void Update()
      {
            Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            Vector2 direction = mousePos - (Vector2)transform.position;
            direction.Normalize();
 
            var vx = ball.velocity * direction.x;
            var vy = ball.velocity * direction.y;
 
            for (int i = 0; i < lineCount; i++)
            {
                  float t = i * 0.1f;
                  var nextPos = new Vector2(vx * t, vy * t - (-Physics2D.gravity.y * t*t) / 2);
                  lineRenderer.SetPosition(i, (Vector2)transform.position + nextPos);
            }
      }
 
}


Capturas de pantalla



Gracias por los sprites looneybits .

All Articles