diff --git a/Gameton-06/Assets/Gameton/Scripts/Character/CollisionDetector .cs b/Gameton-06/Assets/Gameton/Scripts/Character/CollisionDetector .cs index 390128cf..8b7ca376 100644 --- a/Gameton-06/Assets/Gameton/Scripts/Character/CollisionDetector .cs +++ b/Gameton-06/Assets/Gameton/Scripts/Character/CollisionDetector .cs @@ -8,10 +8,15 @@ namespace TON { private Collider2D col; // 자식 오브젝트의 Collider + private DamageCalculator damageCalculator = new DamageCalculator(); + private PlayerData playerData; + private void Awake() { col = GetComponent(); col.enabled = false; // 초기에는 감지 비활성화 + + playerData = PlayerDataManager.Singleton.player; } private void OnTriggerEnter2D(Collider2D collision) @@ -20,6 +25,13 @@ namespace TON if (collision.CompareTag("Monster")) // 적과 충돌 시 제거 { + // 기본 데미지 계산 + // float damage = damageCalculator.CalculateBaseDamage(playerData.attackPower, playerData.equipmentAttack, playerData.defensivePower); + float damage = damageCalculator.CalculateBaseDamage(playerData.attackPower, 10, playerData.defensivePower); + + // 치명타 적용 (캐릭터는 적용) + damage = damageCalculator.ApplyCriticalDamage(damage, true); + collision.GetComponent().ApplyDamage(10f); } } diff --git a/Gameton-06/Assets/Gameton/Scripts/Common/DamageCalculator.cs b/Gameton-06/Assets/Gameton/Scripts/Common/DamageCalculator.cs new file mode 100644 index 00000000..7381cb0d --- /dev/null +++ b/Gameton-06/Assets/Gameton/Scripts/Common/DamageCalculator.cs @@ -0,0 +1,46 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace TON +{ + public class DamageCalculator : MonoBehaviour + { + public float criticalChance = 0.3f; // 캐릭터 치명타 확률 (30%) + public float criticalMultiplier = 1.5f; // 치명타 배율 (1.5배) + + /// + /// 일반 공격 데미지 계산 + /// + public float CalculateBaseDamage(float baseAttack, float equipmentAttack, float defenseValue) + { + // 1. 총 공격력 계산 + float totalAttackPower = baseAttack + equipmentAttack; + + // 2. 데미지 변수 (0.9 ~ 1.1 랜덤 값) + float damageMultiplier = Random.Range(0.9f, 1.1f); + + // 3. 방어력 계산 (1 - 방어력 값) + float defenseEffect = 1 - defenseValue; + + // 4. 기본 데미지 계산 + float baseDamage = (totalAttackPower * damageMultiplier) * defenseEffect; + + return Mathf.Round(baseDamage); // 소수점 제거 (선택 사항) + } + + /// + /// 치명타 적용 (치명타 확률이 0보다 클 경우에만 적용) + /// + public float ApplyCriticalDamage(float damage, bool canCritical) + { + if (canCritical && Random.value < criticalChance) // Random.value는 0.0 ~ 1.0 사이의 랜덤 값 + { + damage *= criticalMultiplier; + Debug.Log("💥 치명타 발생! 💥"); + } + + return Mathf.Round(damage); // 소수점 제거 + } + } +} diff --git a/Gameton-06/Assets/Gameton/Scripts/Common/DamageCalculator.cs.meta b/Gameton-06/Assets/Gameton/Scripts/Common/DamageCalculator.cs.meta new file mode 100644 index 00000000..190d7f6d --- /dev/null +++ b/Gameton-06/Assets/Gameton/Scripts/Common/DamageCalculator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 600b739ee220368499772ed0a8756028 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: