Menu
CoddyTech

Здоровье и урон

Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 53 из 63.

Для урона нужны два скрипта. Скрипт 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 только в том случае, если компонент найден.

challenge icon

Задание

Средне

Тренировочный пистолет стреляет по манекену и бронированному рыцарю. Скрипт 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)
    {
        // уменьшить hp на amount минус armor (минимум на 1), вывести в лог оставшееся значение, уничтожить при 0
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Физика и игровой процесс