일정 영역 안에 Enemy가 들어가 있을 때 일정 시간마다 데미지를 주는 효과를 구현하기 위해 아래와 같이 작성하였다.
private HashSet<Collider2D> floorTargets = new HashSet<Collider2D>();
void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.layer == LayerMask.NameToLayer("Enemy") && !enemy)
{
collision.GetComponent<EnemyController>().OnDamage(damage + PlayerController.Instance.AttackPower());
floorTargets.Add(collision); // 장판 지속
}
}
void OnTriggerExit2D(Collider2D collision)
{
if (collision.gameObject.layer == LayerMask.NameToLayer("Enemy") && !enemy)
{
floorTargets.Remove(collision); // 장판 데미지 해제
}
else if (collision.CompareTag("Player") && enemy)
{
floorTargets.Remove(collision); // 장판 데미지 해제
}
}
Collider가 닿았을 때 데미지를 줌과 동시에 floorTargets에 해당 Enemy의 정보를 넣고
Exit하였을 때 해당 Collider의 정보를 빼도록 하였다.
void OnEnable() // 활성화 중 실행
{
InvokeRepeating(nameof(TakeDamage), 0f, delay);
}
void TakeDamage()
{
foreach (var target in floorTargets)
{
Debug.Log(damage + "발생");
target.GetComponent<IDamageable>().OnDamage(damage);
}
}
OnEnable에서 InvokeRepeating을통해 활성화된 동안 TakeDamage를 호출하여
floorTargets에 들어있는 Enemy들의 OnDamage를 호출하도록 하여 일정시간마다 데미지를 입도록 구현하였다.