Создание примитивного 2D платформера. Часть 4
Сегодня речь зайдет о стрельбе в 2д-платформерах! Если вы читаете это, то скорее всего вы хотите создать свою олдскульную Контру, ну или нечто в духе CupHead. Я же угадал?
Открываем Юнити, создаем С# скрипт, называем fireControll, ну или как вам удобно.
Жмем пкм по персонажу в иерархии, далее create empty
Переименуем данный объект в gun.
При помощи трансформа задайте ему нужную позицию. Это то место, откуда будут вылетать пули.
Важно следить, чтобы эта точка не пересекалась с коллайдером персонажа, а не ты вы будете стрелять по себе.
Далее создаем еще один самостоятельный объект - Bullet - она же пуля. Добавляем ей компоненты sprite renderer, box collider или circle collider. В коллайдере ставим галку is trigger, в Спрайт рендерер перетягиваем заранее нарисованный спрайт снаряда. Добавляем rigidbody2d. В нем gravity scale ставим на 0, если не хотим, чтобы пули падали под воздействием гравитации.
Подгоняем размер пульки и коллайдера:
Теперь перетягиваем из иерархии нашу пульку в папку со скриптами
Мы создали т. н. префаб - шаблон, который можно множественно спамить на экране. Удаляем bullet из иерархии. У нас все сохранено в префабе.
открываем пустой скрипт firecontoll
Задаем следующие переменные
public float speed = 10; // скорость пули
public Rigidbody2D bullet; // префаб нашей пули
public Transform gunPoint; // точка рождения пули
public float fireRate = 1; // скорострельность
private float curTimeout; // Перерыв между выстрелами
void FixedUpdate() // мы помещаем стрельбу в фиксед апдейт, чтобы спавн пуль просчитывался быстрее, чем кадры и наш перс не собирал в движении свои же пули.
{
if(Input.GetMouseButton(0)) //стрельба на левую кнопку мыши
{
Fire();
}
else
{
curTimeout = 100; //установка перерыва между выстрелами
}
}
void Fire() //стрельба
{
curTimeout += Time.deltaTime; //эквивалентно curTimeout = curTimeout + Time.deltaTime;
if(curTimeout > fireRate) //если перерыв между стрельбой больше чем скорострельность,
{
curTimeout = 0; // ставим перерыв на 0
Rigidbody2D clone = Instantiate(bullet, gunPoint2.position, Quaternion.identity) as Rigidbody2D; //спавним пулю, вернее её клон
clone.velocity = transform.TransformDirection(gunPoint.right * speed); //задаем клону префаба скорость полёта вправо
clone.transform.right = gunPoint.right; //задаем точку спавна
}
}
Полученный скрипт крепим на персонажа, в окно gunpoint перетягиваем из иерархии объект gun, в поле буллет перетягиваем наш префаб пули
Создаем скрипт bullet2d и вставляем следующее
void Start()
{
Destroy(gameObject, 20); // уничтожить объект по истечению указанного времени (секунд), если пуля никуда не попала
}
void OnTriggerEnter2D(Collider2D coll) // заделка для системы попаданий во врагов
{
if(!coll.isTrigger) // чтобы пуля не реагировала на триггер
{
switch(coll.tag)
{
case "Enemy_1":
// что-то...
break;
case "Enemy_2":
// что-то еще...
break;
}
Destroy(gameObject); //уничтожить при столкновении
}
}
скрипт крепим к префабу bullet.
Вот так!
Поздравляю, наша штуковина еще и стреляет!
Мы завершили еще 1 шаг разработки! Поздравьте себя и друг друга!
Жду ваши вопросы и наработки в лс для публикации!