Небольшое задание на unity

Собственно нужно сделать простую игру.Есть мяч для гольфа и лунка. По нажатию кнопки над мячом от гольфа начинает прорисовываться траектория( точками, как в енгри бердс ), и как только кнопка отпускается то мяч начинает летет по этой траектории. Собственно вся проблема это отрисовать этот вектор, никогда раньше с ними не работал, так что буду рад любой помощи введите сюда описание изображения


Ответы (1 шт):

Автор решения: earthQuake

Во-первых, не вектор, а траектория. Вектор полета мяча будет разный в каждой точке полета.

Во-вторых:

Код ниже сэмулирует простую физику(без учета сопротивления воздуха и тд). Если ты используешь физику, то реальная траектория может немного отличаться от расчетной, но по идее не должна сильно отличаться.

public class Ball : MonoBehaviour
{
     [SerializeField] private float _speed = 20; // для примера

     private Vector3 throwDir = (Vector3.right + Vector3.up).normalized; // просто для теста, удар под 45 гр
     private Vector3 velocity;
     private static readonly Vector3 gravity = new Vector3(0, -9.8f, 0);
     private bool thrown = false;

     private void Update()
     {
         if (Input.GetKeyDown(KeyCode.Space))
         {
              velocity = _speed * throwDir;
              thrown = true;
         }

         if (!thrown)
         {
             return;
         }

         velocity += gravity * Time.deltaTime;  //△v = v0 + a△t
         transform.position += velocity * Time.deltaTime;
     }
 }

Это должно дать тебе идею о том, что делать дальше. В твоем случае, тебе надо рассчитать положение мячика в пространстве с заданным (тобой) шагом по времени. Скорость в заданное время, в этом случае, должна быть V = _speed * throwDir - 9.8 * time. Положение в мяча в пространстве будет просто: pos = initialPos + V * time , где V это та скорость , которую ты рассчитал выше.

С той формулой позиции выше рассчитываешь положение мячика с нужным шагом времени, ну и создаешь спрайт мячика в каждой рассчитанной точке. Эти спрайты лучше класть в пул, чтобы потом заново использовать.

Вот можешь этот код запустить, чтобы было понятнее, что будет происходить, просто жми по пробелу несколько раз:

public class Ball : MonoBehaviour
{
     [SerializeField] private float _speed = 20; // для примера

     private Vector3 throwDir = (Vector3.right + Vector3.up).normalized; // просто для теста, удар под 45 гр
     private Vector3 velocity;
     private static readonly Vector3 gravity = new Vector3(0, -9.8f, 0);
     private float time = 0;
     private Vector3 initialPos;

     private void Start()
     {
         initialPos = transform.position;
     }

     private void Update()
     {
         if (Input.GetKeyDown(KeyCode.Space))
         {
             velocity = _speed * throwDir;
             time += 0.1f; // шаг

             velocity += gravity * time; //△v = v0 + a△t
             transform.position = initialPos + velocity * time;
         }
     }
}

Если надо соединить эти спрайты линией, то уже потом можешь всякие LineRenderer`ы использовать.

Гифка, как работает . Мне было лень делать все полностью, но я думаю смысл дошел.

→ Ссылка