Здоровье и урон
Часть раздела Физика и игровой процесс путешествия по 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 только в том случае, если компонент найден.
Задание
СреднеТренировочный пистолет стреляет по манекену и бронированному рыцарю. Скрипт 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
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Физика и игровой процесс
1Твёрдое тело
Гравитация и массаТолкаем с помощью AddForceПрыжок с импульсомFixedUpdate для физикиСкоростьКинематические телаПовторение: пусковая площадка2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Погоня за монетами
Катящийся мячМонеты для сбора