Unity 지속 데미지 구현

이시율·2025년 7월 9일

일정 영역 안에 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를 호출하도록 하여 일정시간마다 데미지를 입도록 구현하였다.

0개의 댓글