Skip to content
This repository was archived by the owner on Aug 22, 2024. It is now read-only.

MorgoWizard/test-1c

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

45 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Логика персонажа

  1. Персонаж находится в нижней части экрана, игрок осуществляет управление персонажем клавишами WASD;

Для реализации использовался package Input System, с его помощью можно в принципе настроить гибкое управление под любую платформу За само передвижение отвечает script CharacterMovement

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

В том же CharacterMovement можно управлять областью через Inspector. Область строится относительно границ экрана устройства

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

Логика обнаружения и выбора ближайшего противника в качестве цели находится в CharacterAttack. Для оптимизации можно сократить количество вызовов для обнаружения новой цели

Логика врагов

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

За спавн отвечает EnemySpawner. В нём можно выбрать массив точек для спавна и настроить тайм-аут (delay) между спавнами

  1. Враг движется по прямой из верхней части вниз с заданной скоростью;

За движение противника отвечает EnemyMovement, который так же предполагает возможность задавать скорость

  1. Пересекая линию финиша враг уменьшает здоровье игрока на 1 и исчезает;

За обработку событий пересечения линии финища отвечает FinishLine. Работает всё с помощью коллайдеров-триггеров

  1. При попадании персонажа по врагу здоровье врага уменьшается на величину урона персонажа;

Логика работы здоровья противника описана в EnemyHealth. Предполагается возможность настройки здоровья противника

  1. Когда здоровье врага становится равно 0 он умирает.

Так же учтено в EnemyHealth

Победа и поражение

  1. Игрок побеждает, когда все враги умирают;

Цель на игру настраивается в GoalManager при достижении которого вызывается событие, обрабатываемое в GameManager

  1. Игрок проигрывает, когда его здоровье становится равно 0.

CharacterHealth предполагает вызов события смерти игрока, обрабатываемое в GameManager

Интерфейс

  1. В верхней части экрана отображается счетчик здоровья;

Счётчик здоровья обрабатывает событие при изменении здоровья персонажа и выводит актуальную информацию

  1. При поражении открывается окно с заголовком "Поражение" и кнопкой “Рестарт”, по нажатию на которую игра начинается заново;
  2. При победе открывается окно с заголовком "Победа" и кнопкой “Рестарт”, по нажатию на которую игра начинается заново.

Для оптимизации "Рестарт" игры можно реализовать через сброс состояния игры, а не перезагрузку сцены

Настройки

image

  1. Количество врагов, которое следует уничтожить для победы (range int); при каждом запуске игры количество врагов выбирается случайным образом из диапазона [min, max];

image

  1. Таймаут с которым враги появляются (range float), следующий враг появляется через случайное число секунд из диапазона [min, max];

image

  1. Скорость движения врагов (range float), скорость каждого нового врага выбирается случайно из диапазона [min, max];

Cкорость выбирается случайно при инициализации на "Фабрике"

image

  1. Количество здоровья врагов (int);

см. скрин пункт 3

  1. Радиус поражения(стрельбы) персонажа (float);

image

  1. Скорость стрельбы персонажа (float);

см. скрин пункт 5

  1. Урон от выстрела персонажа (int);

Здесь я немного отклонился от ТЗ. Урон настраивается для конкретной пули в её префабе. При необходимости могу исправить image

  1. Скорость пули (float).

см. скрин пункт 7

Проект выполнен в 2D темплейте (хотя по сути разницы никакой, так как это гибко настраивается в самом редакторе) на версии 2022.2.17f1. Для создания объектов противников используется фабрика внутри которой и производится их инициализация. Вертикальная ориентация сцены достигнута искуственно, но всё работает аналогично и для мобильных устройств (в симуляторе будет необходимо отключить искусственные границы). Задача была выполнена за 4 дня (~10-12 часов) НЕ за основным рабочим девайсом :). Из сторонних ассетов использовались только графические, т.е. для визуального наполнения

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

Выше были упомянуты шаги, которые можно реализовать для оптимизации, но не были реализованы по 2-ум причинам:

  1. Производительность и без них находится на достаточно высоком уровне, а целевая производительность в ТЗ обозначена не была
  2. Зачастую работа над производительностью отнимает достаточно времени, которое можно было бы потратить на внедрение контента. Поэтому (в моём понимании) заниматься оптимизацией необходимо при её заметном ухудшении, но это не значит, что нужно намеренно писать плохо :)

По всем вопросам можно обращаться в: TG @nikita_druzhbin Discord nikochka GMail [email protected]

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks