Приветствую начинающих разработчиков. В данной статье мы научимся производить выстрелы, направленные в позицию курсора мыши. Для этого разобъём нашу статью на 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);
}
}
Поздравляем, теперь пуля сразу при появлении на сцене, единоразово сделает поворот в сторону пули, а потом запустит её туда.
Тема была сложная, но надеюсь у меня получилось объяснить данную тему. Но если остались вопросы, пишите в комментариях.
Круто, админ, ты перенёс уже 12 гайдов, возможно ты очень кому-то помог
*11