Unity Ball Trajektorie 2d für Anfänger

Hallo alle zusammen. Dieser Artikel widmet sich dem Schreiben von Vorhersagen der Ballbahn in Unity. Unity Version 2019.0.6f

Wir werden LineRenderer verwenden, um eine Linie zu zeichnen.

Bereiten Sie zunächst LineRenderer vor:



Was muss geändert werden:

  1. Dicke der Linie
  2. Linienfarbe
  3. Material

Um LineRenderer in 2D zu zeichnen, müssen Sie Material mit dem Shader "Sprite / Default"



erstellen : Erstellen Sie ein BallTrajectory-Skript und definieren Sie die erforderlichen Felder.

Felddefinition
public class TrajectoryRenderer : MonoBehaviour
{
      [SerializeField] LineRenderer lineRenderer; //  LineRenderer
      [SerializeField] int lineCount; // ,  ,     
      [SerializeField] float lineLenght; // 
      [SerializeField] Ball ball; //   
}


Zu Beginn legen wir die erforderliche Anzahl von Punkten für LineRenderer fest.

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

In Zukunft werden wir Code in die Update-Funktion schreiben.

Zuerst müssen Sie die Mausposition im aktuellen Bild in Weltkoordinaten bestimmen. Dazu verwenden wir die ScreenToWorldPoint-Methode der Kameraklasse.

Vector2 mousePos  =  Kamera . Haupt . ScreenToWorldPoint ( Input . MousePosition ) ;

Danach müssen Sie den normalen Vektor finden, der von der Mitte des Balls kommt und auf die Position der Maus gerichtet ist.
Vector2-Richtung  =  mousePos  -  ( Vector2 ) -Transformation . Position ;
Richtung . Normalize ( ) ;

Als nächstes müssen Sie die vertikale und horizontale Komponente der Geschwindigkeit des Balls bestimmen.

Erstellen Sie eine Ballklasse. Darin bestimmen wir seine Geschwindigkeit und durch Drücken der rechten Maustaste wird der Ball mit einer bestimmten Geschwindigkeit in Richtung Mausposition gestartet.

Ballskript
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;
        }
    }
}


Bestimmung der Ballgeschwindigkeit
var vx = ball.velocity * direction.x;
var vy = ball.velocity * direction.y;


Und schließlich müssen wir alle Punkte unseres LineRenderer durchgehen und ihre Position gemäß den empfangenen Daten bestimmen.

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


Der vollständige Code kann angezeigt werden

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


Screenshots



Vielen Dank für die Sprites Looneybits .

All Articles