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); } } } }