Самое главное помнить, что
- Смерть – это не просто удаление объекта. Это событие, которое должно сопровождаться анимацией, звуком, эффектами и, возможно, вознаграждением для игрока.
- Безопасность кода: всегда проверяйте, что здоровье не может стать отрицательным, и что после смерти объект не реагирует на дальнейшие коллизии.
- Оптимизация: если у вас в сцене много врагов, используйте пул объектов (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, урон, скорость).
Часто задаваемые вопросы
- Как добавить эффект «падения» после смерти?
Создайте анимацию «Fall» в Animator и вызыватьanimator.SetTrigger("Fall")послеDie. - Можно ли сделать «пульсирующую» анимацию, пока враг жив?
Добавьте в Animator параметрfloatHealthPercentи используйтеAnimator.SetFloatвUpdate. - Что делать, если у врага несколько коллайдеров?
ВDieотключайте все коллайдеры:foreach (var c in GetComponents<Collider>) c.enabled = false;.
Ссылки и ресурсы
- Unity Learn – Курсы по работе со скриптами
- Tutorial: Health & Damage System in Unity
Надеюсь, это руководство поможет вам реализовать смерть врагов в вашей игре так, чтобы она была плавной, функциональной и легко расширяемой.