728x90
이런 아이템을 구현했다. 불로 지지는 공격이다보니, 불이 닿는 범위에 있는 모든 적에게 지속 데미지를 주어야한다.
광역 데미지 구현에 많이 사용하던 OverlapSphere, 혹은 직사각형 그리기 등으로는 범위를 제대로 지정하기가 까다로울 것 같아 파티클 프리팹에 콜라이더를 달아 구현하려고 했다.
private void OnTriggerStay(Collider other) {
// 트리거 충돌한 상대방 게임 오브젝트가 추적 대상이라면 공격 실행
if( Time.time >= lastAttackTime + timeBetAttack)
{
LivingEntity attackTarget = other.GetComponent<LivingEntity>();
if(attackTarget!=null)
{
if (attackTarget.tag =="Enemy")
{
lastAttackTime = Time.time;
attackTarget.OnDamage(damage);
}
}
}
}
처음엔 이렇게 구현했다. 그러나, Time.time >= lastAttackTime+timeBetAttack을 확인하고 데미지를 입힌다는 것은,
콜라이더에 여러 적이 닿아 있다고 하더라도 적 하나에게만 데미지를 입히고 일정 시간을 기다린 뒤 다시 하나의 적에게만 데미지를 입힌다는 의미이다.
그래서 어떻게 바꿔야할지 고민하다가, 콜라이더를 껐다 켰다 하는 것을 반복하며 OnTriggerEnter로 데미지를 주기로 했다.
private IEnumerator Breath()
{
while(true)
{
flame.Play();
float time = 0;
while(true)
{
collider.enabled= true;
yield return new WaitForSeconds(timeBetAttack);//다음 딜 타임 대기(0.3초)
collider.enabled= false; //콜라이더 껐다 키면서 데미지 입힘
time+=timeBetAttack;
if(time>=duration)
break;
}
flame.Stop();
yield return new WaitForSeconds(period);
}
}
private void OnTriggerEnter(Collider other) {
// 트리거 충돌한 상대방 게임 오브젝트가 추적 대상이라면 공격 실행
LivingEntity attackTarget = other.GetComponent<LivingEntity>();
if(attackTarget!=null)
{
if (attackTarget.tag =="Enemy")
{
lastAttackTime = Time.time;
attackTarget.OnDamage(damage);
}
}
}
광역+지속 데미지가 잘 적용된다.
작동 메커니즘은 [화염방사(3초간 지속) - 방사 중지, 대기(7초) - 화염방사 - 반복] 이런 식이다.
728x90
'Unity' 카테고리의 다른 글
[Unity] 오브젝트 풀링시 총알이 자꾸 사라지는 문제 (0) | 2022.05.17 |
---|---|
[Unity] 오브젝트 풀링 + 가장 가까운 적 방향으로 공격 (0) | 2022.04.22 |
[Unity] 퍼블릭(public) 선언시 주의할 점 (0) | 2022.04.07 |
[Unity] 로그라이크 개발 - 아이템 강화 시스템 실패 (0) | 2022.03.31 |
[Unity] 가장 가까운 적에게 투사체 발사 (0) | 2022.03.27 |