Unity Chapter 11-13. 좀비 TPS 게임 만들기 : Living Entity
카테고리: Unity Lesson 1
태그: Unity Game Engine
인프런에 있는 이제민님의 레트로의 유니티 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# 액션 포스트 참고
- 생명체가 사망하면 실행할 처리들.
- 생명체가 죽었을 때 실행할 외부 스크립트의 함수 처리들을 직접 호출하면 불필요한 외부 코드들도 들어가게 된다. 그 외부 스크립트들을 참조할 변수들을 전부 선언해주어야 해서.
- 위처럼 외부에서 직접 실행하는것 보다는 외부 스크립트의 함수들이 해당 이벤트에 스스로를 등록하는 것이 코드가 더 간경하다.
- Action 타입의 이벤트
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 리턴
- 무적 상태
- 데미지 주는게 나 자신
- 이미 죽은 상태
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
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기