Руководство по реализации здоровья и смерти в Unity

Самое главное помнить, что

  • Смерть – это не просто удаление объекта. Это событие, которое должно сопровождаться анимацией, звуком, эффектами и, возможно, вознаграждением для игрока.
  • Безопасность кода: всегда проверяйте, что здоровье не может стать отрицательным, и что после смерти объект не реагирует на дальнейшие коллизии.
  • Оптимизация: если у вас в сцене много врагов, используйте пул объектов (Object Pooling) вместо создания/удаления при каждой смерти.

Пошаговое руководство

Создайте компонент Health

Ниже – простейший скрипт, который хранит здоровье врага и отвечает за получение урона.

using UnityEngine;

public class Health : MonoBehaviour
{
 [Header("Health Settings")]
 public int maxHealth = 100;
 [ReadOnly] public int currentHealth;

 public UnityEngine.Events.UnityEvent onDeath;

 private void Awake
 {
 currentHealth = maxHealth;
 }

 public void TakeDamage(int dmg)
 {
 currentHealth -= dmg;
 if (currentHealth <= 0)
 {
 Die;
 }
 }

 private void Die
 {
 // Вызов события смерти, чтобы остальные компоненты реагировали
 onDeath?.Invoke;

 // Отключаем коллайдеры и скрипты, чтобы враг перестал взаимодействовать
 GetComponent.enabled = false;
 GetComponent?.enabled = false;
 // Здесь можно добавить анимацию, эффекты и т.д.
 // После этого объект можно вернуть в пул
 Destroy(gameObject, 5f); // Удаляем через 5 секунд
 }
}

Добавьте логику получения урона

В большинстве случаев урон наносится из другого скрипта (например, у игрока или оружия). В этом примере показано, как вызывать TakeDamage из скрипта «Пробой».

public class Projectile : MonoBehaviour
{
 public int damage = 25;

 private void OnTriggerEnter(Collider other)
 {
 Health enemyHealth = other.GetComponent;
 if (enemyHealth != null)
 {
 enemyHealth.TakeDamage(damage);
 Destroy(gameObject); // Уничтожаем снаряд
 }
 }
}

Реализуйте смерть

В методе Die можно добавить:

  • Запуск анимации смерти (Animator.SetTrigger("Die"))
  • Воспроизведение звука (AudioSource.PlayClipAtPoint)
  • Появление эффекта взрыва (Instantiate частицы)
  • Подарок игроку (добавление очков, опыта)

Добавьте анимацию смерти

Создайте в Animator параметр bool isDead и триггер DieTrigger. В скрипте:

Animator animator;

private void Awake
{
 animator = GetComponent;
 currentHealth = maxHealth;
}

private void Die
{
 animator.SetTrigger("DieTrigger");
 // остальная логика
}

Очистка и возвращение в пул

Если вы используете объектный пул, вместо Destroy вызывайте метод ReturnToPool и надёжно сбрасывайте состояние:

public void Reset
{
 currentHealth = maxHealth;
 GetComponent.enabled = true;
 GetComponent?.enabled = true;
 gameObject.SetActive(true);
}

Полный пример кода (Health.cs)

Ниже приведён готовый скрипт, который можно сразу подключить к любому врагу.

using UnityEngine;
using UnityEngine.Events;

/// <b>Health.cs</b> – компонент здоровья и смерти
/// Предназначен для 3D и 2D врагов.
/// Поддерживает события, анимацию и объектный пул.
public class Health : MonoBehaviour
{ [Header("Health Settings")]
 [Tooltip("Максимальное количество здоровья")]
 public int maxHealth = 100;

 [ReadOnly] [Tooltip("Текущее здоровье")]
 public int currentHealth;

 [Header("Death Settings")]
 public Animator animator; // Аниматор для смерти
 public string dieTrigger = "Die"; // Параметр Animator
 public AudioClip deathSound; // Звук смерти
 public ParticleSystem deathEffect; // Эффект

 public UnityEvent onDeath; // Событие, которое можно подписать в Inspector

 private bool isDead = false;

 private void Awake
 {
 if (animator == null) animator = GetComponent;
 currentHealth = maxHealth;
 }

 /// <b>Получить урон</b>
 public void TakeDamage(int dmg)
 {
 if (isDead) return;
 currentHealth -= dmg;
 if (currentHealth <= 0)
 {
 Die;
 } }

 /// <b>Смерть врага</b>
 private void Die
 {
 if (isDead) return;
 isDead = true;

 // Вызов событий
 onDeath?.Invoke;

 // Анимация
 if (animator != null) animator.SetTrigger(dieTrigger);

 // Звук
 if (deathSound != null)
 AudioSource.PlayClipAtPoint(deathSound, transform.position);

 // Эффект
 if (deathEffect != null)
 Instantiate(deathEffect, transform.position, Quaternion.identity);

 // Отключить коллайдеры и другие скрипты
 Collider col = GetComponent;
 if (col != null) col.enabled = false;


 // Отложенное уничтожение (для анимации)
 Destroy(gameObject, 5f);
 }

 /// <b>Сброс состояния (для пула)</b>
 public void Reset
 {
 isDead = false;
 currentHealth = maxHealth;
 GetComponent.enabled = true;
 gameObject.SetActive(true);
 }}

Лучшие практики и советы

  • Проверяйте наличие нужных компонентов – например, Animator может отсутствовать у простых 2D врагов.
  • Используйте UnityEvent для гибкой настройки поведения при смерти (выдача опыта, открытие сундука, изменение UI).
  • Сохраняйте currentHealth в ReadOnly поле, чтобы видеть его в инспекторе.
  • Если ваш враг имеет несколько способностей, добавляйте OnDeath в Health и подписывайте остальные скрипты.
  • Для больших проектов используйте ScriptableObject для хранения характеристик врагов (HP, урон, скорость).

Часто задаваемые вопросы

  1. Как добавить эффект «падения» после смерти?

    Создайте анимацию «Fall» в Animator и вызывать animator.SetTrigger("Fall") после Die.
  2. Можно ли сделать «пульсирующую» анимацию, пока враг жив?

    Добавьте в Animator параметр float HealthPercent и используйте Animator.SetFloat в Update.
  3. Что делать, если у врага несколько коллайдеров?

    В Die отключайте все коллайдеры: foreach (var c in GetComponents<Collider>) c.enabled = false;.

Ссылки и ресурсы

  • Unity Learn – Курсы по работе со скриптами
  • Tutorial: Health & Damage System in Unity

Надеюсь, это руководство поможет вам реализовать смерть врагов в вашей игре так, чтобы она была плавной, функциональной и легко расширяемой.