Как сделать стратегию в unity3d

Паттерны. «Strategy». Unity

Здравствуйте уважаемые читатели данной статьи. Сегодня я решил поговорить о ОО-проектировании в сфере геймдева, используя движок Unity. Сразу скажу, что данная статься является объективным видением использования паттернов и в особенности, их реализация. Кто-то может говорить о том, что в моих далее приведенных примерах лучше использовать тот или иной паттерн и возможно вы будете правы, но моя задача как минимум поверхностно пройтись по этой достаточно сложной теме. Я рассчитываю сделать небольшой цикл статей про разные паттерны и их примерное использование, чтобы архитектура вашего проекта стала гибкой и расширяемой.
Также хочу отметить, что данный цикл будет требовать определенных знаний в области ОО-программирования и базового ознакомления с понятием «паттерн».
Вроде всё оговорил, можем начинать!

Паттерн «Стратегия». Его использование.

Подробнее с самим паттерном можно ознакомится здесь: https://metanit.com/sharp/patterns/3.1.php

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

Теперь перейдём к реализации класса «Player» :

Поясню некоторые моменты:

А теперь реализация класса «Enemy» :

Пока что ничего интересного, просто пустой класс. Теперь предположим, что мы хотим, чтобы наш игрок мог двигаться, но при этом, наши враги тоже могли. Для этого мы создадим. Интерфейс! Да-да, именно. А далее, мы создадим класс-поведение, которое будет наследовать данный интерфейс. А теперь, по-порядку.
Интерфейс:

Классический пример интерфейса для движения объекта. Далее, класс-поведение:

Как видите, все необходимые данные инициализируются в конструкторе класса, а при этом, само поведение не будет занимать места среди компонентов игровых объектов, так как существует он только внутри классов, которыми он будет создан.
Теперь немного преобразуем класс «Human» :

Если вы обратите внимание, то увидите, что благодаря методу «SetWalkBehaviour» вы имеете возможность добавить новое поведение, а конкретно поведение, реализуемое на базе интерфейса «WalkBehaviour». Достоинство этого способа заключается в том, что экзмепляр, который хранит у нас «WalkBehavoir» никак не привязан к классу «HumanWalkBehaviour». Что это значит? То, что вы можете делать несколько классов-поведений, которые связаны одной задачей, но при этом имеют разную реализацию. Конкретнее в примере далее.
Теперь преобразуем класс «Player» :

Источник

Создание игры Tower Defense в Unity — Часть 1

Как сделать стратегию в unity3d

Игры жанра tower defense приобретают всё большую популярность, и это неудивительно — немногое может сравниться с удовольствием от наблюдения за собственными линиями защиты, уничтожающими злых врагов! В этом туториале из двух частей мы создадим игру tower defense на движке Unity!

Вы узнаете, как сделать следующее:

Примечание: вам необходимы начальные знания Unity (например, вы должны знать, как добавляются ассеты и компоненты, что такое префабы) и основы языка C#. Для изучения всего этого я рекомендую вам пройти туториалы по Unity Шона Даффи или серию Beginning C# with Unity Брайана Мокли.

Я буду работать в версии Unity для OS X, но этот туториал подойдёт и для Windows.

Сквозь окна башни из слоновой кости

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

Вот скриншот готовой игры:

Как сделать стратегию в unity3d

Монстры, объединяйтесь! Защищайте печеньку!

Приступаем к работе

Скачайте эту заготовку проекта, распакуйте её и откройте проект TowerDefense-Part1-Starter в Unity.

В заготовке проекта есть ассеты графики и звуков, готовые анимации и несколько полезных скриптов. Скрипты не связаны напрямую с играми жанра tower defense, поэтому я не буду здесь о них рассказывать. Однако если вы хотите больше узнать о создании 2D-анимаций в Unity, то изучите этот туториал по Unity 2D.

В проекте также содержатся префабы, которые мы позже дополним, чтобы создать персонажей. Наконец, в проекте есть сцена с фоном и настроенным интерфейсом пользователя.

Откройте GameScene, находящуюся в папке Scenes и задайте для режима Game соотношение сторон 4:3, чтобы все метки правильно совпадали с фоном. В режиме Game вы увидите следующее:

Как сделать стратегию в unity3d

Место помечено крестом: расположение монстров

Монстров можно ставить только на точки, помеченные знаком x.

Чтобы добавить их в сцену, перетащите Images\Objects\Openspot из Project Browser в окно Scene. Пока позиция для нас не важна.

Выбрав в иерархии Openspot, нажмите на Add Component в Inspector и выберите Box Collider 2D. В окне Scene Unity покажет прямоугольный коллайдер с зелёной линией. Мы будем использовать этот коллайдер для распознавания нажатий мыши на этом месте.

Как сделать стратегию в unity3d

Аналогичным образом добавьте к Openspot компонент Audio\Audio Source. Выберите для параметра AudioClip компонента Audio Source файл tower_place, который находится в папке Audio, и отключите Play On Awake.

Нам нужно создать ещё 11 точек. Хотя существует искушение повторить все эти действия, в Unity есть решение получше: Prefab!

Перетащите Openspot из Hierarchy в папку Prefabs внутри Project Browser. Его название станет в Hierarchy синим, это означает, что он присоединён к префабу. Примерно так:

Как сделать стратегию в unity3d

Теперь, когда у нас есть заготовка-префаб, мы можем создать сколько угодно копий. Просто перетащите Openspot из папки Prefabs внутри Project Browser в окно Scene. Повторите это 11 раз, и у нас появится в сцене 12 объектов Openspot.

Теперь воспользуемся Inspector, чтобы задать этим 12 объектам Openspot следующие координаты:

Как сделать стратегию в unity3d

Размещаем монстров

Чтобы упростить размещение, в папке Prefab проекта есть префаб Monster.

Как сделать стратегию в unity3d

Префаб Monster готов к использованию

На данный момент он состоит из пустого игрового объекта с тремя разными спрайтами и анимациями стрельбы в качестве дочерних элементов.

Каждый спрайт представляет собой монстра с разными уровнями силы. Также в префабе содержится компонент Audio Source, который будет запускаться для воспроизведения звука, когда монстр стреляет лазером.

Теперь мы создадим скрипт, который будет располагать Monster на Openspot.

В Project Browser выберите в папке Prefabs объект Openspot. В Inspector нажмите на Add Component, а затем выберите New Script и назовите скрипт PlaceMonster. Выберите в качестве языка C Sharp и нажмите на Create and Add. Так как мы добавили скрипт к префабу Openspot, то у всех объектов Openspot в сцене теперь будет этот скрипт. Отлично!

Дважды нажмите на скрипт, чтобы открыть его в IDE. Затем добавьте две переменные:

По одному монстру на точку

Чтобы на одну точку можно было поставить только одного монстра, добавьте следующие метод:

Теперь добавим следующий код, чтобы размещать монстра, когда игрок нажимает на этот GameObject:

Этот код располагает монстра при нажатии мыши или касании экрана. Как он работает?

Использование подходящего префаба

Сохраните файл и вернитесь в Unity.

Чтобы задать переменную monsterPrefab, сначала выберите в браузере проекта объект Openspot из папки Prefabs.

В Inspector нажмите на кружок справа от поля Monster Prefab компонента PlaceMonster (Script) и выберите в появившемся диалоговом окне Monster.

Как сделать стратегию в unity3d

Вот и всё. Запустите сцену и создавайте монстров на разных местах нажатием мыши или касанием экрана.

Как сделать стратегию в unity3d

Отлично! Теперь мы можем создавать монстров. Однако они выглядят как странная каша, потому что отрисовываются все дочерние спрайты монстра. Сейчас мы это исправим.

Повышаем уровень монстров

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

Как сделать стратегию в unity3d

Какой милаха! Но если вы попробуете украсть его печенье, этот монстр превратится в убийцу.

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

Добавим этот скрипт.

Задание уровней монстров

Как сделать стратегию в unity3d

Изобретать велосипед заново — обычно плохая идея.

В верхней части MonsterData.cs добавим следующую конструкцию using :

Примечание: обобщения — это мощная концепция C#. Они позволяют задавать типобезопасные структуры данных, не придерживаясь типа. Это удобно для таких классов-контейнеров, как списки и множества. Чтобы подробнее узнать про обобщённые структуры, прочитайте книгу Introduction to C# Generics.

Теперь добавим следующую переменную в MonsterData для хранения списка MonsterLevel :

Сохраните файл и переключитесь в Unity, чтобы настроить каждый уровень.

Выберите Prefabs/Monster в Project Browser. В Inspector теперь отображается поле Levels компонента MonsterData (Script). Задайте для параметра size значение 3.

Как сделать стратегию в unity3d

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

Развернём Prefabs/Monster в Project browser, чтобы видеть его дочерние элементы. Перетащите дочерний Monster0 в поле visualization Element 0.

Далее назначим Element 1 значение Monster1, а Element 2 значение Monster2. В GIF показан этот процесс:

Как сделать стратегию в unity3d

Когда вы выбираете Prefabs/Monster, префаб должен выглядеть так:

Как сделать стратегию в unity3d

Задание текущего уровня

Вернитесь к MonsterData.cs в IDE и добавьте к MonsterData ещё одну переменную.

В частной переменной currentLevel мы будем хранить текущий уровень монстра.

Теперь зададим currentLevel и сделаем его видимым для других скриптов. Добавьте следующие строки в MonsterData вместе с объявлением переменных экземпляра:

Довольно большой кусок кода на C#, правда? Давайте разберём его по порядку:

OnEnable будет вызван сразу же при создании префаба (если префаб был сохранён в состоянии enabled), но OnStart не вызывается, пока объект не начинает выполняться как часть сцены.

Сохраните файл и вернитесь в Unity. Запустите проект и расположите монстров; теперь у них отображаются правильные спрайты самого нижнего уровня.

Как сделать стратегию в unity3d

Апгрейд монстров

Вернитесь в IDE и добавьте в MonsterData следующий метод:

Можно использовать этот метод, чтобы узнать, возможен ли апгрейд монстра.

Для повышения уровня монстра добавьте следующий метод:

Проверяем функционал апгрейдов

Сохраните файл и вернитесь к PlaceMonster.cs в IDE. Добавьте новый метод:

Реализуем улучшения за золото

Чтобы включить опцию апгрейда, добавим к OnMouseUp ветвь else if :

Сохраните файл и вернитесь в Unity. Запустите игру разместите и улучшите любое количество монстров (но это пока).

Как сделать стратегию в unity3d

Платим золотом — Game Manager

Пока мы можем сразу же построить и улучшить любых монстров, но разве это будет интересно в игре?

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

На рисунке ниже показаны все объекты, которые должны принимать в этом участие.

Как сделать стратегию в unity3d

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

Для хранения этих данных мы воспользуемся общим объектом, к которому смогут получать доступ другие объекты.

Нажмите правой клавишей на Hierarchy и выберите Create Empty. Назовите новый объект GameManager.

Добавьте к GameManager новый скрипт C# с названием GameManagerBehavior, а затем откройте его в IDE. Мы будем отображать общее количество золота игрока в метке, поэтому в верхней части файла добавьте следующую строку:

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

Добавьте в GameManagerBehavior следующий код:

Насколько щедрыми мы будем? Добавьте в Start() следующую строку, чтобы дать игроку 1000 золота, или меньше, если вам жалко денег:

Назначение объекта метки скрипту

Сохраните файл и вернитесь в Unity. В Hierarchy выберите GameManager. В Inspector нажмите на круг справа от Gold Label. В диалоговом окне Select Text выберите вкладку Scene и выберите GoldLabel.

Как сделать стратегию в unity3d

Запустите сцену и в метке отобразится Gold: 1000.

Как сделать стратегию в unity3d

Проверяем «кошелёк» игрока

Откройте в IDE скрипт PlaceMonster.cs и добавьте следующую переменную экземпляра:

Мы воспользуемся gameManager для получения доступа к компоненту GameManagerBehavior объекта GameManager сцены. Чтобы задать её, добавьте в Start() следующее:

Возьми мои деньги!

Мы пока не вычитаем золото, поэтому дважды добавим внутрь OnMouseUp() эту строку, заменив каждый из комментариев // TODO: вычитать золото :

Сохраните файл и вернитесь в Unity, улучшите несколько монстров и посмотрите на обновление значения Gold. Теперь мы вычитаем золото, но игроки могут строить монстров, пока им хватает места; они просто берут деньги в долг.

Как сделать стратегию в unity3d

Бесконечный кредит? Отлично! Но мы не можем этого позволить. Игрок должен иметь возможность ставить монстров, пока у него достаточно золота.

Проверка золота для монстров

Переключитесь в IDE на PlaceMonster.cs и замените содержимое CanPlaceMonster() следующим:

Задание для вас: самостоятельно добавьте в CanUpgradeMonster() проверку, достаточно ли у игрока золота.

Она будет проверять, больше ли у игрока Gold, чем цена апгрейда.

Сохраните и запустите сцену в Unity. Теперь попробуйте-те как неограниченно добавлять монстров!

Как сделать стратегию в unity3d

Теперь мы можем строить только ограниченное количество монстров.

Башенная политика: враги, волны и точки маршрута

Настало время «проложить дорогу» нашим врагам. Враги появляются на первой точке маршрута, движутся к следующей и повторяют процесс, пока не дойдут до печенья.

Заставить врагов двигаться можно так:

Создание дороги из точек маршрута

Нажмите правой клавишей на Hierarchy и выберите Create Empty, чтобы создать новый пустой игровой объект. Назовите его Road и расположите в точке (0, 0, 0).

Теперь нажмите правой клавишей на Road в Hierarchy и создайте ещё один пустой игровой объект как дочерний элемент Road. Назовите его Waypoint0 и разместите в точке (-12, 2, 0) — отсюда враги будут начинать своё движение.

Как сделать стратегию в unity3d

Аналогичным образом создайте ещё пять точек маршрута со следующими названиями и позициями:

Как сделать стратегию в unity3d

Создание врагов

Теперь создадим несколько врагов, чтобы они могли двигаться по дороге. В папке Prefabs есть префаб Enemy. Его позиция равна (-20, 0, 0), поэтому новые экземпляры будут создаваться за пределами экрана.

Как сделать стратегию в unity3d

Двигаем врагов по дороге

Добавьте новый скрипт C# с названием MoveEnemy к префабу Prefabs\Enemy. Откройте скрипт в IDE и добавьте следующие переменные:

В waypoints в массиве хранится копия точек маршрута, а строка [HideIninspector] над waypoints гарантирует, что мы не сможем случайно изменить это поле в Inspector, но по-прежнему будем иметь доступ к нему из других скриптов.

currentWaypoint отслеживает, из какой точки маршрута идёт враг в текущий момент времени, а в lastWaypointSwitchTime хранится время, когда враг прошёл по ней. Кроме того, мы храним скорость speed врага.

Добавим эту строку в Start() :

Так мы инициализируем lastWaypointSwitchTime со значением текущего времени.

Чтобы враг двигался вдоль маршрута, добавим в Update() следующий код:

Разберём код пошагово:

Сообщаем врагам направление движения

В своём текущем состоянии враги не знают порядка точек маршрута.

Выберите Road в Hierarchy и добавьте новый скрипт C# под названием SpawnEnemy. Откройте его в IDE и добавьте следующую переменную:

Мы будем использовать waypoints для хранения ссылок на точку маршрута в сцене в нужном порядке.

Сохраните файл и вернитесь в Unity. Выберите Road в Hierarchy и задайте Size массива Waypoints равным 6.

Перетащите каждый из дочерних элементов Road в поля, вставив Waypoint0 в Element 0, Waypoint1 в Element 1 и так далее.

Как сделать стратегию в unity3d

Теперь у нас есть массив, содержащий точки маршрута в правильном порядке — заметьте, враги никогда не отступают, они упорно стремятся к сладкой награде.

Проверяем, как всё это работает

Откройте в IDE SpawnEnemy и добавьте следующую переменную:

Чтобы создать врага при запуске скрипта, добавим в Start() следующий код:

Сохраните файл и вернитесь в Unity. Выберите в Hierarchy объект Road и выберите для параметра Test Enemy префаб Enemy.

Запустите проект и посмотрите, как враг движется по дороге (в GIF для большей наглядности скорость увеличена в 20 раз).

Как сделать стратегию в unity3d

Заметили, что он не всегда смотрит туда, куда идёт? Это забавно, но мы ведь пытаемся сделать профессиональную игру. Поэтому во второй части туториала мы научим врагов смотреть вперёд.

Куда двигаться дальше?

Мы уже сделали многое и быстро движемся к созданию собственной игры в жанре tower defense.

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

Скачайте готовый результат отсюда.

Во второй части мы рассмотрим создание огромных волн врагов и их уничтожение. До встречи!

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *