<br />
I am creating a tower defense game.<br /><br />
Currently I have 2 different tower types 'Shooting tower', 'Unit tower'.
I have a Scriptable object to initialize the tower, it contains some tower properties like it's attack radius, damage and so on.<br /><br/>
I am initializing my towers from TowerSO(scriptable object), it also contains a prefab for a tower.

The problem here is that I have different properties for different tower types in TowerSO, for example unit tower has properties like(spawnDelay, maximumUnitsToSpawn) and archer tower doesn't need this info, so I guess it is not good approach because if there will be a new tower type with additional properties it would mean that TowerSO will grow more. <br />
<br />Also I want to be able to initialize tower when it's Instantiated but now I don't know what tower I am instantiating and I don't want to add some generic if like (towerType == ArcherTower).<br />

 GameObject tower = Instantiate(currentlySelectedTowerSO.prefab, 
 new Vector3(gridPosition.x + xOffset, gridPosition.y + yOffset, currentlySelectedTowerSO.prefab.transform.position.z),
 Quaternion.identity);

 // initialize knigh tower(if it is a knight tower)
 tower.GetComponent<KnightTower>().Initialize(maxUnitNumber, spawnDelay);
 // initialize archer tower(if it is an archer tower)
 tower.GetComponent<KnightTower>().Initialize(minDamage, maxDamage, arrowSpeed);

So my question is, how do I separate different tower properties to different Scriptable Objects(with completely different fields) and also how do I initialize them passing relative arguments to each tower.<br />
For ArcherTower (min-max damage, arrowSpeed...) For UnitTower(MaxUnitNumber, SpawnDelay)<br />
Thanks!