Разработка 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
Автор поста оценил этот комментарий
Никак не могу понять : почему программисты от турбопаскаль до джаваскрипт постоянно делятся своим опытом? Откуда такая жажда обучить людей программированию?
раскрыть ветку (13)
7
Автор поста оценил этот комментарий
Жажда обучать? Мы с вами, похоже, живем в разном мире. В моем - все, кто знает, как сделать что-то интересное - тихонечко это самое "интересное" толкают за бабло. Да, сейчас обучалок стало много больше, но стоящую информацию от этого найти только сложнее. Тут работает принцип "кто не умеет делать что-то достаточно хорошо - учит этому других" =)
раскрыть ветку (5)
4
Автор поста оценил этот комментарий

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

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

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

Могу подтвердить, что стоящих обучалок по юнити на русском языке практически нет. Но достойных, подробных обучалок на английском - полный ютюб.

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

Когда обдумываешь как рассказать другим - хорошо укладываешь у себя  в голове. Так что это приносит пользу тебе.

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

Короче говоря, хочешь хорошо изучить какую-то тему - начни обучать ей других.

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

Потому что у них нет опыта. Гайды для новичков написаны для всего на свете. Тысячи их. А новые плодятся только потому, что их авторы хотят потешить свою самооценку.

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

это тайный заговор \0/

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

ну интересно же.

к тому же каждый программист должен по хорошему языков 10 знать

раскрыть ветку (3)
DELETED
Автор поста оценил этот комментарий
Хороший программист должен быть специалистом в одном направлении, если изучать 10 языков, то глубоко их не изучишь...и будешь плохим программистом:)
раскрыть ветку (2)
Автор поста оценил этот комментарий

а разве языки сильно отличаюстя

освоить новый не очнь долго.

]конечно не на проф уровне.

раскрыть ветку (1)
DELETED
Автор поста оценил этот комментарий
Освоить синтаксис, но не сам язык...это разные вещи, так что лучше сконцентрироваться на чем-то одном)
Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку