using ActionGameFramework.Health;
using Core.Health;
using UnityEngine;
namespace TowerDefense.Towers.Projectiles
{
///
/// Component that will apply splash damage on collision enter
///
public class SplashDamager : MonoBehaviour
{
///
/// The Area this projectile will attack in
///
public float attackRange = 0.6f;
///
/// The amount of damage done, a percentage of the damager damage
///
public float damageAmount;
///
/// The physics layer mask to search on
///
public LayerMask mask = -1;
///
/// The alignment of the projectile
///
public SerializableIAlignmentProvider alignment;
static readonly Collider[] s_Enemies = new Collider[64];
public float damage
{
get { return damageAmount; }
}
///
/// Gets this damager's alignment
///
public IAlignmentProvider alignmentProvider
{
get { return alignment != null ? alignment.GetInterface() : null; }
}
///
/// Searches for Targetables within a radius of
/// and damages them if valid
///
protected virtual void OnCollisionEnter(Collision other)
{
int number = Physics.OverlapSphereNonAlloc(transform.position, attackRange, s_Enemies, mask);
for (int index = 0; index < number; index++)
{
Collider enemy = s_Enemies[index];
var damageable = enemy.GetComponent();
if (damageable == null)
{
continue;
}
damageable.TakeDamage(damageAmount, damageable.position, alignmentProvider);
}
}
///
/// 看看Trigger的加入能不能有助于处理:
///
///
protected void OnTriggerEnter(Collider other)
{
int number = Physics.OverlapSphereNonAlloc(transform.position, attackRange, s_Enemies, mask);
for (int index = 0; index < number; index++)
{
Collider enemy = s_Enemies[index];
var damageable = enemy.GetComponent();
if (damageable == null)
{
continue;
}
damageable.TakeDamage(damageAmount, damageable.position, alignmentProvider);
}
}
}
}