Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Все Гайды Мой Кабинет

2д стрельба в сторону курсора мыши на Unity

Приветствую начинающих разработчиков. В данной статье мы научимся производить выстрелы, направленные в позицию курсора мыши. Для этого разобъём нашу статью на 2 части:

  • В первой части данной статьи мы будем рассматривать простую реализацию стрельбу
  • А во второй части, на основе простой стрельбы, мы сделаем так, чтобы стрельба происходило в направлении курсора мыши.

Так же хочется обратить Ваше внимание, что в одной из предыдущих статей мы рассматривали, как сделать простую реализацию стрельбы. Поэтому, чтобы не повторяться, первую часть данной статьи мы рассмотрим кратко, и в упрощённой форме.

Простая реализация стрельбы

Первым делом создадим префаб пули. Обязательно добавьте к нему компонент Rigidbody2d. А в поле Body Type данного компонента, укажите значение Kinematic - чтобы на пулю не дейстовала гравитация.

Теперь создаём для префаба нашей пули новый компонет(скрипт C#), и назовём его, например, Bullet. Данный скрипт должен производить полёт пули в указанное направление и с определённой скоростью, а так же уничтожать сам себя по истечении определённого времени, чтобы пуля не летела бесконечно долго.

Пропишем всё это в нашем скрипте:

using UnityEngine;

public class Bullet : MonoBehaviour
{
    public float timeDestroy = 3f;
    public float speed = 3f;
    public Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        rb.velocity = transform.up * speed;
        Invoke("DestroyBullet", timeDestroy);
    }

    void DestroyBullet()
    {
        Destroy(this.gameObject);
    }
}

Давайте разберём данный код:

  • В строках #5-7 мы объявили три переменные: timeDestroy - для самоуничтожения пули; speed - для указании скорости пули; rb - которая будет хранить ссылку на компонент Rigidbody2D.
  • В строках #11-13 мы сначала получили ссылку на компонент Rigidbody2D. Потом указали движение нашей пули вверх. А так же указали, что через 3 секунды запустится метод DestroyBullet, который уничтожит наш объект пули.

Наша пуля готова. Как только она появится в игровой сцене, она автоматически будет лететь вверх, и через 3 секунды пропадёт.

Теперь нам нужно сделать саму стрельбу персонажа, чтобы по клике мыши он создавал эту пулю. Для этого создадим скрипт C# для нашего персонажа. Скрипт назовём Player, и впишем в данный скрипт следующее содержимое:

using UnityEngine;

public class Player : MonoBehaviour
{
    public GameObject bullet;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            Instantiate(bullet, transform.position, Quaternion.identity);
        }
    }
}

В строке #5 мы объявили переменную bullet, в которой будет хранится ссылка на наш префаб пули. Поэтому обязательно перетащите префаб пули в поле bullet в Инспекторе.

А в строке #11 с помощью метода Instantiate() мы создаём пулю на игровой сцене, из вашего префаба пули. И она сразу же будет осуществлять полёт вверх.

Стрельба в направление курсора мыши

Мы добрались до самого интересного. Для того, чтобы стрельба осуществлялась в направлении курсора мыши, первым делом нам необходимо определить, в какой же позиции игрового пространства располагается наша мышь, чтобы при появлении нашей пули, она летела не вверх, а в направлении курсора мыши. Поэтому и весь следующий код мы должны прописывать в скрипте Bullet, который находится на префабе нашей пули.

Пропишем следующую строчку:

Vector3 diference = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;

Если вкратце, то она находит векторные координаты курсора относительно объекта пули. А если более подробней, то рекоммендуем посетить нашу статью по определении позиции курсора мыши.

Далее нам нужно развернуть нашу пулю в сторону позиции курсора мыши, для это пропишем следующее:

float rotateZ = Mathf.Atan2(diference.y, diference.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0f, 0f, rotateZ);

Используя данные в переменной diference, с помощью метода Mathf.Atan2 мы получает угол в радианах. А потом с помощью константы Mathf.Rad2Deg, мы преобразовываем преобразовывает радиан в градусы.

Затем с помощью метода Quaternion.Euler мы получаем значение поворота, и присваиваем это значение нашему персонажу.

Готово! Теперь склеим всё что мы написали с кодом из персой части скрипта Bullet префаба пули. Весь код выглядит так:

using UnityEngine;

public class Bullet : MonoBehaviour
{
    public float timeDestroy = 3f;
    public float speed = 3f;
    public Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();

        Vector3 diference = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
        float rotateZ = Mathf.Atan2(diference.y, diference.x) * Mathf.Rad2Deg;
        transform.rotation = Quaternion.Euler(0f, 0f, rotateZ);

        rb.velocity = transform.up * speed;
        Invoke("DestroyBullet", timeDestroy);
    }

    void DestroyBullet()
    {
        Destroy(this.gameObject);
    }
}

Поздравляем, теперь пуля сразу при появлении на сцене, единоразово сделает поворот в сторону пули, а потом запустит её туда.

Тема была сложная, но надеюсь у меня получилось объяснить данную тему. Но если остались вопросы, пишите в комментариях.

Вы можете отблагодарить автора донатом. ₽ Спасибо

Комментарии

1
FiveDragon 2 года назад

Круто, админ, ты перенёс уже 12 гайдов, возможно ты очень кому-то помог
*11




Гости не могут оставлять комментарии. Войдите на Сайт или Зарегистрируйтесь