feat: 몬스터 피격시 데미지 텍스트 이펙트 추가

This commit is contained in:
aube.lee
2025-02-26 11:20:24 +09:00
parent f7cdaa7178
commit c8059ce769
10 changed files with 466 additions and 8 deletions

View File

@@ -29,13 +29,17 @@ namespace TON
// TODO: 장비 공격력 반영 필요
// float damage = damageCalculator.CalculateBaseDamage(playerData.attackPower, playerData.equipmentAttack, playerData.defensivePower);
// 몬스터 방어력 의도값 계산
MonsterBase monsterBase = collision.GetComponent<MonsterBase>();
// 몬스터가 이전 피격으로 이미 죽은 경우우
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<IDamage>().ApplyDamage(damage);
}

View File

@@ -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<Canvas>();
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);
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 8c86fdd904c9e8d41a93d1249c02a506
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -33,15 +33,28 @@ namespace TON
/// <summary>
/// 치명타 적용 (치명타 확률이 0보다 클 경우에만 적용)
/// </summary>
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<DamageEffect>().SetDamage(damage, isCritical);
}
}
}

View File

@@ -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;

View File

@@ -42,15 +42,20 @@ namespace TON
// TODO: 장비 공격력 반영 필요
// float damage = damageCalculator.CalculateBaseDamage(playerData.attackPower, playerData.equipmentAttack, playerData.defensivePower);
// 몬스터 방어력 의도값 계산
MonsterBase monsterBase = collision.GetComponent<MonsterBase>();
// 몬스터가 이전 피격으로 이미 죽은 경우우
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<IDamage>().ApplyDamage(damage);
ReleaseObject();
}