<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!