Здоровье и урон
Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 55 из 71.
Для нанесения урона нужны два скрипта. Скрипт 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. Шипы, пули и лава вызывают один и тот же метод, а только скрипт Health решает, что означает 0: уничтожить ящик, завершить игру или воспроизвести анимацию смерти. Каждый скрипт находится в отдельном файле, названном в соответствии с его классом.
GetComponent<Health>() возвращает null для объектов без Health, например для пола, поэтому шипы проверяют результат перед вызовом. TryGetComponent(out Health health) выполняет поиск и проверку за один вызов: он возвращает true и заполняет health, только если такой компонент есть.
Задание
СреднеПусть каждый выстрел будет эффективным. Bullet готов и вызывает TakeDamage(2) у того, во что попадает.
- В
HealthзаполнитеTakeDamage(int amount): вычтите изhpзначениеMathf.Max(amount - armor, 1). - Выведите в журнал
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)
{
// уменьшить hp на amount минус armor (минимум на 1), вывести в лог оставшееся значение, уничтожить при 0
}
}
Все уроки раздела Физика и игровой процесс
1Твёрдое тело
Гравитация и массаТолкаем с помощью AddForceПрыжок с импульсомFixedUpdate для физикиСкоростьКинематические телаПовторение: пусковая площадка4Корутины
InvokeInvokeRepeating, CancelInvokeВаша первая корутинаЦиклы в корутинахОстановка корутинПовторение: обратный отсчёт10Проект: Побег с арены
АренаОхотники2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Монетная гонка
Катящийся шарСобираем монетыПотренируйтесь самостоятельно: Песочница Unity