Разработка 2D игры на Unity (4.5/5) "Игровая логика (продолжение)"
Привет, пикабу! Да-да, в заголовке не ошибка. Это пост под номером четыре с половиной и является продолжением предыдущего поста. Прошу прощения, что пришлось делить посты.
И, как обычно. Внимание! Очень длиннопост!
Хронология постов:
2 - Подготовка сцены.
3 - Основы скриптинга в Unity.
4 - Игровая логика.
Ссылка на ассеты (гуглодиск). Там до сих пор всё, кроме скриптов.
В прошлом посте мы начали разрабатывать игровую логику, создав корутин Timer, задающий темп игры, а так же внесли некоторые правки в нашу сцену. Пришло время закончить написание логики и привести игру к окончательному виду. Приступим.
Снова перейдём к скрипту Game. Нам осталось совсем немного его дополнить.
Для начала - нужно создать функции запуска (StartGame, 173 строка) и остановки игры (StopGame, 202 строка). Тут не происходит ничего нового и пояснений потребуют всего три строки, поэтому я не буду описывать работу построчно, а обрисую всё в общих чертах. Итак:
Функция StartGame переключает флаг состояния игры в true и скрывает надпись, предлагающую нажать "Пробел", чтобы начать. После чего активируется спрайт первого положения волка и, соответственно, переменная playerPos, получает значение "1". Обнуляем счётчики, скрываем иконки разбитых яиц и запускаем корутин Timer.
Функция StopGame переключает флаг состояния игры в false и останавливает корутины. Далее, отключаем все объекты яиц в массивах, а так же скрываем со сцены игрока. После чего - выводим надпись "Нажмите...". Далее ищем все созданные нами сущности и удаляем.
Что тут есть интересного? Во первых - функция StopAllCorutines, которая останавливает все корутины из этого скрипта. Во вторых - процесс удаления сущностей наших яиц. В принципе - ничего необычного. Мы создаём массив из всех объектов, имеющих тег "zero", а затем проходимся циклом и удаляем все объекты, кроме того, с которого делаем копии. В этом нам поможет приписка "(Clone)", любезно добавляемая юнити к каждому копируемому объекту.
Заметьте, если бы мы создавали объект из префаба, а не копировали его со сцены, мы могли бы избежать проверки имени перед удалением. Необходимость упомянуть процесс создания копии объекта со сцены, я уже озвучивал. А вы, если хотите, можете самостоятельно усовершенствовать код, копируя префаб и убрав проверку имени перед удалением.
На анимашке выше показано - как добавить тег к объекту. Он нам будет необходим.
Далее, давайте создадим ещё три простых функции:
Функция Step (150 строка) - будет только лишь воспроизводить звук "шага". Делается это вызовом функции Play у переменной, содержащей соответствующий звук.
Функция Count (151 строка). Каждый раз, при её вызове, будет добавлять по единичке к счётчику пойманных яиц (строка 153), передавать обновлённое значение на элемент интерфейса, выводящего счётчик, помещая в его поле text - текущее значение счётчика, конвертированное в строковой формат (строка 155) и воспроизводить звук "поймал".
Функция Crash (159 строка) будет вызываться каждый раз, когда игрок не поймает яйцо, добавляя к счётчику потерянных яиц единичку (строка 161) и воспроизводя звук "уронил". А далее, в зависимости от количества потерянных яиц, мы либо включаем отображение следующей иконки, либо останавливаем игру, выполняя функцию StopGame (165 - 169 стр).
Мои поздравления! Мы закончили с функцией Game! Давайте перейдём к написанию Egg.
Все типы переменных нам уже известны. Зачем они нужны - написано в комментариях.
В функции старт - уже известная нам функция, запускающая корутин. Тоже не интересно.
А вот в функции апдейт уже есть небольшая логическая часть. Единственное условие, проверяющее: если номер шага равен пяти (состояние свободно падающего яйца), и положение игрока соответствует числовому значению спавна данного яйца (19 строка)...
... то мы вызываем функцию Count из скрипта Game (строка 20), деактивируем текущее яйцо (оно пятое по счёту, но расположено в 4 ячейке т.к. заполняли мы их начиная с нуля) и после этого удаляем игровой объект, к которому прикреплён текущий скрипт (строка 25).
Теперь давайте создадим новый корутин. Назовём его Steps. Суть функции проста - включать последующее яйцо, каждый "шаг" и отключать предыдущее. Но мы знаем, что у первого яйца - нет предыдущего, а у последнего - следующего. Поэтому, создадим условие:
Если шаг равен нулю - активируем яйцо, соответствующее текущему шагу.
Если шаг равен 10 - удаляем игровой объект, к которому прикреплен текущий скрипт.
Иначе - включаем яйцо соответствующее текущему шагу, отключаем яйцо, соответствующее текущий шаг минус один (предыдущее) и далее делаем ещё одну проверку. Если шаг равен пяти - выполняем функцию Crash из скрипта Game. Иначе - выполняем Step оттуда же.
Но, не смотря на то, какой сейчас шаг - прибавляем к нашему счётчику шагов единицу, ожидаем... И перезапускаем корутин.
На этом создание скриптов закончено. Да, всё так просто =) Проверьте работоспособность и, если что-то не так (ну вдруг, я пишу посты по ночам и с большими перерывами между выпусками) - пишите в комментариях. Я отвечу, как исправить ошибки.
В следующем посте мы поговорим о сборке нашего проекта под платформу PC. А если вам будет интересно - я сделаю бонусный, шестой пост, о том, как сделать сборку под Android.
Если вам понравился пост - не забывайте ставить плюсы (это лучшая благодарность для автора), а так же подписывайтесь, чтобы не пропустить новые посты ;)
Не пойму реакции других комментаторов, поставьте тег unity в игнор и все.
Вроде неплохо всё описано, после НГ попробую. а пока подписался)
Друг, вот объясни мне, человеку, который только в процессе изучения C#, почему именно на нём? Почему не С++, который, вроде, должен лучше подходить под написание такого рода программ?
(Я не программист, а любитель)