From 1700d512072aa4460abed5908eac6ccc1af2c5c1 Mon Sep 17 00:00:00 2001 From: "aube.lee" Date: Fri, 7 Feb 2025 00:44:28 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B3=B5=EA=B2=A9=EB=A0=A5=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Scripts/Character/CollisionDetector .cs | 12 +++++ .../Scripts/Common/DamageCalculator.cs | 46 +++++++++++++++++++ .../Scripts/Common/DamageCalculator.cs.meta | 11 +++++ 3 files changed, 69 insertions(+) create mode 100644 Gameton-06/Assets/Gameton/Scripts/Common/DamageCalculator.cs create mode 100644 Gameton-06/Assets/Gameton/Scripts/Common/DamageCalculator.cs.meta 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: