Я как и вы только изучаю этот движок. Учусь вместе с вами и могу допускать ошибки. Если статья интересна, то прошу пожаловать под кат! Только осторожно, там очень много картинок…
Часть 1 Часть 2
Начало
Запустим Unity. У меня стоит Unity Personal. Создадим новый проект под названием «MyTowerDefence». Игра будет трёхмерной, аналитику Unity мы использовать не будем.
Я настроил рабочую область, так как мне удобно, вы можете оставить всё как есть у вас. При создании нового трёхмерного проекта по умолчанию создаётся камера и источник света. В двумерном проекте будет только камера.
Создадим 3 новые папки:
- Папку «Materials», она будет хранить материалы объектов.
- Папку «Prefabs», она будет хранить наши заготовки объектов с настроенными компонентами, скриптами и иерархией дочерних объектов.
- Папку «Scripts», она будет хранить скрипты.
Сторожевая башня
Создадим новый игровой объект куб, выбрав в главном меню «GameObject -> Cube». Дадим ему новое имя «Body» в переводе с английского «Тело». Это будет тело сторожевой башни.
Теперь создадим пустой объект. Его не видно на сцене. Назовём его «Tower» — «Башня». В данном случае он будет главным объектом дерева сторожевой башни. Позицию созданных объектов поставим по нулям.
Закинем объект «Body» в объект «Tower».
«Body» стал дочерним объектом объекта «Tower». Положение, вращение и масштаб дочерних объектов зависит от аналогичных параметров родительского объекта. Проще говоря, если перетащить родительский объект, то все дочерние объекты последуют за своим родителем.
Изменим масштаб тела башни.
Создадим новый объект куб. Позицию выставим в ноль и немного сплющим куб по координате Y.
Назовём куб «Head» — «Голова». Поставим голову на место и приклеим её к объекту «Tower».
Теперь нам нужна пушка. Создаём новый куб с именем «Gun» — «Пушка». Делаем так, что бы куб хотя бы отдалённо напоминал её.
Нужен ещё один вспомогательный объект, который будет центром вращения пушки. Создадим пустой объект и привяжем к нему объект «Gun». А его привяжем к объекту «Tower».
Настраиваем позицию пушки.
Сохраним сцену с любым именем. Создадим папку для хранения сцен и поместим созданную сцену туда. Теперь наведём красоту. В папке материалов создаём новый материал с именем «TowerBody».
Зададим цвет и применим материал к телу башни, перетащив его из окна «Project» на объект.
Дублируем материал с новым именем «TowerHead». Выполняем аналогичные действия для головы. Также поступим и для пушки.
Всё, красоту навели.
Попробуем сымитировать повороты сторожевой башни. Тут мы сразу обнаружим недочёт. Голова вращается, а пушка занята своими делами.
Заставим её вращаться вместе с головой, переместив вспомогательный объект пушки в объект «Head».
Повращаем пушку. И тут мы видим, что то необъяснимое… (Мелодия «Секретные материалы»)
Ну да ладно, к этому мы вернёмся дальше, когда будем вращать пушку при помощи скрипта. Создадим из объекта «Tower» новый префаб, перетащив его в папку «Prefabs».
Оригинал башни удаляем со сцены.
Поле битвы
Создадим объект плоскость. На плоскости будет происходить вся тусовка. Применим к ней любой материал.
Изменим положение камеры, так что бы было видно всю плоскость под углом.
Переименуем плоскость в «Ground».
Нам нужна платформа для возможности установки на ней сторожевой башни. Для этого создадим куб, позицию проставим по нулям и сплющим его по оси Y. Также, отключим отбрасывание тени. Назовём куб «TowerPlace».
Закинем его в папку префабов. Теперь дублируем объект на сцене, нажав сочетание клавиш CTRL+D. После, зажав CTRL перетащим объект в сторону. Этим действием мы перетащили новую копию объекта через привязку к сетке, которая позволяет перемещать объект на одинаковую длину шагов. Сейчас шаг сетки равен единице.
Вот кстати интересная особенность префабов. Если мы изменим, как сейчас, размер объекта, и нажмём кнопку «Apply» — «Применить», то новые параметры этого префаба распространятся на все его копии.
Теперь нужно заполнить копиями объекта всю плоскость. Ах да, забыл выставить позицию плоскости по нулям, как раз из-за этого всё отображается криво.
Камера по той же причине расположена неправильно. Создадим новый пустой объект «TowerPlaces» хранящий объекты мест для установки башен.
Теперь сформируем дорожку для движения ботов, простым удалением объектов «TowerPlace».
Waypoints
Создаём пустой объект для вэйпоинта. Вэйпоинты — это точки маршрута, по которым перемещаются боты. Позицию ставим по нулям. Зададим иконку для невидимого объекта, что бы его было видно в окне редактора.
Приподнимем объект по оси Y что бы он не сливался с плоскостью. Неважно на сколько, главное не трогаем координаты X и Z, они должны быть по нулям.
Закинем его в папку префабов и переместим оригинал к началу пути с зажатой клавишей CTRL. Заметьте координаты объекта, сохраняют своё целочисленное значение по оси X и Z.
Дублируем вэйпоинты и размещаем на краях поворота, держа при этом зажатой клавишу CTRL. Делаем это всё до конца пути.
Поместим все вэйпоинты в пустой объект.
Важно проверить порядок их расположения, иначе боты у нас начнут гулять, где захотят.
Spawner
Создадим куб, который будет работать спаунером, т.е. заниматься созданием ботов на сцене. Занулим позицию и поставим объект перед на началом пути. Можно изменить его масштаб на своё усмотрение.
В папке материалов создадим новый материал. Присвоим его спаунеру. Становится красиво.
В папке скриптов создаём новый скрипт с именем «Spawner». Перейдём в редактор кода двойным щелчком по скрипту. Редактором кода может быть Visual Studio, MonoDevelop или вовсе обычный блокнот. На работу скрипта это никак не повлияет, если только на удобство. А на ошибки укажет редактор Unity.
Завершение первой части
В пятой версии движка по умолчанию используется Visual Studio, но при необходимости среду разработки можно сменить в настройках редактора Unity.
Для большей наглядности можно посмотреть видеоурок:
P. S.: Если у вас есть вопросы или пожелания, оставляйте свои комментарии на YouTube под видео.
На хабре я комментарии не читаю.
Многие заметили, что статья и видео похожи на уроки с этого канала. От части это так. Но я позаимствовал только лишь расстановку вэйпоинтов и построение уровня.
Спасибо за внимание! Конец первой части.
Комментарии (19)
Leopotam
07.09.2016 10:06+1Коллайдер на движущемся объекте без RigidBody — убивать надо за такие статьи. Так и формируется мнение, что «юнити — тормозное уг».
Alex_ME
07.09.2016 10:27Было бы очень интересно почитать про разные Unity Best Practices, чтобы узнать, какие подходы могут привести к "тормознутому говну" и как не надо делать.
Leopotam
07.09.2016 10:32Да на том же хабре говорилось ни раз про всякие best practices, про то, что колайдеры считаются physx-ом статичным миром если не помечены rigidbody и их перемещение приводит к полному перестроению статичного мира физики (в unity5 это немного пофиксили с обновлением physx, но сама проблема осталась). Так же были статьи про tower defense на юнити — эта статья хуже по всем параметрам: учит плохому, информации практически не несет по сравнению с аналогами.
Papasol
07.09.2016 17:49Вот тут есть неплохая подборка: https://unity3d.com/ru/learn/tutorials/topics/best-practices
hellpirat
07.09.2016 10:08-1Отличная статья!
Можно пожелания? Хотелось-бы в будущем увидеть статью про кастомный редактор созданный через EditorWindow. Например для создания уровня.
Спасибо.SergeyMakhonya
07.09.2016 10:22-2Спасибо за идею! Обязательно рассмотрю данную тему, так как самому очень интересно создать что-нибудь подобное.
Delacrowa
07.09.2016 10:31Кастомный редактор написать можно, но это будет скорее уровень «Intermediate», т.к. придется решать вопросы удобной сериализации (ScriptableObject Vs Json/XML/Yaml etc.) и расширяемости как «сохраненок», так и самого редактора. Предполагаю, что цикл статей задумывался с прицелом на абсолютных новичков в Unity. Но, вообще, идея хорошая и, как для первой статьи, все достойно:)
hellpirat
07.09.2016 10:51Да, не обязательно так серьезно с Json/xml/etc, можно и по проще, на примере этой игры. Например выбирать диапазон x,y, spawn point, ну и хотя-бы пробелы для пути.
VDemot
07.09.2016 10:26Вперед пилить вторую часть! А за эту большое спасибо!
Ps. Только решил начать изучать, потому ваша статья весьма кстати
cdmlex
07.09.2016 13:11Статья очень подробная, для новичков будет полезна. Но расставлять вручную вейпойнты — совершенно лишнее, алгоритм поиска пути на 60-70 строчек кода, можно им и расставлять при загрузке уровня.
SergeyMakhonya
07.09.2016 13:15-1Спасибо за замечание! В следующих статьях, я обязательно расскажу об этом.
gresolio
08.09.2016 02:29Очень похоже на How to make a Tower Defense Game от Brackeys. Если эти видео являются одним из источников для написания статьи, то не плохо было бы упомянуть об этом. А так вообще похвально, начинающим юнитиводам будет полезно. Успехов в создании следующих частей :)
vitaly_KF
09.09.2016 19:20Вейпоинты конечно хорошо, но было бы интересно посмотреть вариант, при котором игрок сам формирует стены из пушек и других элементов.
izzholtik
Хм.
Совершенно не разбираюсь в юнити, так что вопрос может иметь тривиальное решение, но:
мы сейчас создали, по сути, уровень на всю сцену. Как планируется хранить и менять другие уровни и не пересоздавать каждый раз совместно используемый контент?
SergeyMakhonya
Я пока не думал об этом, но для решения этого вопроса можно написать скрипт динамического построения уровня и присвоить его пустому объекту на сцене. Вскоре я рассмотрю этот вопрос. Спасибо за идею!
JFirefly
Главное меню — начальная сцена, каждый уровень — отдельная сцена. Контент для всех сцен может быть одинаковым.
DyadichenkoGA
На самом деле решать можно по разному. Зависит от задач. Работать через разные сцены не всегда бывает удобным. Очень часто удобнее делать одну сцену с геймплеем, и одну сцену для интерфейсов (главное меню, стор, что-то ещё). А уровни сериализовать каким-нибудь JSON, XML, YAML, а после строить их на старте сцены. Если вариант для начинающих, то думаю да. По сцене на уровень удобнее всего.