Найти тему
Skarlupka

Обзор на книжку "Разработка игры в Unity. С нуля и до реализации" Денисов Д. В.

Недавно я решил поучиться основам Unity и просматривая свою стенку в вк заметил пост в паблике Physics.Math.Code в котором давалась рекомендация этой книги "Разработка игры в Unity. С нуля и до реализации" Денисов Д. В.". Спустя некоторое время вспомнил про вкладочку с книгой и вооружившись пивной кружкой с чаем, занялся геймдевом, который мы заслужили.

В этой статье я расскажу примерно, как продвигался по главам книги, какие трудности были в разработке и покажу свои решения. К слову, на освоение этой книги мне понадобилось около 5-6 дней, между которыми были достаточно большие промежутки времени.

Мои результаты и исходный будут в конце статьи.

1. Сперва, расскажу о своих впечатлениях после изучения книжки.

Стоит отметить, что у меня уже был небольшой опыт в работе с unity и C шарп соответственно. Ничего особенного просто попытки новичка чему-нибудь научиться.

Сама реализация игры меня не очень впечатлила, более того казалась странной.

Скрин главного меню из книжки
Скрин главного меню из книжки

Расскажу кратко. У нас дракон, который рандомно летает и сбрасывает яйца. Наша цель ловить яйца и зарабатывать очки. Если яйцо не поймано, оно взрывается. Всего можно пропустить 3 яйца и при каждом промахе, область, который мы ловим, уменьшается. Я понимаю, что данная механика довольно распространена, но в этой реализации выглядит убого. Из-за этого изучение книжки довольно растянулось.

В книжке, всё достаточно хорошо структурировано, большое количество скринов с пояснениями, однако, я считаю, совсем новичку будет чутка трудновато. Одна из главных проблем, которая у меня была, это указания того, где должен находиться создаваемый объект. Например, написано создать новый пустой объект, ты его создаёшь и только позже видишь, что его надо было создать в другом объекте. Это немного раздражает.

В целом, мне было трудно заставить себя продвигаться по книжке. Точно из-за чего, сказать сложно. Я грешу на плохую реализацию механики. Однако, тем не менее, книга даёт базовые знания по реализации подобных проектов и проявив немного усердия у вас уже будет понимание и практика в геймдеве, который мы заслужили. "Откуда взялась эта фраза?"

2. Пройдёмся по главам книжки.

Первая глава посвящена простой установке программного обеспечения, базовым действиям с объектами и написания кода Hellow World с реакцией на кнопку.

Для новичков важная часть, а те кто уже знаком немного с Unity, лучше начинать со второй главы.

Вторая глава посвящена игровым объектам. Меня немного смутило, что мы просто не использовали уже готовый проект с Hellow World, а вместо этого создали новый. Зря потраченное время на инициализацию проекта, на моём древнем компе.

Импорт игровых персонажей, как по мне довольно важный раздел для новичков. До этого я не пользовался Asset Store и думаю новичкам это будет полезно и нужно. К слову, я старался использовать другие ассеты, найденные в сторе.

Ассеты которые я использовал
Ассеты которые я использовал

Под конец книги я понял, что лучше сразу переносить префабы, материалы и пр., из ассета путём вырезать - вставить. Так как удаление импортированных ассетов приведёт к некорректной работе объектов на сцене, поэтому мне пришлось немного повозиться. К тому же, лучше сразу создавать необходимые папки для материалов и пр., так как большое количество материалов в одной папке начинает раздражать постоянным поиском необходимого объекта.

Дракон
Дракон

Когда я делал щит по книге, я никак не мог понять, как сделать его прозрачным и вот при написании этой статьи до меня дошло:

-4

Я просто не поменял Альфа канал на материале щита. |-_-| Это настолько было очевидно, что я начинаю себя ненавидеть.

Во второй главе я немного поэкспериментировал с анимацией дракона. В итоге получилось примерно вот так:

Анимация дракона
Анимация дракона

Дракон спит, просыпается и рычит, начинает взлетать, летит вверх, и сам полёт наверху.

К яйцу же я добавил материал травы, чтобы он выглядел более подходящим для зелёного дракона.

Драконье яйцо
Драконье яйцо

Третья глава посвящена коду проекта. В этом разделе были некоторые проблемы. Давайте разберём их.

Первая проблема связана с движением дракона. У меня с начало должна проиграться анимация сна, анимация подготовки к полёту, анимация полёта вверх и только на анимации полёта дракон должен начать двигаться. Иначе дракон сразу будет двигаться стоя и при этом подниматься вверх.

Решение реализовано через события в анимации. К примеру, нам необходимо чтобы дракон начал двигаться вверх в процессе анимации взлёта. Для этого мы ищем нашу анимацию взлёта и выделяем:

Папка с анимациями
Папка с анимациями

Идём в окошко инспектора и открываем вкладочку анимация:

Инспектор анимации
Инспектор анимации

Далее прокручиваем вниз и видим вкладку Events(события), открываем его:

События анимации
События анимации

Кружком отмечена кнопка создания события, а подчёркнуто уже имеющиеся событие. Если мы нажмём на палочку, то увидим:

Событие upStart
Событие upStart

К слову полоска сверху - это тайм лайн, т.е., при передвижении полоски влево или вправо, вы можете выбрать наиболее подходящее время для начало события. Событие называется UpStart - начало подъёма и расположено на таймлайне так, чтобы дракон начинал взлёт в момент отрыва его ног от земли.

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

private bool upDragon = false;

Сама же функция upStart выглядит так:

private void upStart()
{
upDragon = true;
}

Теперь нам достаточно добавить условие в методе Update:

if (pos.y < 3 && upDragon)
{
pos.y += upSpeed * Time.deltaTime; //Изменение скорости относительно фпс
transform.position = pos;
if (upSpeed < 5) upSpeed++;
}

В этом условии дракон будет подниматься вверх до pos.y = 3 с увеличивающейся скоростью. Если же pos.y >= 3 в таком случае уже можно запускать выпадение яиц и анимацию полёта.

Вторая проблема заключалась в том, что анимация взрыва яйца не проигрывалась при касании с поверхностью. Эффект взрыва же я взял ассет сторе другой. Я долго думал и лазил в настройках. Даже уже сделал так, чтобы анимация создавалась в точке касания как новый объект, а потом удалялась, но решение оказалось проще чем я думал. Из-за того, что яйцо появлялось как бы внутри дракона, я не заметил, что анимации взрыва проигрывается сразу после появления яйца. Поэтому, решение оказалось таким:

void Start()
{
ps = GetComponent<ParticleSystem>();
ps.Stop();
}

В методе Start обращаемся к эффекту и останавливаем его. Далее же, при касании яйца поверхности, мы снова запускаем эффект взрыва:

private void OnTriggerEnter(Collider other)
{
ps.Play();
}

Возможно можно было это как-то решить по другому, но получилось так и другого способа я не искал.

Четвёртая глава посвящена созданию графического интерфейса игры.

Здесь была проблема связанная с версией Unity. В книге, для вывода текста используется объект GameObject – UI – Text, но в моём случае вместо него был GameObject – UI – TextMeshPro. Проблема была в том, что в коде обращение к данному объекту отличалось. Необходимо было подключить using TMPro; вместо using UnityEngine.UI; и соответственно инициализация отличалась: public TextMeshProUGUI scoreGT; вместо public Text scoreGT;. Данная проблема не большая, но как её решить сразу было не понятно, так как я привык к старой версии без TextMeshPro.

В остальном глава понятная и лёгкая.

Пятая глава посвящена сценам игры и меню игры.

Тут у меня случился срердечный сриступ, когда я изменил сцену так как надо было, но забыл сохранить её. В итоге, когда надо было переименовать сцену, все мои изменения пропали. ⊙_ರೃ Буууудте осторожны и предохраняйтесь! Потушив пердак, я всё же снова всё сделал.

Была также проблема в том, что в драконе была анимация, а в начальной сцене она была не нужна. Решилось это, созданием другого контроллера для дракона в начальной сцене. Остальные действия были не так уж сложны.

Шестая глава посвящена звука и музыкальному сопровождению игры.

Данная глава мне действительно понравилась, так как я никогда не игрался со звуком в unity. Все звуки я искал через поисковик, делать это через стор слишком хлопотно.

И так, здеся проблема была в том, что мне нужны были разные звуки в одном драконе и чтоб запускались в зависимости от анимации. Так как, дракон у меня кричит в начале и взлетает (звук крыльев). В книге же на один объект приходиться один звук, поэтому сейчас покажу как это решить.

Сперва выбираем дракона и добавляем ему Аудио Ресурс:

-11

Аудио клип добавлять не обязательно. Далее мы заходим в EnemyDragon и добавляем в поля:

public AudioClip[] Sounds;
public AudioSource audioSource;

Теперь когда мы это добавили, снова открываем инспектор дракона и видим изменения:

-12

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

Далее нам необходимо, чтобы звуки воспроизводились по анимации, поэтому будет снова использовать события в анимации (см. выше). В анимации крика дракона добавляем событие ScreamSound:

-13

Так же добавляем событие FlySound в анимацию взлёта. Теперь необходимо воспроизвести нужный звук в событии.

private void ScreamSound()
{
audioSource.clip = Sounds[0];
audioSource.Play();
}
private void FlySound()
{
audioSource.loop = true;
audioSource.clip = Sounds[1];
audioSource.Play();
}

Собственно у нас есть набор звуков в Sounds[], поэтому мы меняем в audioSource звук из набора и проигрываем его. Если нам надо зациклить звук, то просто меняем надстройку loop. Лучшего решения я не нашёл, а тут сразу понятно, что нельзя проигрывать другой звук пока не будет остановлен другой или они оба в итоге зациклятся, не уверен не проверял. Если есть другие способы, то пожалуйста напишите в комментах.

Седьмая глава посвящена публикации и подготовке проекта.

Структурирование файлов.... вот что мешало сразу всё делать в нужных папках? (͡๏̯͡๏)

И самое волнующие - это удаление импортированных ассетов. В начале я пытался методом исключения находить необходимые материалы, путём удаления и восстановления некоторых папок, но понял что это будет долго и только потом заметил, что можно зайти в некоторые объекты и в инспекторе искать подключенные материалы. К примеру:

-14

На скриншоте показана иерархия, инспектор объекта Enemy(дракон), чтобы открыть это, достаточно 2 раза нажать на Enemy. Выбрав из иерархии DragonSoulEater мы видим его инспектор и в некоторых полях используются различные текстуры, материалы и т.п. Например, если мы кликнем по используемому материалу GreenHP, то мы увидим, что снизу открылось его расположение и если оно в импортированных папках ассета, то стоит перенести их в проект. Стоит также проверить и другие объекты в иерархии Enemy. Таким способом удалось быстрее перенести всё необходимое.

Дальше, как всё сделали, выбираете платформу для публикации и собираете проект. Мне с начала было интересно, правильно ли я публикую игру на simmer.io, поэтому вот скрин как должны выглядеть файлы:

-15

3. Вывод и ссылки

И так, книжка оказалась вполне интересной. Лично я научился управляться событиями анимации и музыкой. Остальное для было не таким уж интересным.

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

Что же до таких, как я. То вам стоит просмотреть оглавление и если вы ещё, как я, чего-то не изучили, то можно пройтись с начала и до конца, но попытавшись добавлять что-то новое. Как пособие же, я эту книгу не рекомендую. Эта книга скорее для ознакомления с unity и жизненным циклом проекта.

Оригинальная работа по книжке:

Play Dragon Picker in your browser | SIMMER.io

Моя работа по книжке:

Play Ubugiy Dragon in your browser | SIMMER.io

Заходите на мой сайт, может найдёте для себя что-нибудь полезное:

https://skarlupka.ru/

Так же заходите на мой паблик в вк, где я выкладываю рисунки, анимации и др., мои творения:

https://vk.com/skarlupkareal

СПАСИБО, ЧТО ПРОЧИТАЛИ!