From c8059ce76998f4381c2348374df2cf34efb431c6 Mon Sep 17 00:00:00 2001 From: "aube.lee" Date: Wed, 26 Feb 2025 11:20:24 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=AA=AC=EC=8A=A4=ED=84=B0=20=ED=94=BC?= =?UTF-8?q?=EA=B2=A9=EC=8B=9C=20=EB=8D=B0=EB=AF=B8=EC=A7=80=20=ED=85=8D?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=9D=B4=ED=8E=99=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Prefabs/TON.DamageEffect.prefab | 286 ++++++++++++++++++ .../Prefabs/TON.DamageEffect.prefab.meta | 7 + .../Prefabs/TON.ObjectPoolSystem.prefab | 3 + .../dev_jinjoo/Edit_Ingame.unity | 69 +++++ .../Scripts/Character/CollisionDetector .cs | 8 +- .../Gameton/Scripts/Character/DamageEffect.cs | 60 ++++ .../Scripts/Character/DamageEffect.cs.meta | 11 + .../Scripts/Common/DamageCalculator.cs | 17 +- .../Gameton/Scripts/Monster/MonsterBase.cs | 2 +- .../Gameton/Scripts/Skill/Projectile.cs | 11 +- 10 files changed, 466 insertions(+), 8 deletions(-) create mode 100644 Gameton-06/Assets/Gameton/Resources/ObjectPoolSystem/Prefabs/TON.DamageEffect.prefab create mode 100644 Gameton-06/Assets/Gameton/Resources/ObjectPoolSystem/Prefabs/TON.DamageEffect.prefab.meta create mode 100644 Gameton-06/Assets/Gameton/Scripts/Character/DamageEffect.cs create mode 100644 Gameton-06/Assets/Gameton/Scripts/Character/DamageEffect.cs.meta diff --git a/Gameton-06/Assets/Gameton/Resources/ObjectPoolSystem/Prefabs/TON.DamageEffect.prefab b/Gameton-06/Assets/Gameton/Resources/ObjectPoolSystem/Prefabs/TON.DamageEffect.prefab new file mode 100644 index 00000000..765345ac --- /dev/null +++ b/Gameton-06/Assets/Gameton/Resources/ObjectPoolSystem/Prefabs/TON.DamageEffect.prefab @@ -0,0 +1,286 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &2694340896413399810 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7408005748681691554} + - component: {fileID: 8730988064188533715} + m_Layer: 0 + m_Name: TON.DamageEffect + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7408005748681691554 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2694340896413399810} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2677448934548231384} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &8730988064188533715 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2694340896413399810} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8c86fdd904c9e8d41a93d1249c02a506, type: 3} + m_Name: + m_EditorClassIdentifier: + textMesh: {fileID: 34467655947164835} + floatSpeed: 1 + duration: 1 +--- !u!1 &3215559622947215306 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2677448934548231384} + - component: {fileID: 1477627225519892156} + - component: {fileID: 2012959595055953831} + - component: {fileID: 3615999384750323319} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2677448934548231384 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3215559622947215306} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.05, y: 0.05, z: 0.05} + m_ConstrainProportionsScale: 1 + m_Children: + - {fileID: 682067139761655396} + m_Father: {fileID: 7408005748681691554} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!223 &1477627225519892156 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3215559622947215306} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 25 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: -2014068629 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!114 &2012959595055953831 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3215559622947215306} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 1 +--- !u!114 &3615999384750323319 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3215559622947215306} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 575 +--- !u!1 &6079040546804672776 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 682067139761655396} + - component: {fileID: 1598039331727879914} + - component: {fileID: 34467655947164835} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &682067139761655396 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6079040546804672776} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2677448934548231384} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 200, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1598039331727879914 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6079040546804672776} + m_CullTransparentMesh: 1 +--- !u!114 &34467655947164835 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6079040546804672776} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 999,999,999 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: b43a164f1c9ce804bab1090e60c159b4, type: 2} + m_sharedMaterial: {fileID: 2333603320826562980, guid: b43a164f1c9ce804bab1090e60c159b4, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 24 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} diff --git a/Gameton-06/Assets/Gameton/Resources/ObjectPoolSystem/Prefabs/TON.DamageEffect.prefab.meta b/Gameton-06/Assets/Gameton/Resources/ObjectPoolSystem/Prefabs/TON.DamageEffect.prefab.meta new file mode 100644 index 00000000..ed4a8887 --- /dev/null +++ b/Gameton-06/Assets/Gameton/Resources/ObjectPoolSystem/Prefabs/TON.DamageEffect.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3c12a401b2ee7ee419cf8fecdaa97964 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Gameton-06/Assets/Gameton/Resources/ObjectPoolSystem/Prefabs/TON.ObjectPoolSystem.prefab b/Gameton-06/Assets/Gameton/Resources/ObjectPoolSystem/Prefabs/TON.ObjectPoolSystem.prefab index 29fdb301..14780b1f 100644 --- a/Gameton-06/Assets/Gameton/Resources/ObjectPoolSystem/Prefabs/TON.ObjectPoolSystem.prefab +++ b/Gameton-06/Assets/Gameton/Resources/ObjectPoolSystem/Prefabs/TON.ObjectPoolSystem.prefab @@ -45,6 +45,9 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: poolContainer: + - objectId: DamageEffect + objectPrefab: {fileID: 2694340896413399810, guid: 3c12a401b2ee7ee419cf8fecdaa97964, type: 3} + count: 20 - objectId: K0001 objectPrefab: {fileID: 6328494989662859589, guid: 25bb8f03ea9cfc941b64e04b75d3a1d9, type: 3} count: 3 diff --git a/Gameton-06/Assets/Gameton/Scenes/Personal Scenes/dev_jinjoo/Edit_Ingame.unity b/Gameton-06/Assets/Gameton/Scenes/Personal Scenes/dev_jinjoo/Edit_Ingame.unity index 9a6d7c2c..d1c871bd 100644 --- a/Gameton-06/Assets/Gameton/Scenes/Personal Scenes/dev_jinjoo/Edit_Ingame.unity +++ b/Gameton-06/Assets/Gameton/Scenes/Personal Scenes/dev_jinjoo/Edit_Ingame.unity @@ -777,6 +777,74 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1087677178 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1087677181} + - component: {fileID: 1087677180} + - component: {fileID: 1087677179} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1087677179 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1087677178} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SendPointerHoverToParent: 1 + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1087677180 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1087677178} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &1087677181 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1087677178} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1128113572 GameObject: m_ObjectHideFlags: 0 @@ -1736,3 +1804,4 @@ SceneRoots: - {fileID: 1434684281} - {fileID: 373368149} - {fileID: 71730172} + - {fileID: 1087677181} diff --git a/Gameton-06/Assets/Gameton/Scripts/Character/CollisionDetector .cs b/Gameton-06/Assets/Gameton/Scripts/Character/CollisionDetector .cs index 16bb0ac3..964fed4d 100644 --- a/Gameton-06/Assets/Gameton/Scripts/Character/CollisionDetector .cs +++ b/Gameton-06/Assets/Gameton/Scripts/Character/CollisionDetector .cs @@ -29,13 +29,17 @@ namespace TON // TODO: 장비 공격력 반영 필요 // float damage = damageCalculator.CalculateBaseDamage(playerData.attackPower, playerData.equipmentAttack, playerData.defensivePower); - // 몬스터 방어력 의도값 계산 MonsterBase monsterBase = collision.GetComponent(); + // 몬스터가 이전 피격으로 이미 죽은 경우우 + if (monsterBase.currentHP <= 0) + return; + + // 몬스터 방어력 의도값 계산 float calcMonsterDefence = monsterBase.defencePower / (monsterBase.defencePower + monsterBase.defenceIntention); float damage = damageCalculator.CalculateBaseDamage(playerData.attackPower, 0, calcMonsterDefence); // 치명타 적용 (캐릭터는 적용) - damage = damageCalculator.ApplyCriticalDamage(damage); + damage = damageCalculator.ApplyCriticalDamage(damage, collision.transform.position); collision.GetComponent().ApplyDamage(damage); } diff --git a/Gameton-06/Assets/Gameton/Scripts/Character/DamageEffect.cs b/Gameton-06/Assets/Gameton/Scripts/Character/DamageEffect.cs new file mode 100644 index 00000000..b4bea95f --- /dev/null +++ b/Gameton-06/Assets/Gameton/Scripts/Character/DamageEffect.cs @@ -0,0 +1,60 @@ +using System.Collections; +using System.Collections.Generic; +using TMPro; +using UnityEngine; + +namespace TON +{ + public class DamageEffect : PoolAble + { + public TextMeshProUGUI textMesh; + public float floatSpeed = 1.0f; + public float duration = 1.0f; + + private float timer = 0f; + + private void Awake() + { + // Canvas의 Render Mode가 World Space일 경우, Main Camera를 Event Camera로 설정 + Canvas canvas = gameObject.GetComponentInChildren(); + if (canvas.renderMode == RenderMode.WorldSpace && canvas.worldCamera == null) + { + Debug.Log("test camera"); + canvas.worldCamera = Camera.main; // Main Camera 할당 + } + + } + + public void SetDamage(int damage, bool isCritical) + { + // 데미지 값에 따라 색상이나 크기 변경 가능 + textMesh.text = string.Format("{0:#,###}", damage); + + // 크리티컬 히트일 경우 색상 변경 + if (isCritical) + textMesh.color = Color.yellow; + else + textMesh.color = Color.white; + + // 타이머 리셋 + timer = 0f; + } + + void Update() + { + // 위로 떠오르는 효과 + transform.position += Vector3.up * floatSpeed * Time.deltaTime; + + // 시간에 따른 투명도 조절 + timer += Time.deltaTime; + float alpha = 1.0f - (timer / duration); + textMesh.color = new Color(textMesh.color.r, textMesh.color.g, textMesh.color.b, alpha); + + // 지속 시간이 지나면 비활성화 + if (timer >= duration) + { + gameObject.SetActive(false); + } + } + } +} diff --git a/Gameton-06/Assets/Gameton/Scripts/Character/DamageEffect.cs.meta b/Gameton-06/Assets/Gameton/Scripts/Character/DamageEffect.cs.meta new file mode 100644 index 00000000..d696a808 --- /dev/null +++ b/Gameton-06/Assets/Gameton/Scripts/Character/DamageEffect.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8c86fdd904c9e8d41a93d1249c02a506 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Gameton-06/Assets/Gameton/Scripts/Common/DamageCalculator.cs b/Gameton-06/Assets/Gameton/Scripts/Common/DamageCalculator.cs index 5dde352d..5bc803c6 100644 --- a/Gameton-06/Assets/Gameton/Scripts/Common/DamageCalculator.cs +++ b/Gameton-06/Assets/Gameton/Scripts/Common/DamageCalculator.cs @@ -33,15 +33,28 @@ namespace TON /// /// 치명타 적용 (치명타 확률이 0보다 클 경우에만 적용) /// - public float ApplyCriticalDamage(float damage) + public float ApplyCriticalDamage(float damage, Vector3 position) { + bool critical = false; if (Random.value < criticalChance) // Random.value는 0.0 ~ 1.0 사이의 랜덤 값 { damage *= criticalMultiplier; + critical = true; Debug.Log("💥 치명타 발생! 💥" + damage); } - return Mathf.Round(damage); // 소수점 제거 + float value = Mathf.Round(damage); + + // 데미지 이펙트 출력 + ShowDamage((int)value, critical, position); + return value; + } + + public void ShowDamage(int damage, bool isCritical, Vector3 position) + { + GameObject damageText = ObjectPoolManager.Instance.GetEffect("DamageEffect"); + damageText.transform.position = new Vector3(position.x, position.y + 1f, position.z); + damageText.GetComponent().SetDamage(damage, isCritical); } } } diff --git a/Gameton-06/Assets/Gameton/Scripts/Monster/MonsterBase.cs b/Gameton-06/Assets/Gameton/Scripts/Monster/MonsterBase.cs index b2eba723..47fe7b95 100644 --- a/Gameton-06/Assets/Gameton/Scripts/Monster/MonsterBase.cs +++ b/Gameton-06/Assets/Gameton/Scripts/Monster/MonsterBase.cs @@ -17,7 +17,7 @@ namespace TON public GameObject _hpBarImage; // HP 바 이미지 private float _maxHP; - private float currentHP; + public float currentHP { get; private set; } // 몬스터 현재 체력 private float hpMaxWidth; private MonsterData _monsterData; diff --git a/Gameton-06/Assets/Gameton/Scripts/Skill/Projectile.cs b/Gameton-06/Assets/Gameton/Scripts/Skill/Projectile.cs index 342b10b7..ed6c4882 100644 --- a/Gameton-06/Assets/Gameton/Scripts/Skill/Projectile.cs +++ b/Gameton-06/Assets/Gameton/Scripts/Skill/Projectile.cs @@ -42,15 +42,20 @@ namespace TON // TODO: 장비 공격력 반영 필요 // float damage = damageCalculator.CalculateBaseDamage(playerData.attackPower, playerData.equipmentAttack, playerData.defensivePower); - // 몬스터 방어력 의도값 계산 MonsterBase monsterBase = collision.GetComponent(); + + // 몬스터가 이전 피격으로 이미 죽은 경우우 + if (monsterBase.currentHP <= 0) + return; + + // 몬스터 방어력 의도값 계산 float calcMonsterDefence = monsterBase.defencePower / (monsterBase.defencePower + monsterBase.defenceIntention); - float damage = damageCalculator.CalculateBaseDamage(playerData.attackPower, 0, calcMonsterDefence); + float damage = damageCalculator.CalculateBaseDamage(playerData.attackPower * this.damage, 0, calcMonsterDefence); Debug.Log("Projectile" + damage); // 치명타 적용 - damage = damageCalculator.ApplyCriticalDamage(damage); + damage = damageCalculator.ApplyCriticalDamage(damage, collision.transform.position); collision.GetComponent().ApplyDamage(damage); ReleaseObject(); }