[Из песочницы] Tower Defence на движке Unity — Часть 1
Привет всем! Это моя первая статья для хабра. И в ней я хотел бы рассказать о том, как создать маленькую 3D игру жанра Tower Defence на движке Unity. Прошу пожаловать под кат! Только осторожно, там очень много картинок…
Запустим Unity. У меня стоит Unity Personal. Создадим новый проект под названием «MyTowerDefence». Игра будет трёхмерной, аналитику Unity мы использовать не будем.
Я настроил рабочую область, так как мне удобно, вы можете оставить всё как есть у вас. При создании нового трёхмерного проекта по умолчанию создаётся камера и источник света. В двумерном проекте будет только камера.

Создадим новый игровой объект куб, выбрав в главном меню «GameObject → Cube». Дадим ему новое имя «Body» в переводе с английского «Тело». Это будет тело сторожевой башни.
Закинем объект «Body» в объект «Tower».
«Body» стал дочерним объектом объекта «Tower». Положение, вращение и масштаб дочерних объектов зависит от аналогичных параметров родительского объекта. Проще говоря, если перетащить родительский объект, то все дочерние объекты последуют за своим родителем.
Создадим новый объект куб. Позицию выставим в ноль и немного сплющим куб по координате Y.
Назовём куб «Head» — «Голова». Поставим голову на место и приклеим её к объекту «Tower».
Теперь нам нужна пушка. Создаём новый куб с именем «Gun» — «Пушка». Делаем так, что бы куб хотя бы отдалённо напоминал её.
Нужен ещё один вспомогательный объект, который будет центром вращения пушки. Создадим пустой объект и привяжем к нему объект «Gun». А его привяжем к объекту «Tower».
Настраиваем позицию пушки.

Сохраним сцену с любым именем. Создадим папку для хранения сцен и поместим созданную сцену туда. Теперь наведём красоту. В папке материалов создаём новый материал с именем «TowerBody».
Зададим цвет и применим материал к телу башни, перетащив его из окна «Project» на объект.
Дублируем материал с новым именем «TowerHead». Выполняем аналогичные действия для головы. Также поступим и для пушки.
Всё, красоту навели.
Попробуем сымитировать повороты сторожевой башни. Тут мы сразу обнаружим недочёт. Голова вращается, а пушка занята своими делами.
Заставим её вращаться вместе с головой, переместив вспомогательный объект пушки в объект «Head».
Повращаем пушку. И тут мы видим, что то необъяснимое… (Мелодия «Секретные материалы»)
Ну да ладно, к этому мы вернёмся дальше, когда будем вращать пушку при помощи скрипта. Создадим из объекта «Tower» новый префаб, перетащив его в папку «Prefabs».
Оригинал башни удаляем со сцены.
Создадим объект плоскость. На плоскости будет происходить вся тусовка. Применим к ней любой материал.
Изменим положение камеры, так что бы было видно всю плоскость под углом.
Переименуем плоскость в «Ground».
Закинем его в папку префабов. Теперь дублируем объект на сцене, нажав сочетание клавиш CTRL+D. После, зажав CTRL перетащим объект в сторону. Этим действием мы перетащили новую копию объекта через привязку к сетке, которая позволяет перемещать объект на одинаковую длину шагов. Сейчас шаг сетки равен единице.
Вот кстати интересная особенность префабов. Если мы изменим, как сейчас, размер объекта, и нажмём кнопку «Apply» — «Применить», то новые параметры этого префаба распространятся на все его копии.
Теперь нужно заполнить копиями объекта всю плоскость. Ах да, забыл выставить позицию плоскости по нулям, как раз из-за этого всё отображается криво.
Камера по той же причине расположена неправильно. Создадим новый пустой объект «TowerPlaces» хранящий объекты мест для установки башен.
Теперь сформируем дорожку для движения ботов, простым удалением объектов «TowerPlace».
Создаём пустой объект для вэйпоинта. Вэйпоинты — это точки маршрута, по которым перемещаются боты. Позицию ставим по нулям. Зададим иконку для невидимого объекта, что бы его было видно в окне редактора.
Приподнимем объект по оси Y что бы он не сливался с плоскостью. Неважно на сколько, главное не трогаем координаты X и Z, они должны быть по нулям.
Закинем его в папку префабов и переместим оригинал к началу пути с зажатой клавишей CTRL. Заметьте координаты объекта, сохраняют своё целочисленное значение по оси X и Z.
Дублируем вэйпоинты и размещаем на краях поворота, держа при этом зажатой клавишу CTRL. Делаем это всё до конца пути.
Поместим все вэйпоинты в пустой объект.
Важно проверить порядок их расположения, иначе боты у нас начнут гулять, где захотят.
Создадим куб, который будет работать спаунером, т.е. заниматься созданием ботов на сцене. Занулим позицию и поставим объект перед на началом пути. Можно изменить его масштаб на своё усмотрение.
В папке материалов создадим новый материал. Присвоим его спаунеру. Становится красиво.
В папке скриптов создаём новый скрипт с именем «Spawner». Перейдём в редактор кода двойным щелчком по скрипту. Редактором кода может быть Visual Studio, MonoDevelop или вовсе обычный блокнот. На работу скрипта это никак не повлияет, если только на удобство. А на ошибки укажет редактор Unity.
В пятой версии движка по умолчанию используется Visual Studio, но при необходимости среду разработки можно сменить в настройках редактора Unity.
Для большей наглядности можно посмотреть видеоурок:
Спасибо за внимание! Конец первой части.

Начало
Запустим 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.

Для большей наглядности можно посмотреть видеоурок:
Спасибо за внимание! Конец первой части.