Как сделать патрулирование в unity 2d

Обновлено: 06.07.2024

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

В этом уроке я расскажу и покажу как задать искусственному интеллекту в Unity условие патрулирования платформы.

описание: в этом видео я покажу как сделать патрулирование в unity 2d полезные ссылки: группа VK smolny79 .

В этой серии: Патрулирование,враг патрулирует,уроки по Unity,создание игр,как создать игру,канал Игрострой .

Продолжаем серию 2d платформер на Unity. В этом уроке мы сделаем движение противника, патрулирование влево и .

Привет в этом видео ты узнаешь как сделать Патрулирование в Unity. Я покажу 2 разных способа его реализации. Вступай .

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

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

В этом видео мы продолжаем создавать 2D платформер на движке Unity. Изменим всю графику, добавим систему боя, .

В этом уроке мы разберем, как сделать быстро и просто контроль 2D персонажа, в стиле Top-Down. Использовать мы .

ураа инет снова есть и вот новый видосик вам ставь лайк подписывайся на канал, а второй видос уже монтируется видос с .

Привет, сегодня мы сделаем первый ии для наших NPC, научим их передвигаться, а так же сделаем рыбалку. Приятного .

В этом видео мы начнём создавать 2D платформер на движке Unity. Добавим фон, платформы для уровней, а также .

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

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

В этом видео я покажу как сделать врага, который будет нападать на игрока и преследовать его. Все уроки: .

13 - Создаем RPG - Wizard, патрулирование NPC Подписывайтесь на наш телеграмм, задавайте вопросы, делитесь .

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

В этом уроке я покажу как на движке Unity сделать движение и прыжок персонажа. Так-же, объясню как указать количество .

В этом видео я покажу, как при помощи нажатия клавиши поднимать и выбрасывать предметы в Unity. Так-же, разберу .

В этом видео мы продолжаем создавать 2D-платформер на Unity. Добавляем противников: препятствие с уроном, .

В этом видео я делаю простую и приятную механику 2D шутера на движке Unity. Вы научитесь делать пушки, следующие .

Не знаешь, как сделать перемещение 2D объекта по заданному расстоянию в Юнити? Это видео специально для тебя.

В этом видео я сделаю простую механику 2D шутера на Unity. Вы научитесь делать пушки, следующие за курсором мыши, .

Let's learn how to make 2D lights using the new 2D Renderer in Unity! ○ Check out Zenva Academy's curriculums: .

В этом видео я делаю продолжаю совершенствовать наш 2D шутер на движке Unity, добавляю в него элементы ближнего .

В прошлой статье было небольшое введение в принцип работы Bolt и основы визуального программирования. В этой же попробуем небольшой платформер сделать и затронем основные аспекты.

​Поработаем с силами, рейкастами и затронем тему модульности и переиспользования компонентов.


Цикл статей

​Туториалы можно скачать бесплатно с Гитхаба. Каждый туториал будет отдельной папкой в проекте. Конкретно этот туториал будет лежать в директории Assets/Tutorials/02 — Platformer.

Оглавление

Подготовка

Накидаем простенькую сцену с платформами и шипами. Я использовал редактор Тайлов, но это могут быть и обычные спрайты с колайдерами на них. Добавляем в иерархию GameObject игрока.


В инспекторе добавляем к объекту компонент Flow Machine.


Нажимаем Edit Graph и приступает к настройке графа.

Движение персонажа

Мы хотим, чтобы персонаж двигался влево и вправо в зависимости от горизонтальной оси ввода, для которой предварительно настроены сочетания клавиш A и D на клавиатуре или левый джойстик на контроллере. Когда вы идёте влево, возвращается -1 , а когда вправо, то +1 . Скорость движения зададим в переменной.

Для начала можно зайти в настройки и задать необходимое управление в Edit > Project Settings > Input Manager, если не нравятся дефолтные настройки.


Теперь добавим переменную, откуда будем читать скорость. В инспектора объекта игрока добавим переменную в компоненте Veriables. Подробнее можно почитать в документации.

Далее, собственно, нам нужно получить горизонтальную ось ввода. Мы можем сделать это с помощью блока Get Axis.

Новый узел будет полупрозрачным. Так Unity нам сообщает, что они пока нигде не используется. Этот эффект можно отключить на панели отжав пункт Dim.


Далее мы хотим на основании инпута вычислить итоговое значение скорости. Для этого нужно считать значение переменной Speed, созданной ранее, перемножить со значением с инпута и записать в новую переменную.

  1. От выхода узла GetAxis тащим указатель и создаём узел Multiply.
  2. От второго входа нового узла тянем указатель и создаём узел для чтения переменной Variables > Object > Get Object Variable.
  3. Выбираем там Speed.
  4. Выход узла Multiply соединяем с новым узлом Variables > Graph -> Set Graph Variable.
  5. Дадим новой переменной имя Movement.
  6. Соединяем управляющий вход с Update.

Каждый кадр (событие Update) мы получаем значение инпута по оси X в диапозоне [-1;1], домножаем на скорость и сохраняем в переменную Movement.

Теперь нужно задать компоненту Rigidbody 2D персонажа скорость. Скорость состоит из двух составляющих — по осям X и Y, которые пакуются в Vector2 .

  1. Добавляем узел Get Variable для получения Movement из предыдущего шага.
  2. Это передаёт на вход X координате новой ноде Vector2.
  3. А в Y передаём считанную Y координату из текущей скорости (Codebase > Unity Engine > Rigidbody 2D -> Get Velocity).
  4. Полученный вектор передаём на вход узлу для установки нового значения скорости (Codebase > Unity Engine > Rigidbody 2D -> Set Velocity).

Остаётся теперь связать выход узла по установке Movement со входом узла, устанавливающего скорость.

Ну и заодно сгруппируем узлы. Это делается выделением с зажатой клавишей Ctrl .

Если запустить редактор, можно увидеть, как персонаж двигает при нажатии на клавиши. Обратите внимание на граф и то, как меняется значение скорости на нём в режиме реального времени.

  1. Если двигаемся вправо (значение Movement больше 0), значение Scale должно быть положительным.
  2. Если движемся влево (значение Movement меньше 0), значение Scale должно быть отрицательным.
  3. Если стоим на месте (значение Movement равно 0), то ничего не делаем.

Значение Y и Z оставляем как есть.


Если запустить редактор, то увидим, что спрайт персонажа отзеркаливается в зависимости от направления движения.

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

Анимация

Возьмём готовые спрайты и анимации из примера проекта Penny Pixel.

Если открыть аниматор, то нас там пока интересует всего 2 анимации: айдловая и бега. Если посмотреть на переход для анимации бега, то заметим, что оно зависит от скорости по оси X. Нам всего лишь нужно это значение передавать аниматору.

Ну и флажок grounded пока в true выставим, чтобы не запускалась анимация полёта.


На графе, как я уже сказал, нам нужно всего лишь передать значение скорости аниматору и записать в переменную velocityX.


Остаётся только соединить с остальным графом и запустить.

Следующим шагом добавим возможность прыгать.

Придание силы объекту для прыжка

  1. Добавим глобальную переменную для силы прыжка и назовём JumpPower.
  2. Events > Input, а там On Button Input.
  3. Вместе со считанной силой прыжка передаём в Codebase > Unity Engine > Rigidbody 2D > Add Force (Force, Mode).

Если запустить, то по нажатию на Space персонаж будет прыгать. Но есть одна проблема…

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

Создадим новый слой и назначим его платформам.


Необходимо дописать логику по проверке, находится ли персонаж на земле. Один из способов — рейкасты. Будем выпускать лучи вниз на небольшое расстояние, чтобы проверить, сталкиваются ли они с платформой. Проверять как раз по этому слою будем.

Переиспользование логики

Так как эта проверку нужна в двух местах, то выделим всю логику в отдельный юнит Assets > Create > Bolt > Flow Macro.

Для каста использовать будем CircleCast . Хотя это не так принципиально.

  1. Получаем позицию текущую.
  2. Делаем рейкаст по слою Platform, направляя вниз с радиусом 2 и дальностью 2.
  3. Результат получаем в отдельную ноду.
  4. Делаем проверку на то, было ли столкновение.
  5. Результат проверки столкновения луча с платформой пишем в bool переменную IsGrounded на выход.

Теперь в графе персонажа нужно немного изменить узлы, обрабатывающие прыжок.

  1. Перетаскиваем на граф персонажа граф GroundCheck.
  2. Добавляем ветвление.
  3. Соединяем с узлом, задающим силу.

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

Точно также добавим проверку к анимации.


Теперь, если персонаж в воздухе, будет проигрываться соответствующая анимация.

Хотелось бы как-то визуализировать дебажную информацию для отладки.

Отладка и OnDrawGizmos

Было бы неплохо как-то визуализировать рейкаст. Как минимум, хочется видеть, как далеко он бьёт. Для этого можно воспользоваться событием OnDrawGizmos , которое позволяет в редакторе рисовать отладочную информацию.

В нашем случае просто будет рисовать линию. Увеличим дальность луча до 50 и добавим соответствующие узлы для отрисовки линии.

  1. Вытаскиваем информацию о текущем положении.
  2. Создаём Vecto3 на основе X и Z координаты. Эта позиция будет конечной при отрисовки линии.
  3. Рейкаст мы делаем вниз, поэтому в Y координату вписываем Y координату текущего положения персонажа с за вычетом дальности луча.
  4. Добавляем ивент, который каждый кадр рисует информацию.
  5. На вход узла по отрисовке в начальную координату передаём текущее положение персонажа, а конечной точкой будет новое вычисленное значение позиции.

Ещё нужно в Scene View включить отображение Gizmos.


Теперь запустим и посмотрим.

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

В следующей статье поработаем с окнами и сделаем экран смерти персонажа с перезапуском сцены.

Если хотите поддержать выход статей, сделать это можно одним из способов.

🏓 Создаем 2D-игру на Unity: инструкция для новичка

Недавно мы рассказали о том, как научиться разработке игр на Unity . Продолжим тему на практике и покажем, как новичку создать на этой платформе первую 2D-игру.

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

Двумерные игры сравнительно просты: для них не требуется сложных 3D-моделей, программный код по сравнению с 3D-проектами выглядит понятнее. Такие игры популярны как на десктопах, так и на мобильных устройствах. Unity также позволяет разрабатывать игры и для браузеров.

За последние годы вышло много популярных двумерных игр:

Программная реализация 2D-игр проще не только из-за отсутствия третьего измерения: на самой сцене меньше объектов, вместо трехмерных моделей плоские спрайты, вместо скелетной анимации – покадровая. А еще 2D-игры проще портировать на другие платформы – легче найти новую аудиторию.

Давайте создадим простую игру в жанре пинг-понг 🏓 . Перед тем как приступить к созданию игры, продумайте, какой именно результат хотите получить. На первых этапах рекомендуется использовать схематические шаблоны, чтобы быстрее получить работающий результат. В этой инструкции мы так и поступим. Графических ресурсов использовать не будем: и ракетки, и отбиваемый мяч будем пока отображать простыми белыми спрайтами.

Предварительно рассмотрим основные понятия Unity, без понимания которых будет проблематично создать игру:

Предполагаем, что вы уже установили редактор и создали аккаунт на портале Unity.

В первую очередь создадим новый проект и откроем его настройки (Edit → Project Settings). Во вкладке Editor установим параметр Default Behaviour Mode в значение 2D

Настройка проекта Детальная настройка проекта

Следующим шагом сохраним текущую активную сцену, назвав ее, например, Scene1. Теперь создадим основные игровые объекты: ракетку, мяч и менеджер игры, в котором будет храниться основная логика игры.

1. Создаем пустой объект, переименовываем в GameManager.

Создаем пустой объект

Создаем пустой объект

3. Создаем квадратный спрайт, называем его Pad (Assets → Create → Sprites → Square). Аналогично создаем круглый спрайт Ball (Assets → Create → Sprites → Circle). Масштабируем спрайт Pad со следующими параметрами – x:0.5, y:2.5, z:1.

Создаем спрайты

Создаем спрайты

4. Создаем префабы для Pad и Ball, после чего добавляем к ним компонент Box Collider 2D (включаем параметр Is Trigger) и компонент Rigidbody 2D (выставляем параметр Body Type в значение Kinematic).

Добавляем .компонент Box Collider 2D Настраиваем.компонент Box Collider 2D Добавляем компонент Rigidbody 2D Масштабируем спрайты

6. Заполняем скрипты следующим кодом.

GameManager.cs Ball.cs Pad.cs

6. Добавляем к префабу Ball и Pad теги с аналогичными именами. Выделив префабы, в инспекторе мы можем видеть выпадающий список тегов. Там же расположены и кнопки для добавления и редактирования тегов.

7. В настройках камеры выставляем параметр Projection в значение Orthographic, а параметр Clear Flag – в значение Solid Color.

Настройка камеры

Настройка камеры

8. Настраиваем кнопки, как показано на следующих скриншотах (Edit → Project Settings → Input Manager).

Настройка ввода, основное Настройка ввода, первый игрок Настройка ввода, второй игрок

Вот и всё, игра готова!

Пинг-понг, итоговый результат

Пинг-понг, итоговый результат

Билд для платформы Windows

1. Официальный туториал от Unity, где детально рассмотрен процесс создания roguelike RPG.

2. Youtube-канал Brackeys , где можно найти серию видеоуроков по созданию 2D-платформера.

3. Youtube-канал N3K EN содержит множество уроков как по отдельным компонентам Unity, так и полноценные серии уроков по созданию игр с нуля.

Если у вас мало опыта в разработке игр на Unity, мы рекомендуем обратить внимание на факультет разработки игр GeekBrains . Материал хорошо структурирован и содержит все необходимое для того, чтобы стать профессиональным Unity-разработчиком.

В числе прочего вы разработаете 2D-платформер с физическими загадками и динамическим освещением, научитесь портировать его на мобильные устройства. Кроме того, разработаете полноценную браузерную стратегию, а также игру в жанре двухмерных гонок.

По окончании обучения вы будете иметь портфолио из 4 игр, которое можно показать на собеседовании. Если же какая-то часть материала будет непонятна, вы всегда можете обратиться к персональному преподавателю.

Спрайт выстрела

Снаряд – объект, которым мы будем пользоваться очень часто. В игре будет несколько сцен, в которых игрок будет стрелять. Что мы должны использовать в этом случае? Префаб (Prefab), конечно же! Для этого проделайте следующие действия:

  1. Импортируйте текстуру
  2. Создайте новый спрайт в сцене
  3. Установите изображение на спрайт.
  4. Добавьте "Rigidbody 2D" с равныим нулю значениями "Gravity Scale" и "Fixed Angles".
  5. Добавьте "Box Collider 2D" размером (1, 1) .

Та-дам! У нас появился выстрел. Теперь настало время немного поскриптить. Создайте скрипт, назвав его "ShotScript":

Прикрепите "ShotScript" к спрайту. Также добавьте "MoveScript", т.к. ваши снимки будут двигаться. Теперь перетащите объект выстрел в панель "Проект" для создания Префаба. Он нам совсем скоро понадобится. Вы должны иметь следующую конфигурацию:

Конфигурация Выстрел 1

Если вы запустите игру с помощью кнопки "Play", вы увидите, что выстрел движется.

Столкновения и повреждения

Тем не менее, выстрел (пока) не наносит повреждений. Ничего удивительного, ведь мы не сделали скрипт обработки повреждений. Создадим его, назвав "HealthScript":

Добавьте "HealthScript" на префаб спрута.

Внимание: Лучше всего поработать непосредственно с префабом. При этом каждый экземпляр врага, участвующий в сцене, будет модифицирован так, чтобы отражать префаб. В данном случае это особенно важно, потому что в нашей сцене будет много врагов. Если вы сосредоточили усилия на экземпляр игрового объекта вместо префаба, не волнуйтесь: нажав на кнопку "Применить" сверху вкладки "Инспектор", вы добавите эти изменения и в префаб.

Убедитесь, что выстрел и спрут находятся на одной линии, чтобы проверить столкновение. Напоминаю, что 2D движок ничего не знает про ось Z, поэтому ваши 2D коллайдеры всегда будут в той же плоскости. А теперь, запустите нашу сцену. Вы должны увидеть следующее:

Здоровье врага превосходит урон от выстрела, поэтому он выживет. Попробуйте изменить значение hp в "HealthScript" врага:

Стрельба

Удалите выстрел из сцены. Теперь, когда мы с ним закончили, ему нечего там делать. Нам нужен новый скрипт для стрельбы. Создайте его под именем "WeaponScript". Этот скрипт мы будем использовать везде (игроки, враги и т.д.) Его цель заключается в to instantiate снаряда перед игровым объектом, к которому он привязан. Вот полный код, больше, чем обычно. Объяснения ниже:

Прикрепите этот скрипт к игроку. Скрипт делится на три части:

Переменные во вкладке "Inspector"

Здесь у нас есть два члена: shotPrefab и shootingRate .

Первый необходим для установки выстрела, который будет использоваться с этим оружием.

Выберите игрока в сцене "Hierarchy". В компоненте "WeaponScript", вы можете увидеть свойство "Shot Prefab" со значением "None". Перетащите префаб "Shot" на это место:

Использование префаба

Unity автоматически дополнит скрипт это информацией. Удобно, не так ли?

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

Будьте осторожны: изменение значения переменной во вкладке "Инспектор" в Unity не приводит к сохранению этих значений в скрипте. Если добавите этот скрипт в другой объект, значение по умолчанию будет таким, которое написано в скрипте. Если же вы хотите сохранить отредактированные параметры, вы должны открыть свой редактор кода и записать эти значения там.

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

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

3. Публичный метод создания атаки

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

Создав екземпляр снаряда, мы извлекаем скрипты объекта выстрела и оверрайдим некоторые переменные.

Внимание: С помощью метода GetComponent () можно создать точный компонент (а значит, и скрипт, потому что скрипт – тоже компонент) объекта. Используйте generic ( ) для обозначения конкретного компонента, который вам нужен.
Кроме того, у нас есть GetComponents () , вызывающий список вместо первого и т.д.

Использование оружия с классом игрока

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

В самом деле, если "WeaponScript" был бы привязан к классу, мы никогда не смогли бы использовать метод Attack(bool) .

Давайте вернемся к нашему "PlayerScript".

В функции Update() добавьте этот кусочек кода:

На данном этапе неважно, поставите вы его перед или после движения.

  1. Мы определяем нажатие кнопки стрельбы ( click или ctrl по умолчанию).
  2. Извлекаем скрипт объекта.
  3. Мы запускаем Attack(false) .

Button down: Вы уже наверняка заметили, что мы используем метод GetButtonDown() для обеспечения ввода. "Down" в конце позволяет нам ввести данные при нажании кнопки и только один раз. GetButton() будет выводить true в каждом кадре, пока гирок не отпустит кнопку. В нашем случае нам явно необходимо поведение, обеспечиваемое методом GetButtonDown() . Попробуйте использовать GetButton() и почувствуйте разницу.

Запустите игру с помощью кнопки "Play". Вот что вы должны получить:

Пули летят слишком медленно? Поэкспериментируйте с префабом "Shot" чтобы выбрать ортимальное значение. Попробуйте также добавить вращение игроку: (0, 0, 45) . Пули двигаються под углом 45 градусов, даже если вращение спрайта выстрела является некорректным – а ведь мы его не изменили.

Shooting rotation

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

Вражеский снаряд

Мы создадим новый снаряд с помощью этого спрайта:

Вражеский снаряд

Если вы так же ленивы, как я, продублируйте префаб "PlayerShot", переименуйте его в "EnemyShot1" и измените спрайт, как описано выше.

Для дублирования создайте экземпляр, перетащив его на сцену, переименовав созданный игровой объект и, наконец, сохранив его как `Prefab’.

Или можно просто продублировать Prefab напрямую внутри папки с помощью ярлыков cmd+D (OS X) или ctrl+D (для Windows).
Если вы не выбираете легких путей, вы можете создать новый спрайт с параметром rigibody, коллайдером с триггером и т.д.

Правильный масштаб - (0.35, 0.35, 1) .

Вот, что у вас должно получиться.

настойки для вражеского снаряда

При нажатии "Play" произойдет выстрел, который потенциально может уничтожить врага. Это из-за свойств "ShotScript" (которые по умолчанию плохо совместимы с Poulpi).

Не изменяйте ничего. Помните наш "WeaponScript"? Он то и установит правильные значения.

У нас есть префаб "EnemyShot1". Удалите экземпляры со сцены, если они есть.

Также, как мы делали для игрока, также нам нужно добавить оружие и врагу, а потом вызывать Attack() чтобы выстрелить. Вот, что нам надо сделать:

  1. Добавьте "WeaponScript" врагу.
  2. Перетащите префаб "EnemyShot1" в переменную "Shot Prefab" скрипта.
  3. Создайте новый скрипт под названием "EnemyScript". Он просто будет запускать стрельбу в каждом кадре. Что-то вроде автострельбы.

Прикрепите этот скрипт к осьминогу. У вас должно получиться следующее (заметьте, что частота стрельбы немного звеличилась до 0.75 ):

Настойка осьминога с оружием

Замечание: Если вы модифицируете игровой объект в сцене, не забудьте сохранить все изменения в префабе , использовав кнопку "Применить" справа сверху от панели "Инспектор".

Попробуйте сыграть и посмотреть!

Итак, мы сделали то, что хотели и теперь и по нам тоже стреляют.

Если повернуть врага, вы можете сделать его стреляющим в его слева, но, хм. спрайт повернулся вверх ногами, а нам это не нужно.

Перевернутый спрут

Давайте исправим это недоразумение.

Стрельба в любом направлении.

"WeaponScript" был написан особым образом: вы можете выбрать направление стрельбы, просто вращая прикрепленный игровой объект. Мы уже видели это раньше, когда вращали спрайт врага. Суть в том, чтобы создать пустой игровой объект как ребенка префаба врага. Итак, нам нужно:

  1. Создать пустой игровой объект. Назовем его "WeaponObject".
  2. Удалим "WeaponScript", прикрепленный к префабу врага.
  3. Добавим "WeaponScript" к "WeaponObject" и установить свойства префба выстрела как мы это делали раньше.
  4. Повернем "WeaponObject" вот так (0, 0, 180) .

Если вы проделали это все на игровом объекте, а не на префабе, то не забудьте нажать на кнопку "Применить" для сохранения изменений. Вот, что у нас получилось:

Enemy with a new object

However, we have a small change to make on the "EnemyScript" script.

В своем нынешнем состоянии вызов GetComponent () в "EnemyScript" возвращает null. В самом деле, "WeaponScript" больше не привязан к одному объекту игры.

К счастью, в Unity также доступен метод, использующий детскую иерархию игрового объекта, который называется GetComponentInChildren () .

Для GetComponent<>() , GetComponentInChildren<>() также существует в форме множественного числа: GetComponentsInChildren () . Обратите внимание на s после "Component". Этот метод возвращает список вместо первого соответствующего компонента.

На самом деле, просто для удовольствия, мы также добавили возможность управления несколькими видами оружия. Мы просто манипулируем списком вместо одного экземпляра компонента. Взгляните на весь "EnemyScript":

Наконец, нужно обновить скорость выстрела путем настройки публичной пременной "MoveScript" из префаба "EnemyShot1". Скорость выстрела должна быть больше скорости движения спрута:

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

Стрельба а двух направлениях

Эта задача реализуеся всего в пару кликов. Для этого не нужны никакие скрипты:

  1. Добавьте другое оружие врагу (дублируя первый "WeaponObject").
  2. Измените угол поворота второго "WeaponObject".

Враг должен сейчас стрелять в двух направлениях. Возможный результат:

Это хороший пример правильной работы в Unity: создавая независимые скрипты вроде этого и делая публичными некоторые полезные переменные, можно значительно уменшить количество кода. Меньше кода - меньше ошибок.

Нанесение урона игроку

Наши осьминоги внушают ужас? Как бы не так! Да, они могут стрелять, но это не наносит повреждения игроку. Может, у них холостые патроны? Давайте разбираться.

Просто добавьте "HealthScript" на игрока. Убедитесь, что сняли галку с поля "IsEnemy".

Конфигурация скрипта, отвечающего за здоровье игрока

Запустите игру и почувствуйте разницу:

Бонус

Вот вам некоторые советы для улучшения аспекта стрельбы в вашей будущей игре. Вы можете пропустить эту часть, если вас не интересуют подробности, относящиеся к жанру шмапа.

Солкновения игрока с врагом

Давайте посмотрим, как мы можем обработать столкновения между игроком и врагом, поскольку сейчас они сталкиваются друг с другом без последствий. Столкновение - это результат пересечения двух не-триггерных 2D коллайдеров. Нам просто нужно обрабатывать событие OnCollisionEnter2D в PlayerScript :

При столкновении мы наносим урон как врагу, так и игроку благодаря наличию компонента HealthScript . К нему привязано все, что относится к здоровью/урону.

Массив снарядов

Когда вы играете, вы можете наблюдать ва вкладке "Иерархия" (Hierarchy), что игровые объекты создаются и удаляются только через 20 секунд (если они не сталкиваются с игроком или врагом).

Если ваша цель создание огневой завесы для которой требуется МНОГО пуль, эта техника вряд ли подойдет.

Один из способов увеличить количество пуль – использовать массив. По сути, это набор пуль ограниченного размера. Когда массив заполнен, удалите старый объект и замените его на новый.

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

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

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

Поведение пули

В хорошем шутере должны быть запоминающиеся боевые сцены.

Некоторые библиотеки вроде BulletML значительно упрощают определение сложных и зрелищных bullet patterns.

BulletML для Unity

Если вы хотите сделать полную версию игры в жанре Shoot'Em Up, ознакомьтесь с нашим плагином BulletML for Unity

Задержка выстрела

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

Можно просто добавить в оружие задержку: поставьте охлаждение на любое значение выше 0. Вы можете использовать алгоритм или просто поставить случайную цифру.

Скорость врагов также может определяться случайной величиной.

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

В следующем уроке

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

Результат

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

Читайте также: