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

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

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

Затем мы вызываем DodgeMovement в переопределенном методе CalulateMovement, если враг не мертв.

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

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

Этот метод удаляет Лазер из Списка и указывает Врагу в следующем направлении уклоняться, если в Списке больше элементов, или прекращает уклоняться, если Список пуст.

Скрипт, который обнаружит Лазер, так же, как детектор Power-Up для Игрока, будет дочерним элементом Врага. Поскольку враг использует OnTriggerEnter, дочернему лазерному детектору потребуется Rigidbody для обработки столкновений. Если мы не дадим ребенку один, он будет рассматривать коллайдер как часть жесткого тела врага и считать лазер попаданием по врагу.

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

В Start нам нужно получить ссылку на скрипт DodgingEnemy родителя и проверить его на null.

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

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

Здесь вы можете увидеть лазерный детектор как дочерний элемент префаба Dodging Enemy.

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