Недавно я решил поучиться основам Unity и просматривая свою стенку в вк заметил пост в паблике Physics.Math.Code в котором давалась рекомендация этой книги "Разработка игры в Unity. С нуля и до реализации" Денисов Д. В.". Спустя некоторое время вспомнил про вкладочку с книгой и вооружившись пивной кружкой с чаем, занялся геймдевом, который мы заслужили.
В этой статье я расскажу примерно, как продвигался по главам книги, какие трудности были в разработке и покажу свои решения. К слову, на освоение этой книги мне понадобилось около 5-6 дней, между которыми были достаточно большие промежутки времени.
Мои результаты и исходный будут в конце статьи.
1. Сперва, расскажу о своих впечатлениях после изучения книжки.
Стоит отметить, что у меня уже был небольшой опыт в работе с unity и C шарп соответственно. Ничего особенного просто попытки новичка чему-нибудь научиться.
Сама реализация игры меня не очень впечатлила, более того казалась странной.
Расскажу кратко. У нас дракон, который рандомно летает и сбрасывает яйца. Наша цель ловить яйца и зарабатывать очки. Если яйцо не поймано, оно взрывается. Всего можно пропустить 3 яйца и при каждом промахе, область, который мы ловим, уменьшается. Я понимаю, что данная механика довольно распространена, но в этой реализации выглядит убого. Из-за этого изучение книжки довольно растянулось.
В книжке, всё достаточно хорошо структурировано, большое количество скринов с пояснениями, однако, я считаю, совсем новичку будет чутка трудновато. Одна из главных проблем, которая у меня была, это указания того, где должен находиться создаваемый объект. Например, написано создать новый пустой объект, ты его создаёшь и только позже видишь, что его надо было создать в другом объекте. Это немного раздражает.
В целом, мне было трудно заставить себя продвигаться по книжке. Точно из-за чего, сказать сложно. Я грешу на плохую реализацию механики. Однако, тем не менее, книга даёт базовые знания по реализации подобных проектов и проявив немного усердия у вас уже будет понимание и практика в геймдеве, который мы заслужили. "Откуда взялась эта фраза?"
2. Пройдёмся по главам книжки.
Первая глава посвящена простой установке программного обеспечения, базовым действиям с объектами и написания кода Hellow World с реакцией на кнопку.
Для новичков важная часть, а те кто уже знаком немного с Unity, лучше начинать со второй главы.
Вторая глава посвящена игровым объектам. Меня немного смутило, что мы просто не использовали уже готовый проект с Hellow World, а вместо этого создали новый. Зря потраченное время на инициализацию проекта, на моём древнем компе.
Импорт игровых персонажей, как по мне довольно важный раздел для новичков. До этого я не пользовался Asset Store и думаю новичкам это будет полезно и нужно. К слову, я старался использовать другие ассеты, найденные в сторе.
Под конец книги я понял, что лучше сразу переносить префабы, материалы и пр., из ассета путём вырезать - вставить. Так как удаление импортированных ассетов приведёт к некорректной работе объектов на сцене, поэтому мне пришлось немного повозиться. К тому же, лучше сразу создавать необходимые папки для материалов и пр., так как большое количество материалов в одной папке начинает раздражать постоянным поиском необходимого объекта.
Когда я делал щит по книге, я никак не мог понять, как сделать его прозрачным и вот при написании этой статьи до меня дошло:
Я просто не поменял Альфа канал на материале щита. |-_-| Это настолько было очевидно, что я начинаю себя ненавидеть.
Во второй главе я немного поэкспериментировал с анимацией дракона. В итоге получилось примерно вот так:
Дракон спит, просыпается и рычит, начинает взлетать, летит вверх, и сам полёт наверху.
К яйцу же я добавил материал травы, чтобы он выглядел более подходящим для зелёного дракона.
Третья глава посвящена коду проекта. В этом разделе были некоторые проблемы. Давайте разберём их.
Первая проблема связана с движением дракона. У меня с начало должна проиграться анимация сна, анимация подготовки к полёту, анимация полёта вверх и только на анимации полёта дракон должен начать двигаться. Иначе дракон сразу будет двигаться стоя и при этом подниматься вверх.
Решение реализовано через события в анимации. К примеру, нам необходимо чтобы дракон начал двигаться вверх в процессе анимации взлёта. Для этого мы ищем нашу анимацию взлёта и выделяем:
Идём в окошко инспектора и открываем вкладочку анимация:
Далее прокручиваем вниз и видим вкладку Events(события), открываем его:
Кружком отмечена кнопка создания события, а подчёркнуто уже имеющиеся событие. Если мы нажмём на палочку, то увидим:
К слову полоска сверху - это тайм лайн, т.е., при передвижении полоски влево или вправо, вы можете выбрать наиболее подходящее время для начало события. Событие называется 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. Все звуки я искал через поисковик, делать это через стор слишком хлопотно.
И так, здеся проблема была в том, что мне нужны были разные звуки в одном драконе и чтоб запускались в зависимости от анимации. Так как, дракон у меня кричит в начале и взлетает (звук крыльев). В книге же на один объект приходиться один звук, поэтому сейчас покажу как это решить.
Сперва выбираем дракона и добавляем ему Аудио Ресурс:
Аудио клип добавлять не обязательно. Далее мы заходим в EnemyDragon и добавляем в поля:
public AudioClip[] Sounds;
public AudioSource audioSource;
Теперь когда мы это добавили, снова открываем инспектор дракона и видим изменения:
Видим, что появилась вкладочка Sounds, туда нажимая плюсик и перетаскивая звуки, мы добавляем все звуки нашего дракона: рев и звук крыльев. Также переносим аудио ресурс добавленный ранее в новое поле в скрипте (Кривая стрелка).
Далее нам необходимо, чтобы звуки воспроизводились по анимации, поэтому будет снова использовать события в анимации (см. выше). В анимации крика дракона добавляем событие ScreamSound:
Так же добавляем событие 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. Лучшего решения я не нашёл, а тут сразу понятно, что нельзя проигрывать другой звук пока не будет остановлен другой или они оба в итоге зациклятся, не уверен не проверял. Если есть другие способы, то пожалуйста напишите в комментах.
Седьмая глава посвящена публикации и подготовке проекта.
Структурирование файлов.... вот что мешало сразу всё делать в нужных папках? (͡๏̯͡๏)
И самое волнующие - это удаление импортированных ассетов. В начале я пытался методом исключения находить необходимые материалы, путём удаления и восстановления некоторых папок, но понял что это будет долго и только потом заметил, что можно зайти в некоторые объекты и в инспекторе искать подключенные материалы. К примеру:
На скриншоте показана иерархия, инспектор объекта Enemy(дракон), чтобы открыть это, достаточно 2 раза нажать на Enemy. Выбрав из иерархии DragonSoulEater мы видим его инспектор и в некоторых полях используются различные текстуры, материалы и т.п. Например, если мы кликнем по используемому материалу GreenHP, то мы увидим, что снизу открылось его расположение и если оно в импортированных папках ассета, то стоит перенести их в проект. Стоит также проверить и другие объекты в иерархии Enemy. Таким способом удалось быстрее перенести всё необходимое.
Дальше, как всё сделали, выбираете платформу для публикации и собираете проект. Мне с начала было интересно, правильно ли я публикую игру на simmer.io, поэтому вот скрин как должны выглядеть файлы:
3. Вывод и ссылки
И так, книжка оказалась вполне интересной. Лично я научился управляться событиями анимации и музыкой. Остальное для было не таким уж интересным.
Могу ли я рекомендовать книжку новичкам? Ну тут, сложно ответить однозначно. Да, но только если новичок усидчивый и нет, если человек не усидчивый и не хочет решать проблемы, которые могут возникнуть.
Что же до таких, как я. То вам стоит просмотреть оглавление и если вы ещё, как я, чего-то не изучили, то можно пройтись с начала и до конца, но попытавшись добавлять что-то новое. Как пособие же, я эту книгу не рекомендую. Эта книга скорее для ознакомления с unity и жизненным циклом проекта.
Оригинальная работа по книжке:
Моя работа по книжке:
Заходите на мой сайт, может найдёте для себя что-нибудь полезное:
Так же заходите на мой паблик в вк, где я выкладываю рисунки, анимации и др., мои творения:
СПАСИБО, ЧТО ПРОЧИТАЛИ!