The resources system has been built from an initial health system into a an extendable resource system.
Any type of resource can be modeled with a simple wrapper around a resource system. Health systems implement IHealable
, Shield systems implement IShieldable
, and both systems implement the IDamageable
interface.
public interface IHealable {
int CurrentHealth { get; }
float CurrentHealthPercent { get; }
bool IsDead { get; }
bool IsHealthRegenerating { get; }
void ResetValues();
void DisableHealth();
void EnableHealth();
void GiveHealth(int value);
void GiveHealthRegen(int value, int ticks);
}
public interface IShieldable {
int CurrentShield { get; }
bool IsShielded { get; }
bool IsShieldRegenerating { get; }
...
}
public interface IDamageable {
bool IsDead { get;}
bool TakeDamage(int damage, Vector2 location);
}
public interface IKillable {
void Die(Vector2 lastHitLocation);
}
The IDamageable
and IKillable
interfaces allow for a many different classes to implement their own ways to deal with damage. Any component that implements IDamageable
can recieve damage from the games damage systems without extra wiring. All damage done in the game runs through an IDamageable
interface. In this case, a basic enemy implements the IKillable
interface directly, but passes off the implementation of IDamageable
to BaseHealthSystem
public class Enemy : MonoBehaviour, IKillable, IDamageable, IHealable
{
...
protected BaseHealthSystem health;
public void Die(Vector2 lastHitLocation)
{
StartCoroutine(Death(lastHitLocation));
}
...
}
public class BaseHealthSystem : MonoBehaviour, IDamageable, IHealable{...}