I prefer doing multiple scripts. This way you can easily make the changes to individual enemies/characters without having to worry about designing a one size fits all approach.
For example one type of enemy may always attack you if they are within a certain distance and have line of sight, running towards you.
Another enemy or “critter” may always run away from you if they are within a certain distance and/or line of sight. And they may have a ton of randomization that occurs to determine where they run. They may also use random animations while idle where some enemies might patrol.
You may want enemies to have different drop rates, or to even Start() at unique times.
Additionally adding sound sources may require different numbers of sounds depending on enemies, and you don’t want extra objects unless you are really need them.
Other enemies may require additional scripts like magic spells shooting lasers or fireballs etc.
I do like the above mentioned approach of just having a base class, and using inheritance sub classes for these kinds of things I just mentioned.
And using prefabs is definitely handy, especially for creating new scenes or an object for the first time.
Using multiple scripts also makes it very easy to identify what kind of object you are dealing with by using something like:
if (rayHitObject.GetComponent<EnemyCrazyBeastScript>())
{
// do logic here
//example
enemyCrazyBeastScript otherObjectsScriptCrazyBeast=rayHitObject.GetComponent<EnemyCrazyBeastScript>();
otherObjectsScriptCrazyBeast.enemyHealth += -playerDamage;
}
You should avoid using Static variables except for things that will only have one value ever within your program. Usually a Static variables data seems to be most useful if it needs to be accessed by multiple scripts. Usually things related to the “game state” as mentioned above. So things like how many levels you have unlocked, how many potions you have, your experience, what kind of armor your wearing etc. Many of my public static variables are tied to the PlayerPrefs and interact with them to save the games data.
The biggest downside of this method is that with so many scripts possibly running in one given scene you need to be extra careful that each individual script is not wasteful. Each function should only be called when absolutely necessary if possible. And you should always be thinking about ways to simplify or optimize your code if you are even slightly concerned about performance.
I generally try to keep all my variables on enemies/critters private and of course non-static since there are multiple enemies. Certain variables like enemyHealth could be public to allow easy access depending on how you are setting things up.
This is a pretty detailed opinion/answer which I’m not sure will even benefit the OP that much because they already sound like they know what they are doing. But I’m sure someone brand new to Unity/programming might find this useful 
Thanks for the link, Fattie. Tbh I've never even looked at a pool until now.
– LairinusYes but the right answer isn't to tell them not to - it's to educate on how to do it right.
– Dracorat