Menu
CoddyTech

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

Часть раздела Физика и игровой процесс путешествия по 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, только если такой компонент есть.

challenge icon

Задание

Средне

Пусть каждый выстрел будет эффективным. Bullet готов и вызывает TakeDamage(2) у того, во что попадает.

  1. В Health заполните TakeDamage(int amount): вычтите из hp значение Mathf.Max(amount - armor, 1).
  2. Выведите в журнал name + " hp: " + hp, например Dummy hp: 2.
  3. Когда 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
    }
}

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

Потренируйтесь самостоятельно: Песочница Unity