Handling different combinations of enum selection

Hi!
I’m trying to build a system where the player can configure the bullet used by its gun in a highly customizable way.

I would like to have options for:

  • The status effect applied by the bullet (none, burning, freezing, poisoning)
  • The way it handles collisions (pierce targets, explodes, bounces)
  • Trajectory modifiers (none, follow mouse position, autro track enemies)

I’ve done this using enums (I have one enum for each one of these categories), but I will have to configure some attributes according to what is selected. Example:

  • For an explosive round, I will have to configure the radius of the explosion and its damage
  • For a burning round, I will have to determine the duration of the DoT effect and its damage

… and so on


I was wondering what is the most effective way of handling this in a OOP approach. I don’t expect you guys to do all the work for me, but if you could guide my through the best approach (e.g. “create a class”/“use scriptable objects”/other) it would be really helpful.

Thanks!

If you select an effect type from the UI, a switch could then show the relevant attribute to input:

switch(bulletEffect)
...
 case(BulletEffect.Burning):
  doTInput.SetActive = true;
...

allowing you to input and update the doT value

when complete you can then do a call to create a new bullet object with the values you need.

var customBullet = new Bullet(dot, radius, damage...)

class Bullet{
 public int dot;
 public int radius;
 public int damage;
 ...

  Bullet (doT, radius...damage){
   this.doT = doT;
   this.radius = radius;
   this.damage = damage;


}
}

giving you a customBullet object should then be able to use for further logic…

OnBulletHit(Bullet customBullet){
 if(customBullet.doT >0){
...do fire effect etc.
}
if(customBullet.radius>0){
...do explosion effect.
}
}

Sorry if this isn’t too helpful in terms of implementation it’s just what I could think of at the moment. I’m sure someone else could figure a more robust solution that simply checking the bullet object for what values it has out of all of them…