Привет всем! Это моя первая статья для хабра и она предназначена для новичков. В ней я хотел бы рассказать о том, как создать маленькую 3D игру жанра Tower Defence на движке Unity.

Я как и вы только изучаю этот движок. Учусь вместе с вами и могу допускать ошибки. Если статья интересна, то прошу пожаловать под кат! Только осторожно, там очень много картинок…

image

Часть 1 Часть 2

Начало


Запустим Unity. У меня стоит Unity Personal. Создадим новый проект под названием «MyTowerDefence». Игра будет трёхмерной, аналитику Unity мы использовать не будем.

image

Я настроил рабочую область, так как мне удобно, вы можете оставить всё как есть у вас. При создании нового трёхмерного проекта по умолчанию создаётся камера и источник света. В двумерном проекте будет только камера.

Создадим 3 новые папки:

  • Папку «Materials», она будет хранить материалы объектов.
  • Папку «Prefabs», она будет хранить наши заготовки объектов с настроенными компонентами, скриптами и иерархией дочерних объектов.
  • Папку «Scripts», она будет хранить скрипты.

image

Сторожевая башня


Создадим новый игровой объект куб, выбрав в главном меню «GameObject -> Cube». Дадим ему новое имя «Body» в переводе с английского «Тело». Это будет тело сторожевой башни.

Теперь создадим пустой объект. Его не видно на сцене. Назовём его «Tower» — «Башня». В данном случае он будет главным объектом дерева сторожевой башни. Позицию созданных объектов поставим по нулям.

image

Закинем объект «Body» в объект «Tower».

image

«Body» стал дочерним объектом объекта «Tower». Положение, вращение и масштаб дочерних объектов зависит от аналогичных параметров родительского объекта. Проще говоря, если перетащить родительский объект, то все дочерние объекты последуют за своим родителем.

Изменим масштаб тела башни.

image

Создадим новый объект куб. Позицию выставим в ноль и немного сплющим куб по координате Y.

image

Назовём куб «Head» — «Голова». Поставим голову на место и приклеим её к объекту «Tower».

image

Теперь нам нужна пушка. Создаём новый куб с именем «Gun» — «Пушка». Делаем так, что бы куб хотя бы отдалённо напоминал её.

image

Нужен ещё один вспомогательный объект, который будет центром вращения пушки. Создадим пустой объект и привяжем к нему объект «Gun». А его привяжем к объекту «Tower».

image

Настраиваем позицию пушки.

image

image

Сохраним сцену с любым именем. Создадим папку для хранения сцен и поместим созданную сцену туда. Теперь наведём красоту. В папке материалов создаём новый материал с именем «TowerBody».

image

Зададим цвет и применим материал к телу башни, перетащив его из окна «Project» на объект.

image

Дублируем материал с новым именем «TowerHead». Выполняем аналогичные действия для головы. Также поступим и для пушки.
Всё, красоту навели.

image

Попробуем сымитировать повороты сторожевой башни. Тут мы сразу обнаружим недочёт. Голова вращается, а пушка занята своими делами.

image

Заставим её вращаться вместе с головой, переместив вспомогательный объект пушки в объект «Head».

image

Повращаем пушку. И тут мы видим, что то необъяснимое… (Мелодия «Секретные материалы»)

image

Ну да ладно, к этому мы вернёмся дальше, когда будем вращать пушку при помощи скрипта. Создадим из объекта «Tower» новый префаб, перетащив его в папку «Prefabs».

image

Оригинал башни удаляем со сцены.

Поле битвы


Создадим объект плоскость. На плоскости будет происходить вся тусовка. Применим к ней любой материал.

image

Изменим положение камеры, так что бы было видно всю плоскость под углом.

image

Переименуем плоскость в «Ground».

Нам нужна платформа для возможности установки на ней сторожевой башни. Для этого создадим куб, позицию проставим по нулям и сплющим его по оси Y. Также, отключим отбрасывание тени. Назовём куб «TowerPlace».

image

Закинем его в папку префабов. Теперь дублируем объект на сцене, нажав сочетание клавиш CTRL+D. После, зажав CTRL перетащим объект в сторону. Этим действием мы перетащили новую копию объекта через привязку к сетке, которая позволяет перемещать объект на одинаковую длину шагов. Сейчас шаг сетки равен единице.

image

Вот кстати интересная особенность префабов. Если мы изменим, как сейчас, размер объекта, и нажмём кнопку «Apply» — «Применить», то новые параметры этого префаба распространятся на все его копии.

image

Теперь нужно заполнить копиями объекта всю плоскость. Ах да, забыл выставить позицию плоскости по нулям, как раз из-за этого всё отображается криво.

image

Камера по той же причине расположена неправильно. Создадим новый пустой объект «TowerPlaces» хранящий объекты мест для установки башен.

image

Теперь сформируем дорожку для движения ботов, простым удалением объектов «TowerPlace».

image

Waypoints


Создаём пустой объект для вэйпоинта. Вэйпоинты — это точки маршрута, по которым перемещаются боты. Позицию ставим по нулям. Зададим иконку для невидимого объекта, что бы его было видно в окне редактора.

image

Приподнимем объект по оси Y что бы он не сливался с плоскостью. Неважно на сколько, главное не трогаем координаты X и Z, они должны быть по нулям.

image

Закинем его в папку префабов и переместим оригинал к началу пути с зажатой клавишей CTRL. Заметьте координаты объекта, сохраняют своё целочисленное значение по оси X и Z.

image

Дублируем вэйпоинты и размещаем на краях поворота, держа при этом зажатой клавишу CTRL. Делаем это всё до конца пути.

image

Поместим все вэйпоинты в пустой объект.

image

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

Spawner


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

image

В папке материалов создадим новый материал. Присвоим его спаунеру. Становится красиво.

image

В папке скриптов создаём новый скрипт с именем «Spawner». Перейдём в редактор кода двойным щелчком по скрипту. Редактором кода может быть Visual Studio, MonoDevelop или вовсе обычный блокнот. На работу скрипта это никак не повлияет, если только на удобство. А на ошибки укажет редактор Unity.

Завершение первой части


В пятой версии движка по умолчанию используется Visual Studio, но при необходимости среду разработки можно сменить в настройках редактора Unity.

image

Для большей наглядности можно посмотреть видеоурок:



P. S.: Если у вас есть вопросы или пожелания, оставляйте свои комментарии на YouTube под видео.
На хабре я комментарии не читаю.

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

Спасибо за внимание! Конец первой части.
Поделиться с друзьями
-->

Комментарии (19)


  1. izzholtik
    07.09.2016 09:51
    +1

    Хм.
    Совершенно не разбираюсь в юнити, так что вопрос может иметь тривиальное решение, но:
    мы сейчас создали, по сути, уровень на всю сцену. Как планируется хранить и менять другие уровни и не пересоздавать каждый раз совместно используемый контент?


    1. SergeyMakhonya
      07.09.2016 10:00
      -3

      Я пока не думал об этом, но для решения этого вопроса можно написать скрипт динамического построения уровня и присвоить его пустому объекту на сцене. Вскоре я рассмотрю этот вопрос. Спасибо за идею!


    1. JFirefly
      07.09.2016 10:23

      Главное меню — начальная сцена, каждый уровень — отдельная сцена. Контент для всех сцен может быть одинаковым.


      1. DyadichenkoGA
        08.09.2016 20:42

        На самом деле решать можно по разному. Зависит от задач. Работать через разные сцены не всегда бывает удобным. Очень часто удобнее делать одну сцену с геймплеем, и одну сцену для интерфейсов (главное меню, стор, что-то ещё). А уровни сериализовать каким-нибудь JSON, XML, YAML, а после строить их на старте сцены. Если вариант для начинающих, то думаю да. По сцене на уровень удобнее всего.


  1. RikoSaGe
    07.09.2016 09:56

    Отличная статья, все просто и понятно.


  1. Leopotam
    07.09.2016 10:06
    +1

    Коллайдер на движущемся объекте без RigidBody — убивать надо за такие статьи. Так и формируется мнение, что «юнити — тормозное уг».


    1. Alex_ME
      07.09.2016 10:27

      Было бы очень интересно почитать про разные Unity Best Practices, чтобы узнать, какие подходы могут привести к "тормознутому говну" и как не надо делать.


      1. Leopotam
        07.09.2016 10:32

        Да на том же хабре говорилось ни раз про всякие best practices, про то, что колайдеры считаются physx-ом статичным миром если не помечены rigidbody и их перемещение приводит к полному перестроению статичного мира физики (в unity5 это немного пофиксили с обновлением physx, но сама проблема осталась). Так же были статьи про tower defense на юнити — эта статья хуже по всем параметрам: учит плохому, информации практически не несет по сравнению с аналогами.


      1. Papasol
        07.09.2016 17:49

        Вот тут есть неплохая подборка: https://unity3d.com/ru/learn/tutorials/topics/best-practices


  1. hellpirat
    07.09.2016 10:08
    -1

    Отличная статья!
    Можно пожелания? Хотелось-бы в будущем увидеть статью про кастомный редактор созданный через EditorWindow. Например для создания уровня.
    Спасибо.


    1. SergeyMakhonya
      07.09.2016 10:22
      -2

      Спасибо за идею! Обязательно рассмотрю данную тему, так как самому очень интересно создать что-нибудь подобное.


    1. Delacrowa
      07.09.2016 10:31

      Кастомный редактор написать можно, но это будет скорее уровень «Intermediate», т.к. придется решать вопросы удобной сериализации (ScriptableObject Vs Json/XML/Yaml etc.) и расширяемости как «сохраненок», так и самого редактора. Предполагаю, что цикл статей задумывался с прицелом на абсолютных новичков в Unity. Но, вообще, идея хорошая и, как для первой статьи, все достойно:)


      1. hellpirat
        07.09.2016 10:51

        Да, не обязательно так серьезно с Json/xml/etc, можно и по проще, на примере этой игры. Например выбирать диапазон x,y, spawn point, ну и хотя-бы пробелы для пути.


  1. VDemot
    07.09.2016 10:26

    Вперед пилить вторую часть! А за эту большое спасибо!
    Ps. Только решил начать изучать, потому ваша статья весьма кстати


    1. SergeyMakhonya
      07.09.2016 10:31

      Рад, что понравилось! Думаю, завтра выйдет продолжение.


  1. cdmlex
    07.09.2016 13:11

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


    1. SergeyMakhonya
      07.09.2016 13:15
      -1

      Спасибо за замечание! В следующих статьях, я обязательно расскажу об этом.


  1. gresolio
    08.09.2016 02:29

    Очень похоже на How to make a Tower Defense Game от Brackeys. Если эти видео являются одним из источников для написания статьи, то не плохо было бы упомянуть об этом. А так вообще похвально, начинающим юнитиводам будет полезно. Успехов в создании следующих частей :)


  1. vitaly_KF
    09.09.2016 19:20

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