Trajectoire Unity Ball 2D pour les débutants

Bonjour à tous. Cet article sera consacré à la rédaction de prédictions de la trajectoire de la balle dans Unity. Version Unity 2019.0.6f

Nous utiliserons LineRenderer pour tracer une ligne.

Tout d'abord, préparez LineRenderer:



ce qui doit être changé:

  1. Épaisseur de ligne
  2. Couleur de la ligne
  3. Matériel

Pour dessiner LineRenderer en 2D, vous devez créer du matériau avec le shader "Sprite / Default":



créez un script BallTrajectory et définissez les champs nécessaires.

Définition du champ
public class TrajectoryRenderer : MonoBehaviour
{
      [SerializeField] LineRenderer lineRenderer; //  LineRenderer
      [SerializeField] int lineCount; // ,  ,     
      [SerializeField] float lineLenght; // 
      [SerializeField] Ball ball; //   
}


Au début, nous avons défini le nombre de points requis pour LineRenderer.

private  void  Start ( )
{
      lineRenderer . positionCount  =  lineCount ;
}

À l'avenir, nous écrirons du code dans la fonction de mise à jour.

Vous devez d'abord déterminer la position de la souris dans le cadre actuel en coordonnées universelles, pour cela, nous utiliserons la méthode ScreenToWorldPoint de la classe de caméra.

Vector2 mousePos  =  Caméra . principal . ScreenToWorldPoint ( Input . MousePosition ) ;

Après cela, vous devez trouver le vecteur normal venant du centre de la balle et dirigé vers la position de la souris.
Vector2 direction  =  mousePos  -  ( Vector2 ) transform . position ;
direction . Normaliser ( ) ;

Ensuite, vous devez déterminer la composante verticale et horizontale de la vitesse de la balle.

Créez une classe de balle. Dans celui-ci, nous déterminons sa vitesse, et en appuyant sur le bouton droit de la souris lancera la balle vers la position de la souris à une vitesse donnée.

Script de balle
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;
        }
    }
}


Détermination de la vitesse de balle
var vx = ball.velocity * direction.x;
var vy = ball.velocity * direction.y;


Et enfin, nous devons parcourir tous les points de notre LineRenderer et déterminer leur position en fonction des données reçues.

Positionnement des points
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);
}


Le code complet peut être consulté

ici
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);
            }
      }
 
}


Captures d'écran



Merci pour les sprites looneybits .

All Articles