Trajetória de bola unitária 2d para iniciantes

Olá a todos. Este artigo será dedicado a escrever previsões da trajetória da bola no Unity. Versão Unity 2019.0.6f

Usaremos o LineRenderer para desenhar uma linha.

Primeiro, prepare o LineRenderer:



O que precisa ser alterado:

  1. Espessura da linha
  2. Cor da linha
  3. Material

Para desenhar o LineRenderer em 2D, é necessário criar material com o sombreador "Sprite / Default":



Crie um script BallTrajectory e defina os campos necessários.

Definição de campo
public class TrajectoryRenderer : MonoBehaviour
{
      [SerializeField] LineRenderer lineRenderer; //  LineRenderer
      [SerializeField] int lineCount; // ,  ,     
      [SerializeField] float lineLenght; // 
      [SerializeField] Ball ball; //   
}


No início, defina o número de pontos necessário para o LineRenderer.

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

No futuro, escreveremos código na função Atualizar.

Primeiro, você precisa determinar a posição do mouse no quadro atual em coordenadas mundiais; para isso, usaremos o método ScreenToWorldPoint da classe de câmera.

Vector2 mousePos  =  Câmera . principal . ScreenToWorldPoint ( Input . MousePosition ) ;

Depois disso, você precisa encontrar o vetor normal vindo do centro da bola e direcionado para a posição do mouse.
Direção Vector2  =  mousePos  -  transformação ( Vector2 ) . posição ;
direção . Normalize ( ) ;

Em seguida, você precisa determinar o componente vertical e horizontal da velocidade da bola.

Crie uma aula de bola. Nele, determinamos sua velocidade e, pressionando o botão direito do mouse, a bola será lançada em direção à posição do mouse em uma determinada velocidade.

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


Determinação da velocidade da bola
var vx = ball.velocity * direction.x;
var vy = ball.velocity * direction.y;


E, finalmente, precisamos analisar todos os pontos do nosso LineRenderer e determinar sua posição de acordo com os dados recebidos.

Posicionamento pontual
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);
}


O código completo pode ser visualizado

aqui
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



Obrigado pelos sprites looneybits .

All Articles