Как заставить вертолет эвакуировать игрока с уровня?
Разрабатывая игру City Massacre я хотел сделать ее максимально интересной, а еще чтобы она была в духе классических зомби-шутеров. А что может быть более интересным и классическим, как после убийств тонны зомби эпично улететь на вертолете?
Цель была крайне простая изначально: сделать так чтобы игрок подходил к зоне эвакуации, а там его бы ждал вертолет. Игрок бы в него садился и улетал с уровня.
Однако после более детальной проработки вопроса оказалось такое решение скучным в плане интереса - т.е. просто подбегаешь и улетаешь, нет драмы нет азарта.
Поразмыслив, решил усложнить логику работы зоны эвакуации:
- Входим в зону и вызываем вертолет
- Ждем его и сражаемся с зомби
- Побеждаем босса
- Прилетает вертолет
- Отстреливаясь от зомби вбегаем в него и улетаем
Сразу расскажу об одной хитрости: после пункта 1 никакой вертолет никуда не летит, т.к. время его прилета вполне себе точное, а вот сколько времени мы будем сражаться с врагами неизвестно. В итоге начинает лететь вертолет только после пункта 3.
Теперь, когда разобрались с логикой в общих чертах, приступим к реализации самого вертолета. Итак что мы знаем про вертолет?
- Он летает - значит должны крутиться винты
- Есть маршрут полета - должны быть точки через которые вертолет пролетает и место где он приземляется
- Вертолет очень заметная штука - должны быть столбы пыли и ветра в месте приземления
- У вертолета есть двери - значит они должны открываться
- У вертолета должен быть пилот
Начнем реализацию по пунктам:
1. В нашей модели вертолета винты должны быть отдельно от основной модельки, чтобы можно было их вращать. Если вдруг они приклеены к модели, то отделить их можно в такой программе как Blender.
На винты повесим скрипт, отвечающий за их вращение. Не будем вдаваться в детали и делать зависимость от скорости полета и нагрузки на двигатель. Сделаем чтобы винты вращались постоянно и с одной скоростью. Для большинства случаев этого достаточно
2. Маршрут полета представляет из себя массив обьектов типа Transform, которые мы создаем в редакторе Unity и расставляем как нам нужно на карте. Затем через [Serialize field] добавляем в наш скрипт. Таким же образом зададим вертолету скорость полета. При снижении эта скорость уменьшится в несколько раз. Предполагается, что весь маршрут вертолет летит с максимальной скоростью, а последние 3 точки проходит медленно, так как садится. В случае со взлетом делайте наоборот. Для обеспечения плавности движения используем фунцию Lerp. Переменная arrived будет отвечать за текущий статус полета, а onStartFlight пригодятся еще для его старта. currentPoint - текущее расположение вертолета.
3. Пыль - очень крутая и важная вещь для вертолета. Включаться она должна когда вертолет заходит на посадку, в нашем случае после подлета к последним 3м точкам машрута. Сама пыль - это ParticleSystem из стандартного Unity ParticleSystems Asset. Через [Serialize Field] добавляем префаб пыли в наш скрипт. Теперь при подлете создаем его экземпляр в точке приземления. Точку для создания эффекта пыли тоже зададим через обьект [Serialize Field]. Вызов скрипта произведем дополнив скрипт функции, приведенной выше.
4. Сделаем наш вертолет интереснее. Добавим ему открывающиеся двери. С ними все несложно, они открываются по рельсовой схеме. А значит есть координата открытого состояния и закрытого. Вращение можно не учитывать. Соответственно как и с винтами двери должны быть отдельны от основной модели корпуса. Или отделите их в Blender.
Теперь через [Serialize Field] добавим их в наш скрипт. Через переменные Vector3 (x,y,z) добавим координаты закрытия и открытия. Самый простой способ узнать координату - поставить дверь в нужное положение и посмотреть координаты x,y,z в редакторе Unity в разделе Transform у двери. Сам процесс открытия реализуем с помощью функции Lerp.
Звук открытия тоже важен. Добавим к двери компонент AudioSource. И к нему добавим звук открытия. Я использовал звук открытия раздвижной двери из бесплатных звуков в интернете. С помощью функции Play() проиграем звук в нужный момент
Теперь осталось только вызвать наш скрипт открытия в момент приземления вертолета. Для этого добавим вызов функции OnOpenDoors() в функцию Flight() в момент приземления.
5. Не забудьте посадить пилота за руль, для этого возьмите модельку, ее можно взять бесплатно на сайте mixamo.com. Затем выберите на этом же сайте позу сидя и экспортируйте ее в Unity. Затем после импорта поместите ее за штурвал вертолета
Надеюсь моя статья вам понравилась и будет полезна в создании вашей собственной игры!
Как сделан вертолет в моей игре можно посмотреть тут: