Unity Chapter 11-13. 좀비 TPS 게임 만들기 : Living Entity

Date:     Updated:

카테고리:

태그:

인프런에 있는 이제민님의 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리한 필기입니다. 😀
🌜 [레트로의 유니티 C# 게임 프로그래밍 에센스] 강의 들으러 가기!


Chapter 11. 좀비 TPS 게임 만들기

📜LivingEntity.cs

플레이어 + 적 AI 등등 모든 '생명체'인 오브젝트들이 공유하는 기능들을 정의한 기반 클래스

  • 플레이어, 적 AI 등등 생명체 오브젝트들은 각각의 기능들을 구현하려면 이 클래스를 상속 받아 이 위에다가 자신만의 기능들을 덧붙이기만 하면 된다.

모든 생명체(플레이어 + 적AI)는 데미지를 입을 수 있으므로 IDamageable을 상속 받는다.

  • IDamageable 인터페이스의 순수 가상 함수인 ApplyDamage 함수를 반드시 구현해야 한다.
using System;
using UnityEngine;

public class LivingEntity : MonoBehaviour, IDamageable
{
    public float startingHealth = 100f;
    public float health { get; protected set; }
    public bool dead { get; protected set; }
    
    public event Action OnDeath;
    
    private const float minTimeBetDamaged = 0.1f;
    private float lastDamagedTime;

    protected bool IsInvulnerabe
    {
        get
        {
            if (Time.time >= lastDamagedTime + minTimeBetDamaged) return false;

            return true;
        }
    }
    
    protected virtual void OnEnable()
    {
        dead = false;
        health = startingHealth;
    }

    public virtual bool ApplyDamage(DamageMessage damageMessage)
    {
        if (IsInvulnerabe || damageMessage.damager == gameObject || dead) return false;

        lastDamagedTime = Time.time;
        health -= damageMessage.amount;
        
        if (health <= 0) Die();

        return true;
    }
    
    public virtual void RestoreHealth(float newHealth)
    {
        if (dead) return;
        
        health += newHealth;
    }
    
    public virtual void Die()
    {
        if (OnDeath != null) OnDeath();
        
        dead = true;
    }
}

멤버 변수/프로퍼티

    public float startingHealth = 100f;
    public float health { get; protected set; }
    public bool dead { get; protected set; }
    
    public event Action OnDeath;
    
    private const float minTimeBetDamaged = 0.1f;
    private float lastDamagedTime;

    protected bool IsInvulnerabe
    {
        get
        {
            if (Time.time >= lastDamagedTime + minTimeBetDamaged) return false;

            return true;
        }
    }
  • startingHealth
    • 모든 생명체들은 공통적으로 시작 체력이 100
    • 기본 시작 체력
  • health
    • 현재 체력
    • protected set 👉 현재 체력을 변경하는건 이 클래스 내부와 자식 클래스인 플레이어, 적AI 클래스 내부에서만 가능하다.
  • dead
    • 사망 여부
    • protected set 👉 사망 여부를 변경하는건 이 클래스 내부와 자식 클래스인 플레이어, 적AI 클래스 내부에서만 가능하다.
  • OnDeath
    • Action 타입의 이벤트
      • Action이란 👉 C#에서 미리 만들어져 제공하는 리턴 타입과 매개변수가 없는 함수(*void F()같은*)의 등록을 위한 델리게이트
      • C# 액션 포스트 참고
    • 생명체가 사망하면 실행할 처리들.
      • 생명체가 죽었을 때 실행할 외부 스크립트의 함수 처리들을 직접 호출하면 불필요한 외부 코드들도 들어가게 된다. 그 외부 스크립트들을 참조할 변수들을 전부 선언해주어야 해서.
      • 위처럼 외부에서 직접 실행하는것 보다는 외부 스크립트의 함수들이 해당 이벤트에 스스로를 등록하는 것이 코드가 더 간경하다.
  • minTimeBetDamaged
    • 공격과 공격 사이의 최소 대기 시간
  • lastDamagedTime
    • 최근에 공격을 당한 시점
  • IsInvulnerabe 프로퍼티
    • 무적. 공격 받을 수 있는 상태인지 여부
      • true면 무적. false면 공격을 받을 수 있는 상태.
    • lastDamagedTime + minTimeBetDamaged 시간 내에 공격을 당한 경우에는 무시할 것이다.
      • 이렇게 짧은 시간내에 공격 당하는 것을 무시해주지 않으면 매우 짧은시간동안 중복해서 공격이 들어가는 것으로 보이기 때문이다.
      • 예를 들어 근접공격할 때 공격을 한번만 했는데도 불구하고 물리적 오차 때문에 두번 부딪친것으로 인식된다면 데미지가 두배로 들어가니까 이런 현상들을 방지하고자!


멤버 함수

모두 virtual 가상 함수

  • 자식 클래스에서 오버라이딩 하지 않으면 이 내용 대로 가고,
  • 자식 클래스에서 오버라이딩 하면 자식 클래스에 오버라이딩 한 함수를 우선적으로 호출

protected virtual void OnEnable()

📜LivingEntity.cs 가 활성화 될 때마다 자동으로 1회 실행됨

생명체 상태 리셋

    protected virtual void OnEnable()
    {
        dead = false;
        health = startingHealth;
    }
  • 사망한 상태 ❌ 살아 있는 상태
  • 현재 체력은 100 에서 시작


public virtual bool ApplyDamage(DamageMessage damageMessage)

IDamageable의 자식으로서 반드시 구현해야 할 함수.

데미지 받기

  • 성공적으로 데미지를 받았다면 true 리턴
  • 데미지를 받지 않았다면 false 리턴
    1. 무적 상태
    2. 데미지 주는게 나 자신
    3. 이미 죽은 상태
    public virtual bool ApplyDamage(DamageMessage damageMessage)
    {
        if (IsInvulnerabe || damageMessage.damager == gameObject || dead) return false;

        lastDamagedTime = Time.time;
        health -= damageMessage.amount;
        
        if (health <= 0) Die();

        return true;
    }
  • ‘무적 상태’거나 ‘데미지를 주는게 나 자신’이거나 ‘죽었거나’ 하면 리턴 false 하고 종료
  • lastDamagedTime 을 현재 시간으로 업데이트
  • health를 데미지 양 받은것 만큼 차감
  • health가 0 이하면 죽음 Die() 함수 호출


public virtual void RestoreHealth(float newHealth)

자기 자신의 체력 회복

  • 추가할만큼의 체력을 인수로 받음
    public virtual void RestoreHealth(float newHealth)
    {
        if (dead) return;
        
        health += newHealth;
    }
  • 이미 죽었다면 실행 X
  • 체력 회복 health += newHealth


public virtual void Die()

    public virtual void Die()
    {
        if (OnDeath != null) OnDeath();
        
        dead = true;
    }
  • OnDeath != null
    • 즉, OnDeath 이벤트에 최소 하나 이상의 함수가 등록 되어 있다면 OnDeath() 함수 실행
  • 사망한 상태로 변경
    • dead = true


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기


Unity Lesson 1 카테고리 내 다른 글 보러가기

댓글 남기기