Разработка 2D игры на Unity (4.5/5) "Игровая логика (продолжение)"

Разработка 2D игры на Unity (4.5/5) "Игровая логика (продолжение)" Unity, Gamedev, 2D, Игры, Урок, Длиннопост, Текст, Гифка

Привет, пикабу! Да-да, в заголовке не ошибка. Это пост под номером четыре с половиной и является продолжением предыдущего поста. Прошу прощения, что пришлось делить посты.

И, как обычно. Внимание! Очень длиннопост!

Хронология постов:

1 - Знакомство с редактором.

2 - Подготовка сцены.

3 - Основы скриптинга в Unity.

4 - Игровая логика.

Ссылка на ассеты (гуглодиск). Там до сих пор всё, кроме скриптов.


В прошлом посте мы начали разрабатывать игровую логику, создав корутин Timer, задающий темп игры, а так же внесли некоторые правки в нашу сцену. Пришло время закончить написание логики и привести игру к окончательному виду. Приступим.

Разработка 2D игры на Unity (4.5/5) "Игровая логика (продолжение)" Unity, Gamedev, 2D, Игры, Урок, Длиннопост, Текст, Гифка

Снова перейдём к скрипту Game. Нам осталось совсем немного его дополнить.
Для начала - нужно создать функции запуска (StartGame, 173 строка) и остановки игры (StopGame, 202 строка). Тут не происходит ничего нового и пояснений потребуют всего три строки, поэтому я не буду описывать работу построчно, а обрисую всё в общих чертах. Итак:


Функция StartGame переключает флаг состояния игры в true и скрывает надпись, предлагающую нажать "Пробел", чтобы начать. После чего активируется спрайт первого положения волка и, соответственно, переменная playerPos, получает значение "1". Обнуляем счётчики, скрываем иконки разбитых яиц и запускаем корутин Timer.


Функция StopGame переключает флаг состояния игры в false и останавливает корутины. Далее, отключаем все объекты яиц в массивах, а так же скрываем со сцены игрока. После чего - выводим надпись "Нажмите...".  Далее ищем все созданные нами сущности и удаляем.


Что тут есть интересного? Во первых - функция StopAllCorutines, которая останавливает все корутины из этого скрипта. Во вторых - процесс удаления сущностей наших яиц. В принципе - ничего необычного. Мы создаём массив из всех объектов, имеющих тег "zero", а затем проходимся циклом и удаляем все объекты, кроме того, с которого делаем копии. В этом нам поможет приписка "(Clone)", любезно добавляемая юнити к каждому копируемому объекту.

Заметьте, если бы мы создавали объект из префаба, а не копировали его со сцены, мы могли бы избежать проверки имени перед удалением. Необходимость упомянуть процесс создания копии объекта со сцены, я уже озвучивал. А вы, если хотите, можете самостоятельно усовершенствовать код, копируя префаб и убрав проверку имени перед удалением.

Разработка 2D игры на Unity (4.5/5) "Игровая логика (продолжение)" Unity, Gamedev, 2D, Игры, Урок, Длиннопост, Текст, Гифка

На анимашке выше показано - как добавить тег к объекту. Он нам будет необходим.

Разработка 2D игры на Unity (4.5/5) "Игровая логика (продолжение)" Unity, Gamedev, 2D, Игры, Урок, Длиннопост, Текст, Гифка

Далее, давайте создадим ещё три простых функции:


Функция Step (150 строка) - будет только лишь воспроизводить звук "шага". Делается это вызовом функции Play у переменной, содержащей соответствующий звук.


Функция Count (151 строка). Каждый раз, при её вызове, будет добавлять по единичке к счётчику пойманных яиц (строка 153), передавать обновлённое значение на элемент интерфейса, выводящего счётчик, помещая в его поле text - текущее значение счётчика, конвертированное в строковой формат (строка 155) и воспроизводить звук "поймал".


Функция Crash (159 строка) будет вызываться каждый раз, когда игрок не поймает яйцо, добавляя к счётчику потерянных яиц единичку (строка 161) и воспроизводя звук "уронил". А далее, в зависимости от количества потерянных яиц, мы либо включаем отображение следующей иконки, либо останавливаем игру, выполняя функцию StopGame (165 - 169 стр).


Мои поздравления! Мы закончили с функцией Game! Давайте перейдём к написанию Egg.

Разработка 2D игры на Unity (4.5/5) "Игровая логика (продолжение)" Unity, Gamedev, 2D, Игры, Урок, Длиннопост, Текст, Гифка

Все типы переменных нам уже известны. Зачем они нужны - написано в комментариях.
В функции старт - уже известная нам функция, запускающая корутин. Тоже не интересно.

А вот в функции апдейт уже есть небольшая логическая часть. Единственное условие, проверяющее: если номер шага равен пяти (состояние свободно падающего яйца), и положение игрока соответствует числовому значению спавна данного яйца (19 строка)...

... то мы вызываем функцию Count из скрипта Game (строка 20), деактивируем текущее яйцо (оно пятое по счёту, но расположено в 4 ячейке т.к. заполняли мы их начиная с нуля) и после этого удаляем игровой объект, к которому прикреплён текущий скрипт (строка 25).

Разработка 2D игры на Unity (4.5/5) "Игровая логика (продолжение)" Unity, Gamedev, 2D, Игры, Урок, Длиннопост, Текст, Гифка

Теперь давайте создадим новый корутин. Назовём его Steps. Суть функции проста - включать последующее яйцо, каждый "шаг" и отключать предыдущее. Но мы знаем, что у первого яйца - нет предыдущего, а у последнего - следующего. Поэтому, создадим условие:


Если шаг равен нулю - активируем яйцо, соответствующее текущему шагу.


Если шаг равен 10 - удаляем игровой объект, к которому прикреплен текущий скрипт.


Иначе - включаем яйцо соответствующее текущему шагу, отключаем яйцо, соответствующее текущий шаг минус один (предыдущее) и далее делаем ещё одну проверку. Если шаг равен пяти - выполняем функцию Crash из скрипта Game. Иначе - выполняем Step оттуда же.


Но, не смотря на то, какой сейчас шаг - прибавляем к нашему счётчику шагов единицу, ожидаем... И перезапускаем корутин.

На этом создание скриптов закончено. Да, всё так просто =) Проверьте работоспособность и, если что-то не так (ну вдруг, я пишу посты по ночам и с большими перерывами между выпусками) - пишите в комментариях. Я отвечу, как исправить ошибки.


В следующем посте мы поговорим о сборке нашего проекта под платформу PC. А если вам будет интересно - я сделаю бонусный, шестой пост, о том, как сделать сборку под Android.

Если вам понравился пост - не забывайте ставить плюсы (это лучшая благодарность для автора), а так же подписывайтесь, чтобы не пропустить новые посты ;)

3
Автор поста оценил этот комментарий

Не пойму реакции других комментаторов, поставьте тег unity в игнор и все.

3
Автор поста оценил этот комментарий
Никак не могу понять : почему программисты от турбопаскаль до джаваскрипт постоянно делятся своим опытом? Откуда такая жажда обучить людей программированию?
раскрыть ветку
1
DELETED
Автор поста оценил этот комментарий
Отличный пост доя новичков! Как всегда плюс:) Насчет комментариев выше - юнити-специалистов на рынке в данный момент практически нет, а хороших юнити-специалистов и подавно, так что человек правильно делает, что заинтересовывает народ этой технологией.
1
Автор поста оценил этот комментарий

Вроде неплохо всё описано, после НГ попробую. а пока подписался)

раскрыть ветку
Автор поста оценил этот комментарий

Друг, вот объясни мне, человеку, который только в процессе изучения C#, почему именно на нём? Почему не С++, который, вроде, должен лучше подходить под написание такого рода программ? 

(Я не программист, а любитель)

раскрыть ветку