From fda28e3cd908cd71475f177e68691942f05e0588 Mon Sep 17 00:00:00 2001 From: "aube.lee" Date: Wed, 26 Feb 2025 14:45:08 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=8A=A4=ED=82=AC=20=ED=88=AC=EC=82=AC?= =?UTF-8?q?=EC=B2=B4=20=EC=B6=A9=EB=8F=8C=20=EC=8B=9C=20=EC=97=AC=EB=9F=AC?= =?UTF-8?q?=20=EB=A7=88=EB=A6=AC=20=EC=88=98=EC=9D=98=20=EB=AA=AC=EC=8A=A4?= =?UTF-8?q?=ED=84=B0=EB=A5=BC=20=ED=83=80=EA=B2=A9=ED=95=A0=20=EC=88=98=20?= =?UTF-8?q?=EC=9E=88=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Gameton/Scripts/GameData/SkillData.cs | 2 ++ .../Gameton/Scripts/Skill/Projectile.cs | 35 +++++++++++++++++-- .../Gameton/Scripts/Skill/SkillDataManager.cs | 5 ++- 3 files changed, 38 insertions(+), 4 deletions(-) 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);