Индикаторы здоровья
Урок 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, но его методы всё ещё можно вызывать. Каждый враг — это отдельная копия префаба со своей полоской.
Задание
СложноПоказывай полоску здоровья над каждым врагом после попадания по нему.
- В
HealthBarдобавь[SerializeField] private Transform fill;иpublic void Show(float fraction): включи полоску и задайfill.localScale = new Vector3(fraction, 1f, 1f);. - В
Enemyдобавь[SerializeField] private HealthBar healthBar;; после того какTakeDamageуменьшит здоровье, вызовиhealthBar.Show((float)health / data.maxHealth);.
Нажми «Играть»: полоски появятся и будут уменьшаться, когда башни попадают по врагам. Затем нажми «Проверить».
Попробуйте сами
using UnityEngine;
// Будет добавлено позже: полоска над противником, показывающая, сколько здоровья у него осталось.
public class HealthBar : MonoBehaviour
{
}
Все уроки раздела Игра на Unity: Tower Defense
Потренируйтесь самостоятельно: Песочница Unity