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

Обновлено: 03.07.2024

Здравствуйте! В этой статье мы научимся добавлять врагов в наш платформер и узнаем про Коротины ( Coroutines ).

Для начала надо придумать врага . Т.к. у меня в Спрайтах была лягушка , то она им и будет. Как обычно, переносим на Сцену , добавляем RigidBody 2D и Collider'ы 2D :

Как и положено лягушке, мы заставим её прыгать . Только через циклы while или for не получится, потому что он не учитывает время . Именно для этого нам и понадобятся Коротины , но я зашел немного далеко.

Цепляем к Лягушке Аниматор и добавляем анимацию ( смотрите прошлые уроки ).

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

1 ответ 1

На объект "противник" нужно добавить RigidBody2D. Обязательно нужно указать ненулевое значение параметра Drag, например 1, чтобы после "отскока" противник не начал бесконечно улетать.

В скрипт противника нужно добавить следующий код:

После этого в том участке кода, в котором у противника отнимаются жизни нужно вызвать функцию, примерно так:

Похожие

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2022 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2022.1.28.41306

Во второй части уроков, посвященных созданию игры Tower Defense в Unity вам предстоит добавить в локацию нескольких стреляющих монстров.

TowerDefense-feature

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

Введение

Находясь в Unity откройте законченный проект из первой части этого учебного цикла или, если вы только что присоединились, загрузите начальный проект тут и откройте файл TowerDefense-Part2-Starter. Далее откройте GameScene из папки Scenes.

Траектория врагов

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

  1. RotateIntoMoveDirection определяет положение противника таким образом, чтобы он всегда смотрел вперед, вот таким образом:
  2. Вычисляется текущее направление движения, вычитая позицию текущей путевой точки из позиции следующей путевой точки.
  3. Используется Mathf.Atan2 для определения угла, на который указывает newDirection, используя нулевые точки отправления. Умножение результата на 180/Mathf.PI преобразует угол в градусы.
  4. Извлекается дочерний элемент Sprite и поворачивает его на несколько градусов по оси Z. Обратите внимание, что вы поворачиваете дочерний элемент вместо родительского, поэтому индикатор работоспособности, который вы скоро добавите, остается горизонтальным.

В Update () замените комментарий /TODO: Rotate into move direction на RotateIntoMoveDirection:

Сохраните файл и переключившись на Unity запустите сцену. Теперь ваш монстр точно знает, куда он идет:

Вам не нравится, что сейчас существует всего один единственный враг и он не впечатляет своей мощностью? Тогда приступайте к созданию целых волн разнообразных монстров, как бывает во всех в классических играх Tower Defense.

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

Некоторым объектам GameObject требуется волновая информация, поэтому вам нужно добавить ее в компонент GameManagerBehavior в GameManager.

Откройте GameManagerBehavior.cs в вашей IDE и добавьте эти две переменные:

WaveLabel будет хранить ссылку на значение волны в верхнем правом углу экрана. nextWaveLabels сохранит два объекта GameObject, которые при объединении создают анимацию, которая будет отображаться в начале новой волны, как показано ниже:

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

Теперь установите значение Size of Next Wave Labels равным 2. Затем присвойте элементу 0 значение NextWaveBottomLabel, а элементу 1 значение NextWaveTopLabel.


В gameOver вы будете хранить информацию о том, проиграл ли игрок.

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

Таким образом вы добавляете в волну новое значение.

Затем вы проверяете, что игра не окончена. Если это так, вы перебираете все метки в nextWaveLabels — эти метки имеют компонент Animator. Для запуска анимации в Animator вам нужно установить триггер nextWave. Наконец, вы устанавливаете текст waveLabel в значение wave + 1.

В Start () установите значение этого свойства:

Вы начинаете считать с волны номер 0.

Сохраните файл, затем запустите сцену в Unity. Смотрите, отсчет атак начинается с 1, как и должно быть:


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

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

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

Создание Enemy Tag


Создайте тег с именем Enemy.


Снова выберите префаб Enemy и установите для него соответствующий тег в окне Inspector.

Определение вражеских волн

Теперь вам нужно определить волну врагов. Откройте Spawn Enemy.cs в вашей IDE и добавьте следующее значение перед Spawn Enemy:

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

Этот класс называется Serializable, что означает, что вы можете изменять его значения в Инспекторе.

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

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

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

Замените содержимое Start () следующим кодом:

Здесь вы устанавливаете lastSpawnTime на текущее время, сразу после загрузки сцены. Затем вы извлекаете GameManagerBehavior привычным способом.

Добавьте эти строки в Update ():

Вот что означает каждый шаг:

  1. Определяется индекс текущей волны и идет проверка, является ли она последней.
  2. Если это так, идет подсчет, сколько времени прошло с момента появления последнего врага и не пора ли появиться новому. Здесь может быть несколько вариантов. Если это первый враг в волне, проверяется, больше ли timeInterval, чем timeBetweenWaves. В противном случае проверяется, больше ли timeInterval, чем spawnInterval этой волны.
  3. Если необходимо, создается новый экземпляр вражеского префаба. Также увеличивается количество появившихся врагов.
  4. Идет проверка количество врагов на экране. Если их нет, и это был последний враг, то запускается следующая волна. Также игрок получает золото в виде награды за успешное прохождение уровня.
  5. После уничтожения последней волной врагов в игре запускается анимация победы.

Определение интервалов появления

Сохраните файл, переключитесь на Unity и выберите Road в Hierarchy. В Inspector установите Size of Waves = 4.

На данный момент вам нужно установить Enemy Prefab на Enemy для всех четырех элементов. Настройте поля Spawn Interval и Max Enemies следующим образом:

Элемент 0: Интервал появления: 2.5, макс. враги: 5

Элемент 1: Интервал появления: 2, макс. враги: 10

Элемент 2: Интервал появления: 2, макс. враги: 15

Элемент 3: Интервал появления: 1, максимальное количество врагов: 5

Окончательная настройка должна выглядеть как на скриншоте ниже:


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

Добавление разных врагов

Выберите Prefabs ⇒ Enemy2 в Inspector и добавьте в него скрипт MoveEnemy. Установите его скорость на 3, а его метку на врага.

Индикатор здоровья игрока

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


Откройте GameManagerBehavior.cs в вашей IDE и добавьте две переменные:

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

Управление индикатором здоровья

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

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

  1. Если уменьшается здоровье игрока, используется компонент CameraShake, для создания эффекта дрожания.
  2. Обновляются переменные и значение здоровья в верхнем левом углу экрана.
  3. Если здоровье падает до 0, и игра еще не закончена, для gameOver устанавливается значение true и запускается анимация GameOver.
  4. Удаляется один из монстров на базе.

Инициализируйте здоровье в Start ():

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

Используя это свойство, вы можете обновлять здоровье игрока каждый раз, когда ошибка достигает cookie. Сохраните этот файл и затем переключитесь на MoveEnemy.cs в IDE.

Обновление параметров здоровья

Чтобы обновить здоровье игрока, найдите в Update () строчку // TODO: deduct health и замените ее следующим кодом:

Таким образом будет получена информация о GameManagerBehavior и произойдут изменения индикатора здоровья. После этого сохраните файл и переключитесь на Unity.

Выберите GameManager в Hierarchy и установите для HealthIndicator значение HealthLabel. Разверните Cookie в Cookie и перетащите HealthIndicator в массив HealthLabel в GameManager.

Попробуйте запустить игру и подождите, пока жуки доберутся до печенья. Ничего не делайте, пока не проиграете.

Атака монстров

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

  • Создать панель здоровья, чтобы игрок знал, какие враги сильные и слабые
  • Настроить обнаружение врагов в радиусе действия монстра
  • Определить в какого врага стрелять нужно
  • Создать патроны

Здоровье врагов

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

Перетащите Prefabs\Enemy в сцену из Project Browser. Затем перетащите Images ⇒ Objects ⇒ HealthBarBackground на Enemy в Hierarchy, чтобы добавить его в качестве дочернего элемента. В окне Inspector установите координаты Position для HealthBarBackground на (0, 1, -4).

Снова выберите в Hierarchy значение Enemy и убедитесь, что его координаты находятся в (20, 0, 0). Нажмите Apply в верхней части окна Inspector, чтобы сохранить все ваши изменения как часть префаба. Теперь вы можете удалить Enemy из Hierarchy.


Повторите эти шаги, чтобы самостоятельно добавить панель здоровья в Prefabs\Enemy2.

Настройка длинны панели здоровья

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

maxHealth отображает максимальные очки здоровья противника, а currentHealth отслеживает, сколько здоровья осталось, originalScale хрант информацию об исходном размере панели здоровья.

Сохраните originalScale объекта в Start ():

Теперь вы сохранили значение X localScale.

Установите шкалу здоровья, добавив в Update () следующее:

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

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


Во время игры разверните один из объектов Enemy (Clone) в окне Hierarchy и выберите его дочерний элемент HealthBar. Измените значение Current Health и проверьте, изменяется ли при этом шкала здоровья.

Отслеживать врагов в радиусе обзора

Теперь ваши монстры должны знать, на каких врагов они должны нападать. Выберите Prefabs\Monster в Project Browser и добавьте в окне Inspector новый 2D-компонент Circle Collider. Установите значение Radius = 2,5 — это определит дальность стрельбы монстров.

Также не забудьте активировать Trigger, чтобы жуки проходили через область, а не врезались в нее. Сверху окна Inspector, установите Monster‘s Layer в положение Ignore Raycast. И нажмите Yes, изменив дочерние элементы в диалоговом окне.


В Project Browser выберите Prefabs\Enemy и добавьте новый двухмерный компонент Rigidbody установив Body Type на Kinematic. Теперь добавьте Circle Collider 2D со значением Radius = 1. Повторите эти действия для Prefabs\Enemy 2.

Откройте EnemyDestructionDelegate.cs в IDE и добавьте следующие данные:

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

Уничтожение врагов

Откройте ShootEnemies.cs в IDE и добавьте следующую строчку:

Добавьте переменную, чтобы отслеживать всех врагов в пределах диапазона:

Инициализируйте данное поле в Start ():

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

Добавьте этот код в скрипт:

В OnEnemyDestroy происходит удаление врага, который находится в диапазоне ваших юнитов. Когда враг ходит по курку вокруг вашего монстра, вызывается OnTriggerEnter2D.

Затем вражеский юнит добавляется в список врагов InRange и OnEnemyDestroy помещается в EnemyDestructionDelegate.

В OnTriggerExit2D враг удаляется из списка объектов.

Сохраните файл и запустите игру в Unity. Чтобы проверить, вступили ли в силу внесенные вами изменения посмотрите уничтожат ли ваши юниты врага.

Определение цели

Откройте MoveEnemy.cs в IDE и добавьте следующий метод:

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

Вооружение дружественных юнитов

Добавьте следующий код в Update () для управления траекторией полета пули:

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

Использование больших пуль

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

Теперь вам нужно определит, какой урон наносят пули в режиме Bullet Behavior. Выберите префаб Bullet1 на вкладке Project. и установите 10 урона для Bullet1, 15 для Bullet2 и 20 для Bullet3.


Назначение каждого вида пуль

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

Откройте MonsterData.cs в IDE и добавьте эти переменные в MonsterLevel:

Уровни монстров должны быть настроены, как показано на изображении ниже:


Открытый огонь

Откройте ShootEnemies.cs в IDE и добавьте несколько переменных:

Присвойте значения этим полям в Start ():

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

Соединение действий

Время связать все вместе. Определите цель и заставьте своего монстра наблюдать за ней.


Теперь в ShootEnemies.cs, добавьте код в разделе Update ():

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

Что делать дальше?

Вы можете скачать готовый проект здесь.

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

В этом интервью вы можете найти интересные идеи о том, как сделать игру Tower Defense еще интереснее.

Поведение врагов в 2D играх. Конструктор разработчика

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

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

Помните также, что их размещение и то, как враги влияют на ход и атаку игрока, тоже имеет значение. Поиграйте, например, в Super Mario Bros Crossover, чтобы увидеть, как противник может вести себя иначе, если персонаж игрока перемещается и атакует по-разному.

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

как придумать врага для игры

Отличный дизайн и размещение врага на примере ретро-игры

Поведение врага – Состояния и триггеры

Поведение врага можно охарактеризовать тремя основными пунктами:

  • Движение – как враги двигаются
  • Качества – их сущность
  • Возможности – что они делают

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

Ниже вы найдете списки атрибутов для каждой из категорий. Противник получается интереснее, если смешивать и соединять атрибуты в уникальные состояния, а затем дальше углублять их с помощью ряда триггеров. Самые распространенные враги имеют не более двух состояний с одним триггером, но Боссы отличается тем, что часто имеют четыре и более состояний с множеством триггеров. С такими боссами тяжело бороться (см. например Axiom Verge).

Списки очень подробные и описывают поведение почти всех врагов, которых можно найти в ретро-играх. С ними вы можете создать любого врага для любой игры с видом сверху или сбоку, которую только сможете вообразить. Тем не менее, если вы можете что-то добавить к спискам (особенно идеи триггеров), оставьте комментарий!

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

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

Движение

Stationary (неподвижный) – враг вообще не двигается.

Walker (пешеход) – враг ходит или бежит по земле. Пример: Гумба в Супер Марио.

Riser (растишка) – враг может увеличиться в высоту (часто, может расти из ниоткуда). Примеры: цветы-пираньи из Super Mario и грязевой человек из Castlevania.

Ducker (ныряльщик) – враг может уменьшиться в высоту (в том числе, уходя в пол). Пример: цветы-пираньи из Super Mario.

Faller (падающий) – враг падает с потолка на землю. Обычно эти враги – капли кислоты или слизи.

Jumper (прыгун) – враг может прыгать или отскакивать от поверхности. Некоторые прыгают вперед, некоторые вверх-вниз. Примеры: пружины в Donkey Kong, Tweeter в Super Mario 2, Ninji в Super Mario 2.

Floater (летун) – враг может плавать, летать или левитировать. Пример: летучие мыши в Castlevania.

Sticky (клейкий) – враг приклеивается к стенам и потолку. Спарк из Super Mario 2.

Waver (волновик) – враг движется по синусоидальной кривой. Пример: голова медузы из Castlevania.

Rotator (вращатель) – враг вращается вокруг неподвижной точки. Иногда фиксированная точка перемещается или может перемещаться в соответствии с любым другим атрибутом движения в этом списке. Кроме того, направление вращения может измениться. Пример: Rotodisc Super Mario 3, реактивные снаряды из Batman от Sunsoft (обратите внимание, что центром их вращения является игрок).

Swinger (раскачивающийся) – враг качается у неподвижной точки. Пример: махающие ножи из Castlevania.

Pacer (шагающий туда-сюда) – враг меняет направление движения в ответ на триггер (например, доходит до края платформы). Пример: Красный Купа в Super Mario.

Follower (преследователь) – враг следует за игроком (часто используется в играх с видом сверху). Пример: жучки из Zelda 3.

Roamer (бродяга) – враг меняет направлении движения на случайной основе. Пример: Октороки из Legend of Zelda.

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

Teleporter (телепортер) – враг может телепортироваться из одного места в другое. Пример: Визробы из Zelda.

Dasher (двигающийся с ускорением) – в определенном направлении враг движется со скоростью больше, чем его нормальная. Пример: змеи-веревки из Zelda.

Ponger (прыгун) – враг отскакивает от стен по прямой линии, вопреки законам физики. Пример: пузыри из Zelda 2.

Geobound (геометрический) – враг физически привязан к геометрии уровня, иногда проявляется как геометрия уровня. Примеры: спайки из Megaman, цветы-пираньи из Super Mario, белый дракон из Castlevania.

Tethered (привязанный) – враг привязан к геометрии уровня цепью или веревкой. Пример: Чейн-чомпы из Super Mario.

Swooper (налетчик) – парящий враг, который налетает, часто (но не всегда) возвращаясь в исходное положение). Пример: Летучие мыши в Castlevania, свуперы в Super Mario, злобное солнце в Super Mario 3.

Mirror (зеркальный) – враг подражает движениям игрока. Иногда враг движется в противоположном по отношению к игроку направлении. Пример: Гории из Zelda 3.

Качества

GeoIgnore (игнорирование) – враг игнорирует особенности геометрии уровня и может проходить сквозь твердые преграды. Примеры: ротодиск из Super Mario 3, различные летающие существа.

GeoDestroyer (разрушение – враг может уничтожить блоки геометрии уровня. Примеры: Боузер в Super Mario 3, Бо-бомб.

Shielder (защита) – атаки игрока не защитываются при ударе с определенного направления или угла, или если они попадают в определенное место на враге. Пример: рыцари из Zelda 2.

Reflector (отражение) – отражает попавшие в него атаки дальнего боя.

Damager (повреждение) – игрок получает повреждения при столкновении с ним. Самое распространенное качество.

Redamager (обратный удар) – игрок сам получает урон при ударе во врага. Пример: электрическая слизь (buzz blob) в Zelda: Link to the Past.

Invulnerable (неуязвимость) – врага нельзя убить или нанести ему ущерб. Примеры: в основном элементы геометрии уровня (шипы, падающие блоки, огонь), но также и существа наподобие Братьев Бу в Super Mario 3.

Reanimator (реанимация или воскресение) – враг оживает после смерти. Примеры: скелеты в Castlevania и Super Mario.

Regenerator (регенерация) – здоровье врага с течением времени восстанавливается.

Secret Weakness (секретная уязвимость) – враг уязвим по отношению к определенному типу атак (огонь, магия, стрелы и т.д.) Пример: ящер Додонго в Zelda (уязвим для бомб).
Hard to Hit (трудно попасть) – в этих противников очень сложно попасть в обычных диапазонах атаки игрока. Они часто бывают очень быстрыми или очень маленькими. Пример: шипастая слизь Мью в Zelda 2.

Segmented (сегментирование) – эти враги составлены из небольших отдельных предметов или существ. Каждый отдельный сегмент часто может быть уничтожен независимо, враги как правило (но не всегда) напоминают змею. Пример: Манхандла в Zelda, кактус Покей в Super Mario.

Bumper (отталкивание) – эти враги действуют по принципу бамперов в пинболе, быстро отталкивая игрока (или другие объекты). Пример: жучки из Zelda 3.

GeoMimic (подражание) – враги обладают свойствами геометрии уровня. Чаще всего это означает, что игрок может стоять на них. Примеры: большинство врагов в Mario 2, сигма в Megaman X, бык Катоблепас в Castlevania.

Alarm (сигнализация) – враг или объект, который заставляет реагировать другого противника или объект.

Meta-vulnerable (мета-уязвимость) – врага можно победить с помощью действий, выходящих за рамки обычного игрового процесса: поменяв настройки в игре, купив оружие в приложении, рассказав про игру в социальной сети, играя в положении вверх ногами с акселерометром/компасом, играя в хорошо освещенной комнате, создавая шум в микрофон и т.д. Пример: заключенный Вполголос (Pol’s Voice) в японской версии Zelda.

Враги из серии игр Марио

Враги из серии игр Марио

Возможности

Melee Attack (атака ближнего боя) – враг атакует в непосредственной близости от героя.

Thrower (бросок) – враг может бросаться чем-либо (предметами, игроком, другим врагом). Часто, но не обязательно, сочетается с возможностью Носильщика. Примеры: скелеты, которые кидают бочки в Castlevania, Жук Бастера в Super Mario 3.

Grower (увеличение) – враг может расти в размерах.

Shrinker (уменьшение) – враг может уменьшаться в размерах.

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

Splitter (раскалывание на части) – враг может разбиться на несколько других врагов, при этом уничтожив себя. Примеры: слизь в Rogue Legacy, Вире и Бири в Legend of Zelda.

Cloner (клонирование) – враг может создать копию себя. Чаще всего копия является точной, но иногда добавляются небольшие изменения (меньше здоровья, выше скорость и т.д.). Главный враг не разрушается при клонировании. Пример: Гини в Zelda.

Morpher (морфинг) – враг превращается во врага другого типа. Иногда это временно, а иногда он превращается в нескольких врагов другого типа.

Sapper (истощение сил) – враг может привести к изменению статистики игрока (уменьшение скорости, уменьшение высоты или невозможность прыжка, невозможность атаки и т. д.). Эти эффекты могут быть как постоянными, так и временными.

Latcher (запирание способностей) – враг также может изменить статистику игрока и его способности, но делает это только привязавшись к игроку. Пример: мини-гумбы в Mario 3, Лайк Лайки в Zelda.

Hider (прятание) – враг может скрыться от игрока. Как правило, враг скрыт до тех пор, пока игрок не окажется на заданном расстоянии или наоборот, противник скрывается, когда игрок приближается. Пример: цветы-пираньи в Mario.

Exploder (взрыв) – враг может уничтожить себя и нанести повреждения за счет взрыва. Пример: мины во многих играх, Бо-бомбы в Mario.

Interactor (влияние) – враг может взаимодействовать с такими объектами, как рычаги или кнопки.

Charger (задержка атаки) – перед тем, как переключиться на другой вид поведения, враги ненадолго останавливаются. Пример: волки в Castlevania (останавливаются перед тм, как броситься на игрока).

Meta-Manipulator (мета-манипуляции) – враг может изменять свойства элементов окружения, игры и присущие герою качества. К таким мета-объектам относятся, например, время дня, погода, пол игрока, возможность сохранять файлы, изменять режимы игры.

Триггеры

Random (случайный) – враг случайным образом переключается в новое состояние.

Timed (время) – враг переключится в новое состояние через определенный промежуток времени.

Time Cycle (суточный ритм) – враг переключает состояния в зависимости от времени суток. Например, спит ночью, активен в течение дня.

Distance Traveled (пройденное расстояние) – враг прошел определенное расстояние.

Proximity (расстояние) – враг находится на определенном расстоянии от другого объекта, обычно игрока, но это может также быть другой враг, объект на уровне или снаряд.

Post-Ability (последующее действие) – враг только что совершил действие, например, враг стреляет в базуку, затем скрывается за элементами геометрии уровня.

Occupies Volume (занимает объем) – враг переместился в определенный объем пространства. Это может быть зона воды или же невидимое глазом пространство, обозначающее границы города.

Stat Value (значение статистики) – враг меняет поведение в зависимости от значений своей статистики или статистики игрока. Пример: здоровье врага падает ниже 10%, и он взрывается; игрок имеет более 500% очков магии, и враг старается высосать их.

Scripted Event (событие в скрипте) – запрограммированное событие заставляет врага изменить поведение.

Someone Else (кто-то еще) – триггер срабатывает из-за действий другого врага. Пример: Здоровье одного из врагов падает ниже 20%, поэтому на персонажа набрасываются другие враги.

Death (смерть) – здоровье врага истощено до 0% или он умирает каким-то еще путем.

Переменные поведения врага

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

  • Скорость движения
  • Высота прыжка
  • Длина и амплитуда у синусоиды прыжка
  • Диапазон атаки
  • Радиус повреждения при взрыве
  • Размер врага
  • Расстояние преследования героя
  • ..и так далее

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

Повеселитесь!

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

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

Хорошая статья. Месяц назад читал в оригинале. Помогает, когда идеи вот прям закончились :)

Если не секрет, каких интересных врагов удалось получить?)

Я использовал статью косвенно, мне нужны были, да и сейчас нужны, идеи ловушек для 2D пространства. Не помню на какие конкретно ловушки натолкнула статья, но с того момента появились: ловушка-пила, которая перемещается по полу от стены к стене; настенный стреломёт, с ограниченным кол-вом стрел; живой кактус, который неподвижен и может стрелять только в спину врага.

Стреломет звучит интересно, он становится “ступенькой” на стене после того, как расстреляет все стрелы?

Не совсем, проще, он крепится на стену. Ваша идея крутая, нужно записать :)
В игре есть гости, которых нужно прогонять ловушками, ходят они примитивно по полу из комнаты в комнату.
Я бы показал гифкой, но не в курсе можно ли тут вставлять ссылки )

Вы вроде где-то писали геймплейно что из себя будет представлять игра, может в комментариях к другой статье? не могу найти. Но если бы был платформер, я бы сделал чуть выпирающие плитки внизу (кнопки), на полу, и когда игрок наступает на них – стреломёт производит выстрел, может с какой-то задержкой.

Арт симпатичный) Сами рисуете? Геймплейно не очень понял зачем мебель расставлять, почему не генерировать комнаты уже с мебелью на уровнях, а расставлять только ловушки..

Это в повествование на видео косячок. На обычных уровнях игрок расставляет только ловушки и взаимодействует с предустановленными механизмами.
Отдельно у игрока есть убежище, где он за золото может обустраивать дом. Декорации для убежища открываются за звёзды (получаемые за уровни). Декорации дают очки роскоши, которые открывают спец уровни.
За арт спасибо :) Первый этап (5 уровней) жена рисовала. Остальное уже рисовал я, а она была консультантом :)

Жена – художница, муж – программист, это же можно студию сделать :) Семья геймз

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

Хотел отписаться там, но что-то не приходит письмо с подтверждением :(

Грустно, в спаме точно нет? Бесплатный почтовый сервер с движком сайта видимо не всегда хорошо работает. А какой логин или почту искать, может я руками активирую?

Получилось только установить какой-то и я послал его на почту) Надеюсь получиться залогиниться и обсудить врагов! :)

Суховато же, годится далеко не всюду. Если сильно доработать, то можно получить что-то вроде “списка всех возможных сценариев”, сценаристы поймут. Но сервис интересный)

А что за список всевозможных сценариев? Любопытно – расскажите пожалуйста)



using UnityEngine;
using System.Collections;

public class EnemyAI : MonoBehaviour <
public Transform target;
public int moveSpeed;
public int rotationSpeed;
public int maxdistance;

private Transform myTransform;

void Awake() <
myTransform = transform;
>

void Start () <
GameObject go = GameObject.FindGameObjectWithTag("Player");

maxdistance = 2; // устанавливай дистанцию
>


void Update () <
Debug.DrawLine(target.position, myTransform.position, Color.red);


myTransform****tation = Quaternion.Slerp(myTransform****tation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed * Time.deltaTime);

if(Vector3.Distance(target.position, myTransform.position) > maxdistance) <
//Move towards target
myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;

using UnityEngine;
using System.Collections;

public class EnemyAttack : MonoBehaviour <
public GameObject target;
public float attackTime;
public float coolDown;


void Start () <
attackTime = 0;
coolDown = 2.0f;


void Update () <
if(attackTime > 0)
attackTime -= Time.deltaTime;

if(attackTime 0) <
PlayerHealth eh = (PlayerHealth)target.GetComponent("PlayerHealth");
eh.AddjustCurrentHealth(-10);
>
>
>
>

using UnityEngine;
using System.Collections;

public class EnemyAI : MonoBehaviour <
public Transform target;
public int moveSpeed;
public int rotationSpeed;
public int maxdistance;

private Transform myTransform;

void Awake() <
myTransform = transform;
>

void Start () <
GameObject go = GameObject.FindGameObjectWithTag("Player");

maxdistance = 2; // устанавливай дистанцию
>


void Update () <
Debug.DrawLine(target.position, myTransform.position, Color.red);


myTransform****tation = Quaternion.Slerp(myTransform****tation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed * Time.deltaTime);

if(Vector3.Distance(target.position, myTransform.position) > maxdistance) <
//Move towards target
myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;

using UnityEngine;
using System.Collections;

public class EnemyAttack : MonoBehaviour <
public GameObject target;
public float attackTime;
public float coolDown;


void Start () <
attackTime = 0;
coolDown = 2.0f;


void Update () <
if(attackTime > 0)
attackTime -= Time.deltaTime;

if(attackTime 0) <
PlayerHealth eh = (PlayerHealth)target.GetComponent("PlayerHealth");
eh.AddjustCurrentHealth(-10);
>
>
>
>


вот я тебе дал этот геморой. Пытайся, объяснять не буду Автор - thiefbrother
Дата добавления - 31 Янв 2013 в 19:01

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