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

Чтобы изменить сценарий Enemy на абстрактный класс, нам нужно добавить ключевое слово abstract при объявлении класса.

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

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

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

Теперь скрипты, унаследованные от скрипта Enemy, будут делать все, что делает скрипт Enemy, но позволяют изменять виртуальные методы. В скрипте ZigZagEnemy мы модифицируем метод CalulateMovement с помощью ключевого слова override, сообщая методу, что все должно выполняться нормально, вызывая его в базовом скрипте Enemy, а затем запускаем код в этом скрипте.

В сценарии RearFireEnemy мы указываем методу Start сценария Enemy, чтобы он работал нормально, и вызываем метод DetereminePlayerPosition и метод Update Enemy для вызова DetereminePlayerPosition, а затем запускаем в обычном режиме. Затем мы переопределяем метод FireLaser. В зависимости от того, где находится Player, мы говорим ему, что он либо запускается в обычном режиме, либо создает Laser позади RearFireEnemy и вызывает PlayClip.

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

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

Затем замените скрипт Enemy на BasicEnemy на префабе Enemy.