Skip to content

Ziller90/UnityMiddleDeveloperTest

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Выполнение тестового задания для CarX Technologies

  1. В изначальном коде использовались public переменные. Они были заменены на поля с атрибутом [SerializedField] для сокрытия переменных от других классов, которые не должны о них знать.

  2. Изменен нейминг переменных. Не считаю венгерскую нотацию в названии переменных оправданной в С#. (плюс, венгерская нотация, на сколько я знаю, мало распространена в среде Unity разработчиков. Это делает более сложной адаптацию новых разработчиков к стилю кода . Однако, если в CarX Technologies все таки применяется венгерская нотация в названии переменных, я буду вовсе не против нее и смогу легко адаптироваться!)

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

  4. Для поиска противников на сцене использовался метод FindObjectsOfType(), который является очень тяжелым и может вызывать проблемы с производительностью. Для хранения списка юнитов на сцене был добавлен класс UnitsService.

  5. Для удобного доступа к классу UnitService был реализован паттер Service locator. Были добавлены скрипты Service и ApplicationServices

  6. Для регистрации юнитов в UnitsService был разработан класс Unit. Он регистрирует юнита при появлении на сцене и удаляет его из списка при срабатывании события dieEvent;

  7. В изначальном коде UnitMover выполняет как функцию движения юнита, так и функцию отслеживания его приближения к цели. Это нарушает принцип единой ответственности. Поэтому было принято решение вынести функционал отслеживания приближения к цели и удаления юнита при приближении к цели в класс UnitAI. UnitMover теперь выполняет исключительно функцию перемещения юнита в определенную точку, задаваемую в методе SetMoveTarget(GameObject moveTarget)

  8. Сделан перенос открывающей скобки на следующую строку во всех методах и классах для увеличения читабельности кода. Это также соответствует официальному C# code style.

  9. Изменена архитектура снярядов. Добавлен ProjectileBase скрипт, а также отдельный скрит, наносящий урон противникам при попадании.

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

  11. Добавлен компонент UnitDetector, хранящий очередь противников, которые вошли в радиус, заданный компонентом Range, а также кидающий событие об изменении текущей цели для атаки.

  12. Добавлена стрельба с упреждением для Cannon Tower.

  13. Добавлен скрипт ProjectilesSpawner, позволяющий настраивать частоту спавна снарядов для различных типов башен.

  14. При работе над тестовым заданием я старался придерживаться компонентно-ориентированного подхода. Например, логика поведения башен была разбита на 4 компонента: Range, UnitDetector, ProjectileSpawner и CannonTower/SimpleTower. В дальнейшем это позволит создавать новые виды башен используя существующие компоненты и комбинируя их в различных вариациях.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published