Разработка 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.

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

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

То есть вы абсолютно уверены, что ваша информация стоящая, а не просто очередной (стотысячный) интродакшн для тех, кто ничего не знает.

раскрыть ветку (1)
4
Автор поста оценил этот комментарий
Что вы, абсолютно нет. Я способен трезво оценить ситуацию и прекрасно вижу, что я один из сотен (думаю в рунете счет на тысячи еще не перешел) постящих элементарщину, коей уже достаточно. Но если копнуть глубже, заглянув в историю моих постов, вы увидите, что пишу я это аж по двум причинам:
1 я снимал видео-уроки по этой теме.
2 мои подписчики посчитали эту тему для себя интересной.

Но знаете, с тех пор на меня подписалось уже более сотни человек, от чего мне все таки хочется верить, что я не очередной говнопрограммист с завышенной самооценкой и тема действительно интересна.
3
Автор поста оценил этот комментарий
Никак не могу понять : почему программисты от турбопаскаль до джаваскрипт постоянно делятся своим опытом? Откуда такая жажда обучить людей программированию?
раскрыть ветку (1)
7
Автор поста оценил этот комментарий
Жажда обучать? Мы с вами, похоже, живем в разном мире. В моем - все, кто знает, как сделать что-то интересное - тихонечко это самое "интересное" толкают за бабло. Да, сейчас обучалок стало много больше, но стоящую информацию от этого найти только сложнее. Тут работает принцип "кто не умеет делать что-то достаточно хорошо - учит этому других" =)
показать ответы
3
Автор поста оценил этот комментарий
Просто на пикабу всплывала куча прогеров на разных языках со светлыми планами по обучению населения. И, как правило, все они к 4-5 посту затухали.
раскрыть ветку (1)
2
Автор поста оценил этот комментарий
Обещаю, эту серию я закончу. Но я фрилансер, а это говорит о том, что мой день не нормирован. Было бы проще с занятостью - серию уже бы закончил. Но делаю все, что в моих силах. Обратите внимание на время публикации. А я по Московскому времени живу =)
Автор поста оценил этот комментарий

Да блин, сделай курс. Куплю. Мелкий задрал уже :D Я строитель проектировщик, а не прогер) Мне это не интересно, хоть и считаю, что это знатное занятие) Я не могу ему помочь (напомню, ему 10). А тут твои статьи, так здорово) 

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

Я из тех людей, кто считает, что информация должна распространятся свободно =) Поэтому... Я буду продолжать писать.

Сейчас я снимаю серию видео-уроков по 3D игре. Как закончу - буду писать посты и дублировать видео-уроком. Бесплатно, доступно... Разве, что придётся немного подождать.

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

А ты знаешь только шарп?

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

Нет, не только. 

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

Автор, продолжай в том же духе. Мой мл. брат (10 лет) с радостью читает и пробует прогать. Получается. :)


Большой плюсик тебе! 

раскрыть ветку (1)
Автор поста оценил этот комментарий
Отлично! Спасибо за комментарий. Значит доходчиво объясняю =)
показать ответы
Автор поста оценил этот комментарий

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

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

раскрыть ветку (1)
Автор поста оценил этот комментарий
Да, ты прав, игры пишутся на плюсах. Сам движок юнити, если не ошибаюсь, тоже написан на С++. Но для написания исходников к игре (скриптов), юнити поддерживает два языка. С# и JS.
показать ответы
Автор поста оценил этот комментарий

Это C++?

раскрыть ветку (1)
Автор поста оценил этот комментарий
Это С#
показать ответы
Автор поста оценил этот комментарий

Сохранил себе, прочитаю как-то. Но вот что бросилось в глаза: Смысл открывать полновесную Visual Studio, когда есть Mono Develop?

раскрыть ветку (1)
Автор поста оценил этот комментарий
Я, первое время, работал в моно. В Visual Studio, лично мне, работать приятнее. На вкус и цвет, как говорится.
1
Автор поста оценил этот комментарий

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

раскрыть ветку (1)
Автор поста оценил этот комментарий
Спасибо!