Unity Chapter 11-14. 좀비 TPS 게임 만들기 : Player Health

Date:     Updated:

카테고리:

태그:

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


Chapter 11. 좀비 TPS 게임 만들기

📜PlayerHealth.cs

Player Character에 붙여준다.

  • 플레이어 캐릭터의 생명체로서의 동작을 담당
    • LivingEntity를 상속 받아 상속 받은 생명체로서의 기본 동작 그 위에 플레이어 캐릭터만의 동작을 구현할 것이다.
      • LivingEntity 위에서 확장만 하면 됨
using UnityEngine;

// UI 관련 코드

// 플레이어 캐릭터의 생명체로서의 동작을 담당
public class PlayerHealth : LivingEntity
{
    private Animator animator;  
    private AudioSource playerAudioPlayer; // 플레이어 소리 재생기

    public AudioClip deathClip; // 사망 소리
    public AudioClip hitClip; // 피격 소리


    private void Awake()
    {
        // 사용할 컴포넌트를 가져오기
        playerAudioPlayer = GetComponent<AudioSource>();
        animator = GetComponent<Animator>();
    }

    protected override void OnEnable()
    {
        // LivingEntity의 OnEnable() 실행 (상태 초기화)
        base.OnEnable();
        UpdateUI();
    }

    // 체력 회복
    public override void RestoreHealth(float newHealth)
    {
        // LivingEntity의 RestoreHealth() 실행 (체력 증가)
        base.RestoreHealth(newHealth);
        // 체력 갱신
        UpdateUI();
    }

    private void UpdateUI()
    {
        UIManager.Instance.UpdateHealthText(dead ? 0f : health);
    }

    // 데미지 처리
    public override bool ApplyDamage(DamageMessage damageMessage)
    {
        if (!base.ApplyDamage(damageMessage)) return false;

        EffectManager.Instance.PlayHitEffect(damageMessage.hitPoint, damageMessage.hitNormal, transform, EffectManager.EffectType.Flesh);
        playerAudioPlayer.PlayOneShot(hitClip);

        // LivingEntity의 OnDamage() 실행(데미지 적용)
        // 갱신된 체력을 체력 슬라이더에 반영
        UpdateUI();
        return true;
    }

    // 사망 처리
    public override void Die()
    {
        // LivingEntity의 Die() 실행(사망 적용)
        base.Die();

        // 체력 슬라이더 비활성화
        UpdateUI();
        // 사망음 재생
        playerAudioPlayer.PlayOneShot(deathClip);
        // 애니메이터의 Die 트리거를 발동시켜 사망 애니메이션 재생
        animator.SetTrigger("Die");
    }
}


멤버 변수

    private Animator animator;  
    private AudioSource playerAudioPlayer; // 플레이어 소리 재생기

    public AudioClip deathClip; // 사망 소리
    public AudioClip hitClip; // 피격 소리
  • animator
    • Player Character의 애니메이터 컴포넌트 정보를 가져온다.
  • playerAudioPlayer 플레이어 소리 재생기
  • deathClip 사망 소리
  • hitClip 피격 소리

상속 받은 멤버 변수

    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
  • LivingEntity로부터 상속받은 위 멤버 변수들도 가지고 있다는 것에 유념하기


멤버 함수

부모 클래스 LivingEntity의 가상 함수들을 오버라이딩 하고 있다.

private void Awake()

사용할 컴포넌트를 가져오기. playerAudioPlayer, animator

    private void Awake()
    {
        // 사용할 컴포넌트를 가져오기
        playerAudioPlayer = GetComponent<AudioSource>();
        animator = GetComponent<Animator>();
    }


protected override void OnEnable()

상태 초기화 + UI 갱신(초기 체력)

    protected override void OnEnable()
    {
        // LivingEntity의 OnEnable() 실행 (상태 초기화)
        base.OnEnable();  
        UpdateUI();
    }
  • base.OnEnable();
    • LivingEntity 의 OnEnable() 함수 실행
    • 모든 생명체들이 공통으로, 이 스크립트가 활성화 되면 체력을 초기화 하는 등등 이런 처리들을 담당.
  • UpdateUI();
    • 그 다음 📜PlayerHealth 만의 함수인 UpdateUI() 함수를 실행하여 플레이어만의 UI 를 갱신
      • 여기서 📜UIManager의 UpdateHealthText 함수에 체력을 인수로 넘겨 체력 UI 갱신하는 역할을 할 것


public override void RestoreHealth(float newHealth)

상태 초기화 + UI 갱신(회복된 체력)

    public override void RestoreHealth(float newHealth)
    {
        // LivingEntity의 RestoreHealth() 실행 (체력 증가)
        base.RestoreHealth(newHealth);
        // 체력 갱신
        UpdateUI();
    }
  • base.RestoreHealth(newHealth);
    • LivingEntity 의 RestoreHealth(newHealth) 함수 실행
    • 체력 갱신시 모든 생명체들이 공통으로 행하는 처리를 먼저 실행한 후
  • UpdateUI()
    • 그 다음 📜PlayerHealth 만의 함수인 UpdateUI() 함수를 실행하여 플레이어만의 UI 를 갱신
      • 여기서 📜UIManager의 UpdateHealthText 함수에 체력을 인수로 넘겨 체력 UI 갱신하는 역할을 할 것


private void UpdateUI()

📜PlayerHealth 만의 함수로서 플레이어 체력의 UI를 갱신

    private void UpdateUI()
    {
        UIManager.Instance.UpdateHealthText(dead ? 0f : health);
    }
  • 📜UIManager 는 싱글톤이자 UI에 관한 모든 요소를 얘가 담당하고 있다.
  • 📜UIManager의 UpdateHealthText 함수에 체력을 인수로 넘겨 체력 UI 갱신
    • 사망 상태면 0 을 넘기고 아니면 현재 체력을 넘김
      • dead는 LivingEntity의 멤버 변수이므로 자식으로서 물려받아 사용이 가능.


public override bool ApplyDamage(DamageMessage damageMessage)

데미지 입은 처리(파티클 효과, 소리 재생) + UI 갱신(갱신된 체력 반영)

    public override bool ApplyDamage(DamageMessage damageMessage)
    {
        if (!base.ApplyDamage(damageMessage)) return false;

        EffectManager.Instance.PlayHitEffect(damageMessage.hitPoint, damageMessage.hitNormal, transform, EffectManager.EffectType.Flesh);
        playerAudioPlayer.PlayOneShot(hitClip);

        // LivingEntity의 OnDamage() 실행(데미지 적용)
        // 갱신된 체력을 체력 슬라이더에 반영
        UpdateUI();
        return true;
    }
  • 데미지를 입는데 성공하지 못했다면 실행하지 않고 false
    • base.ApplyDamage(damageMessage) 을 실행하므로
      • 데미지 입은 만큼 이 함수 내부에서 체력이 깎이게 된다.
      • 이 함수 내부에서 죽으면 Die() 함수도 호출한다.
        • virtual - override 관계이니 만큼 이때의 Die()는 📜PlayerHelath의 오버라이딩된 Die()를 호출
  • 데미지를 입는데 성공 했다면
    • Player 만의 파티클 효과 재생
      • Flesh 파티클 재생(피튀는 효과)
    • Player 만의 피격 소리 재생
  • 깎인 체력을 반영하기 위한 UI 갱신


public override void Die()

사망처리 + UI 갱신

    public override void Die()
    {
        // LivingEntity의 Die() 실행(사망 적용)
        base.Die();

        // 체력 슬라이더 비활성화
        UpdateUI();
        // 사망음 재생
        playerAudioPlayer.PlayOneShot(deathClip);
        // 애니메이터의 Die 트리거를 발동시켜 사망 애니메이션 재생
        animator.SetTrigger("Die");
    }
  • base.Die();
    • OnDeath 액션 이벤트를 실행하고
    • dead = true 로 상태를 변경한다.
  • UpdateUI();
    • dead = true 가 되었으므로 체력 0 으로 넘겨질 것이다.
  • 사망 소리 재생
  • 사망 애니메이션을 재생시킬 트리거 업데이트


컴포넌트 설정

image

  • deathClip, HitClip에 오디오 클립을 위와같이 추가해준다.


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

맨 위로 이동하기


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

댓글 남기기