/LSH2018

Primary LanguageASP

Описание реализации игры «Тир»

Игра реализована в виде трех сцен: главное меню, сама игра и экран со счетом. Главная сцена состоит из карты, пушки, контролирующейся мышкой, интерфейса, показывающего текущий счет, оставшееся время и силу ветра, и пустого объекта God, отвечающего за генерацию мишеней, счет, итд. Остальные сцены состоят из статичных текстовых полей и кнопок, осуществляющих переход между ними. При старте игры генерируется определенное количество обычных целей и целей, которые при уничтожении дают +5 секунд.

Интересные детали реализации:

  • Передача счета из основной игры в сцену конца игры осуществляется через статический класс с переменными
  • Столкновения контролируются через теги и слои. Цели вынесены на отдельный слой, чтобы они не сталкивались друг с другом. Теги используются, чтобы при столкновении со целью, снаряд знал, увеличивать счет, или просто исчезать (например, в случае столкновения со стеной)
  • При попадании цель удаляется и на своем месте генерирует новый объект «мертвая цель», который представляет из себя просто анимацию. Для уничтожения после конца анимации пришлось залезть в сам аниматор и переопределить там OnStateExit, чтобы он уничтожал родительский объект. Беглый гуглинг показал, что это чаще решают удалением по таймеру равному длительности анимации, но я предпочитаю контролировать последовательность событий, когда таймер гарантирует только то, что оно произойдет «примерно в одно время»
  • Юзер интерфейс реализован в World space, чтобы лучше контролировать его положение относительно других элементов. Было очень много шаманства с параметрами, в процессе элементы улетали черт знает куда, становились мыльными или исчезали. Я вообще не знаю, как это рабоатет. А еще радиус кнопки пришлось делать в несколько раз больше зоны срабатывания, и я тоже не знаю, почему так. Кнопки, кстати, делались, из дефолтной кнопки, у которой отключалась картинка, и приаттачивался Text

Факапы:

  • Контроль частоты выстрелов при задержке нажатия делается через InvokeRepeating и CancelRepeating, что позволяет стрелять как угодно часто, нажимая несколько раз. Можно было бы выставлять отдельный кулдаун (например задать lastShotTime), что бы решило эту проблему
  • Тач скорее всего не работает. Не знаю, как проверить. Использую только нажатия мыши. Не было времени и сил разбираться
  • Выглядит ужасно. Даже не знаю, что с этим делать. Не умею делать красиво
  • Угол пушки не ограничен, что позволяет повернуть ее так, что снаряды будут сразу попадать в стену и исчезать. Это некрасиво, хорошо бы задать лимит на угол поворота