
void OnTriggerEnter2D(Collider2D other)
{
// 무적 시간 안이거나 애니메이션이 Hurt 상태일 때 무시
if (m_invincibleTimer > 0f || m_animator.GetCurrentAnimatorStateInfo(0).IsName("Hurt"))
return;
// 몬스터의 공격력 가져오기
Monster_Stats monsterStats = other.GetComponentInParent<Monster_Stats>();
float damage = 0f;
if (monsterStats != null)
{
damage = monsterStats.GetCurrentAttackDamage();
}
// 몬스터의 공격 방향 계산
float MonsterX = other.transform.position.x;
float HeroFacing = -m_animator.transform.localScale.x;
float attackDirection = Mathf.Sign(MonsterX - transform.position.x);
bool isFacing = (HeroFacing * attackDirection) > 0f;
//패링 방향이나 가드 방향의 실패
if (m_animator.GetBool("Guard") && !isFacing || m_animator.GetBool("IsParrying") && !isFacing)
{
Debug.Log("Hit by " + other.transform.parent.name);
m_animator.SetTrigger("Hurt");
m_stats.TakeDamage(damage); // 히어로 체력 감소
}
// 가드 성공
else if (m_animator.GetBool("Guard"))
{
if (isFacing)
{
if (isPerfectGuard)
{
//퍼펙트 가드 성공
m_stats.TakeDamage(0f); // 완벽 방어 시 데미지 100% 감소
}
else
{
//가드 성공
m_stats.TakeDamage(damage * 0.2f); // 방어 시 데미지 80% 감소
}
}
}
// 패링 성공
else if (m_animator.GetBool("PerfectParrying"))
{
Debug.Log("Parrying " + other.transform.parent.name);
if (m_animator.GetInteger("ParryLevel") == 2)
{
// 완벽한 패링
m_stats.ApplyParryingBonus(2.0f);
}
else if (m_animator.GetInteger("ParryLevel") == 1)
{
// 중간 패링
m_stats.ApplyParryingBonus(1.5f);
}
}
// 맞음
else
{
Debug.Log("Hit by " + other.transform.parent.name);
m_animator.SetTrigger("Hurt");
m_stats.TakeDamage(damage); // 히어로 체력 감소
m_stats.ApplyParryingBonus(1.0f); // 패링 보너스 초기화
}
// 죽음
if (m_stats.currentHealth <= 0f)
{
Debug.Log("Hero is dead.");
m_animator.SetBool("Death", true); // 죽음 애니메이션 재생
GetComponent<Collider2D>().enabled = false; // 히어로의 콜라이더 비활성화
return ;
}
else
{
Debug.Log("Hero current health: " + m_stats.currentHealth);
}
// 무적 타이머 시작
m_invincibleTimer = invincibleDuration;
}
차지 단계에 따라 딜을 다르게 함.
공격에 맞았을 때, 몬스터의 공격력을 가져와 어디서 때렸는지 확인, 이후 패링이나 가드를 명확한 방향인지 확인하고, 데미지를 추가하거나 맞음.
Particle System + 적중 위치에 Instantiate 조합으로 할 생각.
if (bloodEffectPrefab != null)
{
// 피 이펙트 생성
Vector3 hitPosition = other.ClosestPoint(transform.position);
GameObject bloodEffect = Instantiate(bloodEffectPrefab, hitPosition, Quaternion.identity);
Destroy(bloodEffect, 1f); // 1초 후에 피 이펙트 삭제
}
피 이펙트 만들고 이를 그냥 집어놓고 위치에서 발동하게 수정하면 끝. 이와 같이 퍼펙트 패링 이펙트 등도 넣으면 될 듯
패링이 초반에 내가 손을 뗏을 때 무조건 앞의 애니메이션을 진행하고 (차징 단계) 이후 휘두르기 단계를 나갔으면 했다. 그런데 손을 놓자마자 계속 휘두르기 단계가 나왔다. 이렇게 되면 모든 패턴을 패링으로 처리가 가능하다. 이를 처리하려고 트리거도 만들고 bool값도 만들고 별걸 다 했는데 오류가 났다.
그러다가 단순히 지금 사용하는 ParryLevel을 사용해서 그걸 int값 1을 더 추가한 다음, 그 값이 되야만 Parrying1이 작동하게 만들면 된다는 아주 간단한(?) 아이디어가 떠올랐다.
Parrying 이후에는 무조건 휘두르기 단계인 Parrying1, 2, 3 만 Transition이 있으니 당연한 거였다...
만들어보니 너무도 간단하고 깔끔하게 작동했다.
else if (m_animator.GetBool("PerfectParrying"))
{
Debug.Log("Parrying " + other.transform.parent.name);
if (m_animator.GetInteger("ParryLevel") == 3)
{
// 완벽한 패링
m_stats.ApplyParryingBonus(2.0f);
}
else if (m_animator.GetInteger("ParryLevel") == 2)
{
// 중간 패링
m_stats.ApplyParryingBonus(1.5f);
}
}
히어로의 피격시 만약 퍼펙트 패링 판정이면 데미지 추가를 했었는데, 이렇게 하면, 패링 자체에도 데미지가 달려있어 몬스터에 데미지를 주는 판정, 내가 맞는 판정 모두
void OnTriggerEnter2D(Collider2D other)로 작동하게 된다.
근데 이러면 ParryLevel에 따른 데미지 증가가 충돌 판정에 따라 정확히 적용되지 않을 수 있다고 생각했다.
몬스터의 충돌판정이 먼저인지 Hero의 충돌판정이 먼저인지를 확신할 수 없던 것. 그래서 아예 차징 단계에서 데미지가 올라가게 수정했다.