Menu
CoddyTech

Индикаторы здоровья

Урок 22 из 25 курса Игра на Unity: Tower Defense на Coddy.

Полоска над каждым врагом показывает, сколько здоровья у него осталось. В префабе врага она состоит из двух тонких кубов: тёмного фона и зелёного заполнения перед ним. Ширина заполнения равна оставшемуся здоровью, делённому на полное здоровье, то есть числу от 0 до 1; масштабирование по оси x на это число делает полоску короче. Однако куб масштабируется относительно своего центра, поэтому заполнение будет уменьшаться к середине с обоих концов. Заполнение находится под пустым объектом pivot у левого края полоски, и скрипт масштабирует вместо него точку опоры: всё под ней уменьшается в направлении этого края, и полоска опустошается справа налево.

Долю нужно вычислять с плавающей точкой. health / data.maxHealth делит два целых числа, а C# отбрасывает дробную часть при делении целых чисел: 6 / 9 равно 0, поэтому после первого попадания полоска покажет, что здоровье закончилось. Если сначала привести одну из сторон к типу с плавающей точкой, (float)health / data.maxHealth, получится 0.67. Уровень воды в резервуаре, который поднимается вверх от точки опоры на дне:

float level = (float)water / capacity;
waterPivot.localScale = new Vector3(1f, level, 1f);

Полная полоска ничего не сообщает игроку, поэтому изначально она скрыта: в префабе она неактивна, а первое попадание включает её. Неактивный объект не получает вызовы Update, но его методы всё ещё можно вызывать. Каждый враг — это отдельная копия префаба со своей полоской.

challenge icon

Задание

Сложно

Показывай полоску здоровья над каждым врагом после попадания по нему.

  1. В HealthBar добавь [SerializeField] private Transform fill; и public void Show(float fraction): включи полоску и задай fill.localScale = new Vector3(fraction, 1f, 1f);.
  2. В Enemy добавь [SerializeField] private HealthBar healthBar;; после того как TakeDamage уменьшит здоровье, вызови healthBar.Show((float)health / data.maxHealth);.

Нажми «Играть»: полоски появятся и будут уменьшаться, когда башни попадают по врагам. Затем нажми «Проверить».

Попробуйте сами

using UnityEngine;

// Будет добавлено позже: полоска над противником, показывающая, сколько здоровья у него осталось.
public class HealthBar : MonoBehaviour
{
}

Все уроки раздела Игра на Unity: Tower Defense

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