The Hit
struct is used to pass the details about an attack (such as the amount of damage being dealt) to the target being attacked. It uses the partial
keyword to split its definition into two scripts:
Script | Contents | Portability |
---|---|---|
Hit.Core.cs |
The main parts of the system that are necessary for it to function. | This file is intended to be directly reusable in any project without needing to modify it. |
Hit.Details.cs |
Extra details like the amount of damage and the Team the attacker is on. | This file is intended to be modified if you bring the system into another project and want to add more details such as damage types. |
Using the system simply involves creating a new Hit
and calling one of its methods. For example, Hit Triggers use something like this:
private void OnTriggerStay2D(Collider2D collider)
{
var hit = new Hit(..., ..., ...);
hit.TryHitComponent(collider);
}
Hit.TryHitComponent
gets any component that implements the Hit.ITarget
interface, checks if it CanBeHit
by the current attack, and then calls ReceiveHit
on it if allowed. There are various other TryHit
methods which are listed in the API Documentation for Hit
.
Since Hit
is a struct, using it like this won't create any Garbage so its performance is good.
There are two components that implement Hit.ITarget
:
Component | Used By | Description |
---|---|---|
Health |
Characters | ReceiveHit reduces the Health.CurrentHealth by the Hit.damage and calls Health.OnCurrentHealthChanged . |
Destructible |
Destructible Blocks | Has no health, ReceiveHit simply destroys the GameObject . |
Hit Modifiers
The Hit.ITarget
methods take the Hit
data as a ref
parameter, meaning that they can modify the data for the caller. This is currently unused, but it allows for various possibilities if the system were to be used in a more complex game:
- If a character has armour, it could reduce the
Hit.damage
so that afterwards the attacker could check how much damage was actually applied. - If a Paladin has an ability to intercept an attack targeting their allies, they could change the
Hit.target
during theHit.ITarget.CanHit
method.