체력과 피해
Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 63개 중 53번째.
피해 시스템에는 두 개의 스크립트가 필요합니다. Health 스크립트는 피해를 입을 수 있는 모든 오브젝트에 부착되어 체력을 관리하고, 피해를 주는 오브젝트는 해당 스크립트를 찾아 메서드를 호출합니다. 다음은 세 번 맞으면 부서지는 상자와 그 위에 착지하는 모든 오브젝트에 피해를 주는 가시의 Health 스크립트입니다:
public class Health : MonoBehaviour
{
[SerializeField] private int hp = 3;
public void TakeDamage(int amount)
{
hp -= amount;
if (hp <= 0)
{
Destroy(gameObject);
}
}
}public class Spikes : MonoBehaviour
{
void OnCollisionEnter(Collision collision)
{
Health health = collision.gameObject.GetComponent<Health>();
if (health != null)
{
health.TakeDamage(1);
}
}
}TakeDamage는 public이므로 다른 스크립트에서 호출할 수 있고, hp를 변경하는 코드는 이것뿐입니다. 가시, 총알, 용암은 모두 같은 메서드를 호출하며, 0이 무엇을 의미하는지는 Health 스크립트만 결정합니다. 상자를 파괴하거나, 게임을 끝내거나, 사망 애니메이션을 재생할 수 있습니다. 각 스크립트는 클래스 이름을 딴 별도의 파일에 저장됩니다.
GetComponent<Health>()는 바닥처럼 Health가 없는 오브젝트에 대해 null을 반환하므로, 가시는 호출하기 전에 확인합니다. TryGetComponent(out Health health)는 조회와 확인을 한 번의 호출로 처리합니다. Health가 있을 때만 true를 반환하고 health에 값을 채웁니다.
챌린지
중급훈련용 총이 더미와 갑옷을 입은 기사에게 발사됩니다. 총의 Shooter 스크립트는 준비되어 있습니다. 왼쪽 및 오른쪽 화살표 키로 총을 돌리고, 스페이스바를 눌러 총알을 발사합니다. 명중 시 피해가 적용되도록 스크립트 두 개를 작성하세요.
더미와 기사에 적용되는 Health(Inspector에서 hp와 armor를 설정합니다):
- 공개 메서드
TakeDamage(int amount):hp를amount에서armor를 뺀 값만큼 감소시키되, 항상 최소 1만큼 감소시킵니다. - 명중할 때마다 객체의 이름과 남은 hp를
Dummy hp: 2와 같이 로그에 기록합니다. - hp가 0 이하가 되면 객체를 제거합니다.
각 총알에 적용되는 Bullet(Inspector에서 damage를 2로 설정합니다):
- 총알이 Health가 있는 대상에 명중하면 해당 대상의
TakeDamage(damage)를 호출합니다. - 무엇에 명중하든, 벽을 포함해 총알을 제거합니다.
Play를 눌러 더미와 기사를 쓰러뜨린 다음 Check를 누르세요.
직접 해보기
using UnityEngine;
public class Health : MonoBehaviour
{
[SerializeField] private int hp = 4;
[SerializeField] private int armor = 0;
public void TakeDamage(int amount)
{
// amount에서 armor를 뺀 만큼(최소 1) 체력을 잃고, 남은 체력을 로그에 기록한 뒤 0이 되면 파괴
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.