Unity ball lintasan 2d untuk pemula

Halo semuanya. Artikel ini akan dikhususkan untuk menulis prediksi lintasan bola di Unity. Versi Unity 2019.0.6f

Kami akan menggunakan LineRenderer untuk menggambar garis.

Pertama, siapkan LineRenderer:



Apa yang perlu diubah:

  1. Ketebalan garis
  2. Warna garis
  3. Bahan

Untuk menggambar LineRenderer dalam 2D, Anda perlu membuat materi dengan shader "Sprite / Default":



Buat skrip BallTrajectory dan tentukan bidang yang diperlukan.

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


Pada awalnya, kami menetapkan jumlah poin yang diperlukan untuk LineRenderer.

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

Di masa depan, kami akan menulis kode dalam fungsi Pembaruan.

Pertama, Anda perlu menentukan posisi mouse dalam bingkai saat ini di koordinat dunia, untuk ini kami akan menggunakan metode ScreenToWorldPoint dari kelas kamera.

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

Setelah itu, Anda perlu menemukan vektor normal yang datang dari pusat bola dan diarahkan ke posisi mouse.
Vector2 direction  =  mousePos  -  ( Vector2 ) transform . posisi ;
arah . Normalisasi ( ) ;

Selanjutnya, Anda perlu menentukan komponen vertikal dan horizontal dari kecepatan bola.

Buat kelas bola. Di dalamnya, kami menentukan kecepatannya, dan dengan menekan tombol mouse kanan akan meluncurkan bola ke arah posisi mouse pada kecepatan yang diberikan.

Naskah bola
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;
        }
    }
}


Penentuan kecepatan bola
var vx = ball.velocity * direction.x;
var vy = ball.velocity * direction.y;


Dan akhirnya, kita harus melalui semua poin LineRenderer kita dan menentukan posisi mereka sesuai dengan data yang diterima.

Posisi titik
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);
}


Kode lengkap dapat dilihat

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


Tangkapan layar



Terima kasih atas looneybits sprite .

All Articles