-
Notifications
You must be signed in to change notification settings - Fork 2
develop TakeDamage
Yoo Hyeokjin edited this page Jun 28, 2023
·
2 revisions
피격과 관련된 interface Method이다.
public interface IDamageable
{
public void TakeDamage(float damage, int weaponIndex);
}
- Enemy의 체력에 직접 접근해야 하기 때문에 Enemy.cs에 TakeDamage를 정의하고 Weapon.cs에서는 OnTriggerEnter2D에서 이를 사용한다.
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수를 증가시킨다.
}
}
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 증가시킨다.
}
}
}
}
}
- Player의 체력에 직접 접근해야 하기 때문에 Character.cs에 TakeDamage를 정의하고 Enemy.cs에서는 OnCollisionStay2D에서 이를 사용한다.
[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가 사용된다.
}
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를 공격하라
}