Skip to content

develop TakeDamage

Yoo Hyeokjin edited this page Jun 28, 2023 · 2 revisions

TakeDamage

피격과 관련된 interface Method이다.

public interface IDamageable
{
    public void TakeDamage(float damage, int weaponIndex);
}

Weapon이 Enemy, MapObject피격

  • Enemy의 체력에 직접 접근해야 하기 때문에 Enemy.cs와 DestructibleObject.cs에 TakeDamage를 정의하고 Weapon.cs에서는 OnTriggerEnter2D에서 이를 사용한다.

Enemy.cs

public void TakeDamage(float damage, int weaponIndex) // 적이 damage를 입는 함수
{
    mHealth -= damage; // Enemy의 체력에서 damage를 뺀다.
    GameManager.instance.WeaponDamage[weaponIndex] += damage; // GameManager에 저장된 Weapon당 Damage를 저장하는 변수에 해당 Damage를 저장한다.

    if (mHealth > 0) // 체력이 남았다면
    {
        StartCoroutine(KnockBack()); // 넉백을 실행시킨다.
        mAnim.SetTrigger("Hit"); // Hit Animation을 Set한다.
        Debug.Log("Hit");
        if(weaponIndex == 6) // 맞는 무기가 Gralic이라면 넉백 수치를 증가시킨다.
        {
            if(mKnockbackpower < 3) // 넉백 수치가 3이하면
            {
                mKnockbackpower++; // 넉백 수치를 증가시킨다.
            }
        }
    }
    else // 체력이 없다. 즉 죽었다면
    {
        mbLive = false;
        mColl.enabled = false;
        mRb.simulated = false;
        mSpriter.sortingOrder = 1;
        mAnim.SetBool("Dead", true);
        GameManager.instance.Kill++; // GameManager에 저장된 Kill수를 증가시킨다.
        Dead();
        GameManager.instance.KillCount[weaponIndex]++; // GameManager에 저장된 Wepaon당 Kill수를 증가시킨다.
    }
}

DestructibleObject.cs

using UnityEngine;

public class DestructibleObject : MonoBehaviour,IDamageable
{ // 공격당하면 해당 gameObject 삭제하고 Item Drop 한다.
    public void TakeDamage(float damage, int weaponIndex)
    {
        //position 위치에 Drop 생성
        gameObject.GetComponent<DropSystem>().OnDrop(gameObject.transform.position);
        Destroy(gameObject); 
    }
}

Weapon.cs

private void OnTriggerEnter2D(Collider2D col) // 물체와 접촉하였을 때
{
    if (col.CompareTag("DestructibleObj")) // Trigger한 물체가 파괴 가능한 MapOject 일 때
    {
        if (col.gameObject.TryGetComponent(out DestructibleObject destructible))
        {
            destructible.TakeDamage(WeaponTotalStatList[(int)Enums.EWeaponStat.Might], WeaponIndex); // 해당 Object에 TakeDamage Method를 실행시켜 Damage를 입힌다.
        }
    }
    if (col.gameObject.tag == "Monster") // Trigger한 물체가 Enemy 일 때
    {
        col.gameObject.GetComponent<Enemy>().TakeDamage(WeaponTotalStatList[(int)Enums.EWeaponStat.Might], WeaponIndex); // 해당 Enemy의 TakeDamage Method를 실행시켜 Damage를 입힌다.
        if (WeaponIndex == 6 && BEvolution) // 무기가 진화된 Gralic이면 
        {
            GameManager.instance.Character.RestoreHealth(1); // Character의 체력을 1 회복시킨다.
            GameManager.instance.EvoGralicRestoreCount++;    // EvoGralic으로 회복한 양을 1 증가시킨다.
            if (GameManager.instance.EvoGralicRestoreCount <= 3600 && GameManager.instance.EvoGralicRestoreCount > 0)
            {  // EvoGralic은 공격력이 최대 60까지 증가할 수 있으니까 회복량을 0 < x <= 3600까지만 감지해서 공격력을 증가시켜야 한다.
                if (GameManager.instance.EvoGralicRestoreCount % 60 == 0)
                {
                    WeaponTotalStatList[((int)Enums.EWeaponStat.Might)] += 1; // 회복한 양이 60이면 공격력을 1 증가시킨다.
                }
            }
        }
    }
}

Enemy가 Player 피격

  • Player의 체력에 직접 접근해야 하기 때문에 Character.cs에 TakeDamage를 정의하고 Enemy.cs에서는 OnCollisionStay2D에서 이를 사용한다.

Character.cs

[SerializeField] HealthBar mHpBar; // Player Prefab에 들어있는 HealthBar를 저장하는 변수

public void TakeDamage(float damage, int weaponIndex)
{
    if (mbDead == true) return; // Character가 죽었다면 return
    if (damage - mArmor <= 0) // Character의 방어력이 Damage 보다 높다면
    {
        mCurrentHp -= Time.deltaTime * 0 * 2; // 0의 Damage가 현재 체력에 들어간다.
    }
    else
    {
        mCurrentHp -= Time.deltaTime * (damage - mArmor) * 2; // (damage - 방어력)의 Damage가 현재 체력에 들어간다.
    }
    if (mCurrentHp <= 0) // Character의 Hp가 0이하, 즉 죽었다면 
    {
        GameManager.instance.GameOverPanelUp(); // GameOver창을 띄우고
        mbDead = true;                          // Player의 죽음을 저장한다.
    }
    mHpBar.SetState(mCurrentHp, mMaxHp);        // HealthBar의 SetState(현재체력, 최대체력) Method가 사용된다.
}

Enemy

mTargetGameObject = GameManager.instance.Player.gameObject; // Player, 즉 Character gameObject 저장

private void OnCollisionStay2D(Collision2D col)
{
    if (col.gameObject == mTargetGameObject) { 
        Attack(); // Character와 Enemy와 충돌했을 때 Attack()하라
    } 
}

private void Attack()
{
    if (mTargetCharacter == null)
    {
        mTargetCharacter = Target.GetComponent<Character>();
    }
    mTargetCharacter.TakeDamage(EnemyData.Power, 0); // Enemy의 공격력으로 Character를 공격하라
}  
Clone this wiki locally