Unity Chapter 11-14. 좀비 TPS 게임 만들기 : Player Health
카테고리: Unity Lesson 1
태그: Unity Game Engine
인프런에 있는 이제민님의 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리한 필기입니다. 😀
🌜 [레트로의 유니티 C# 게임 프로그래밍 에센스] 강의 들으러 가기!
Chapter 11. 좀비 TPS 게임 만들기
📜PlayerHealth.cs
Player Character
에 붙여준다.
- 플레이어 캐릭터의 생명체로서의 동작을 담당
- LivingEntity를 상속 받아 상속 받은 생명체로서의 기본 동작 그 위에 플레이어 캐릭터만의 동작을 구현할 것이다.
- 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 갱신하는 역할을 할 것
- 그 다음 📜PlayerHealth 만의 함수인 UpdateUI() 함수를 실행하여 플레이어만의 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 갱신하는 역할을 할 것
- 그 다음 📜PlayerHealth 만의 함수인 UpdateUI() 함수를 실행하여 플레이어만의 UI 를 갱신
private void UpdateUI()
📜PlayerHealth 만의 함수로서 플레이어 체력의 UI를 갱신
private void UpdateUI()
{
UIManager.Instance.UpdateHealthText(dead ? 0f : health);
}
- 📜UIManager 는 싱글톤이자 UI에 관한 모든 요소를 얘가 담당하고 있다.
- 📜UIManager의 UpdateHealthText 함수에 체력을 인수로 넘겨 체력 UI 갱신
- 사망 상태면 0 을 넘기고 아니면 현재 체력을 넘김
dead
는 LivingEntity의 멤버 변수이므로 자식으로서 물려받아 사용이 가능.
- 사망 상태면 0 을 넘기고 아니면 현재 체력을 넘김
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 만의 피격 소리 재생
- 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 으로 넘겨질 것이다.
- 사망 소리 재생
- 사망 애니메이션을 재생시킬 트리거 업데이트
컴포넌트 설정
deathClip
,HitClip
에 오디오 클립을 위와같이 추가해준다.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기