체력과 피해
Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 71개 중 55번째.
피해 처리에는 두 개의 스크립트가 필요합니다. 다칠 수 있는 모든 오브젝트에는 체력을 관리하는 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에 값을 채웁니다.
챌린지
중급명중할 때마다 피해를 줍니다. Bullet은 준비되어 있으며, 맞힌 대상에 TakeDamage(2)를 호출합니다.
Health에서TakeDamage(int amount)를 완성하세요.Mathf.Max(amount - armor, 1)만큼hp에서 빼세요.name + " hp: " + hp를 로그로 출력하세요. 예를 들어Dummy hp: 2와 같이 출력됩니다.hp <= 0일 때Destroy(gameObject);를 호출하세요.
‘플레이’를 누르고 더미를 두 번 쏘세요. Dummy hp: 2가 로그에 출력된 다음 더미가 사라집니다. 그런 다음 ‘확인’을 누르세요.
직접 해보기
using UnityEngine;
public class Health : MonoBehaviour
{
[SerializeField] private int hp = 4;
[SerializeField] private int armor = 0;
public void TakeDamage(int amount)
{
// armor를 뺀 amount만큼(최소 1) hp를 줄이고, 남은 hp를 로그에 기록한 뒤 0이 되면 오브젝트를 파괴한다
}
}
물리와 게임플레이의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드