To phrase it differently: How did we set the damage of the ballista bolt to 1 health point? Also, how can we modify the damage?
In the EnemyHealth.cs
script, we subtract 1 from the health when the projectile hits. currentHitPoints--
decreases the value by 1.
If you want to modify the damage you could do the simple thing and just add a serialised value to EnemyHealth
and subtract that instead
[SerializeField] int projectileDamage = 2;
void ProcessHit()
{
currentHitPoints -= projectileDamage;
if(currentHitPoints <= 0)
{
gameObject.SetActive(false);
maxHitPoints += difficultyRamp;
enemy.RewardGold();
}
}
But EnemyHealth
is not really the correct place to put it. I believe (not 100% sure) the GameObject
that is passed into the OnParticleCollision
is the tower (ballista) that shot this particular particle, so you should be able to retrieve the Tower
class from it and if you set the damage on that, you can retrieve it. It should allow you to set damage per tower. So you could have ballistas doing 2 damage and trebuchets (for example) doing 5 damage.
What you’ll do is add the projectileDamage to the Tower
script instead and create an ‘getter’ method
public class Tower : MonoBehaviour
{
[SerializeField] int projectileDamage = 1;
public int GetProjectileDamage()
{
return projectileDamage;
}
}
Then, in the EnemyHealth
script, you can retrieve the Tower
and get it’s damage value
void OnParticleCollision(GameObject other)
{
// Try to get the tower
if (other.TryGetComponent<Tower>(out Tower tower))
{
// if we got a tower, pass its damage value to process the hit
ProcessHit(tower.GetProjectileDamage());
}
}
void ProcessHit(int damage) // here, we now accept the damage amount
{
currentHitPoints -= damage;
if(currentHitPoints <= 0)
{
gameObject.SetActive(false);
maxHitPoints += difficultyRamp;
enemy.RewardGold();
}
}
Thank you very much for this detailed answer!
This topic was automatically closed 24 hours after the last reply. New replies are no longer allowed.