May 26, 2019

Создание примитивного 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 шаг разработки! Поздравьте себя и друг друга!

Жду ваши вопросы и наработки в лс для публикации!