feat: 스킬 투사체 충돌 시 여러 마리 수의 몬스터를 타격할 수 있도록 수정

This commit is contained in:
aube.lee
2025-02-26 14:45:08 +09:00
parent 49eb67ce99
commit fda28e3cd9
3 changed files with 38 additions and 4 deletions

View File

@@ -21,5 +21,7 @@ namespace TON
public int slotNumber;
// 스킬 사용을 위해 필요한 캐릭터 레벨
public int requiredLevel;
// 스킬이 한번에 타격할 수 있는 몬스터의 수
public int maxHitCount;
}
}

View File

@@ -13,12 +13,26 @@ namespace TON
private float activatedTime = 0f; // 경과 시간 저장 변수
private DamageCalculator damageCalculator = new DamageCalculator();
private float damage;
private float damage; // 스킬 데미지 계수
private int maxHitCount = 1; // 최대 타격 가능한 몬스터 수
private int currentHitCount = 0; // 현재까지 타격한 몬스터 수
private HashSet<Collider2D> hitMonsters = new HashSet<Collider2D>(); // 이미 타격한 몬스터 추적
public void Init(float damage)
public void Init(float damage, int maxHitCount)
{
this.damage = damage;
this.maxHitCount = Mathf.Max(1, maxHitCount); // 데이터 오류 보정을 위한 Max 적용
playerData = PlayerDataManager.Singleton.player;
ResetProjectile();
}
// 투사체 초기화 메서드 (투사체가 재사용될 때 호출)
public void ResetProjectile()
{
currentHitCount = 0;
hitMonsters.Clear();
}
void OnEnable()
@@ -42,12 +56,19 @@ namespace TON
// TODO: 장비 공격력 반영 필요
// float damage = damageCalculator.CalculateBaseDamage(playerData.attackPower, playerData.equipmentAttack, playerData.defensivePower);
// 이미 타격한 몬스터인지 확인
if (hitMonsters.Contains(collision))
return;
MonsterBase monsterBase = collision.GetComponent<MonsterBase>();
// 몬스터가 이전 피격으로 이미 죽은 경우우
if (monsterBase.currentHP <= 0)
return;
// 타격한 몬스터 목록에 추가
hitMonsters.Add(collision);
// 몬스터 방어력 의도값 계산
float calcMonsterDefence = monsterBase.defencePower / (monsterBase.defencePower + monsterBase.defenceIntention);
float damage = damageCalculator.CalculateBaseDamage(playerData.attackPower * this.damage, 0, calcMonsterDefence);
@@ -57,7 +78,15 @@ namespace TON
// 치명타 적용
damage = damageCalculator.ApplyCriticalDamage(damage, collision.transform.position);
collision.GetComponent<IDamage>().ApplyDamage(damage);
ReleaseObject();
// 타격 카운트 증가
currentHitCount++;
// 최대 타격 수에 도달하면 투사체 제거
if (currentHitCount >= maxHitCount)
{
ReleaseObject();
}
}
}

View File

@@ -152,9 +152,12 @@ namespace TON
GameObject effectGameObject = ObjectPoolManager.Instance.GetEffect(skillId);
Projectile projectile = effectGameObject.GetComponent<Projectile>();
SkillBase targetSkillBase = GetSkillInstance(skillId);
// 현재 스킬의 쿨타임 시작
targetSkillBase.SetCurrentCoolDown();
projectile.Init(targetSkillBase.SkillData.damage);
// 스킬 투사체 초기화
projectile.Init(targetSkillBase.SkillData.damage, targetSkillBase.SkillData.maxHitCount);
effectGameObject.transform.SetPositionAndRotation(firePoint.position, firePoint.rotation);