Полосы здоровья
Урок 16 из 18 курса Игра в Unity: защита башен на 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добавь сериализованное поле Transformfill(в Inspector назначь ему FillPivot полосы) и методpublic void Show(float fraction), который включает GameObject полосы и масштабируетfillпо оси x до значенияfraction. - В
Enemyдобавь сериализованное полеhealthBar(типа HealthBar). Каждый раз, когда TakeDamage уменьшает здоровье, показывай оставшееся здоровье в виде доли отmaxHealth.
У каждого префаба врага есть своя полоска здоровья: она неактивна, на ней установлен скрипт HealthBar, а её заливка находится под pivot у левого края. Нажми Play и наблюдай за полосками, пока башни стреляют, затем нажми Check.
Попробуйте сами
using UnityEngine;
// Появится позже: полоска над врагом, показывающая, сколько здоровья у него осталось.
public class HealthBar : MonoBehaviour
{
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.