diff --git a/Gameton-06/Assets/Gameton/Scripts/GameData/SkillData.cs b/Gameton-06/Assets/Gameton/Scripts/GameData/SkillData.cs index 3b82c395..56c5e2b8 100644 --- a/Gameton-06/Assets/Gameton/Scripts/GameData/SkillData.cs +++ b/Gameton-06/Assets/Gameton/Scripts/GameData/SkillData.cs @@ -21,5 +21,7 @@ namespace TON public int slotNumber; // 스킬 사용을 위해 필요한 캐릭터 레벨 public int requiredLevel; + // 스킬이 한번에 타격할 수 있는 몬스터의 수 + public int maxHitCount; } } diff --git a/Gameton-06/Assets/Gameton/Scripts/Skill/Projectile.cs b/Gameton-06/Assets/Gameton/Scripts/Skill/Projectile.cs index ed6c4882..9002b1cf 100644 --- a/Gameton-06/Assets/Gameton/Scripts/Skill/Projectile.cs +++ b/Gameton-06/Assets/Gameton/Scripts/Skill/Projectile.cs @@ -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 hitMonsters = new HashSet(); // 이미 타격한 몬스터 추적 - 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(); // 몬스터가 이전 피격으로 이미 죽은 경우우 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().ApplyDamage(damage); - ReleaseObject(); + + // 타격 카운트 증가 + currentHitCount++; + + // 최대 타격 수에 도달하면 투사체 제거 + if (currentHitCount >= maxHitCount) + { + ReleaseObject(); + } } } diff --git a/Gameton-06/Assets/Gameton/Scripts/Skill/SkillDataManager.cs b/Gameton-06/Assets/Gameton/Scripts/Skill/SkillDataManager.cs index aa22e7ea..e55d2417 100644 --- a/Gameton-06/Assets/Gameton/Scripts/Skill/SkillDataManager.cs +++ b/Gameton-06/Assets/Gameton/Scripts/Skill/SkillDataManager.cs @@ -152,9 +152,12 @@ namespace TON GameObject effectGameObject = ObjectPoolManager.Instance.GetEffect(skillId); Projectile projectile = effectGameObject.GetComponent(); 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);