Шкалы здоровья
Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 10 из 56.
Опустошающаяся полоска — это UI Image, у которого для Image Type задано значение Filled. Эта настройка появляется, когда у Image задано значение Source Image; если указано None, Inspector скрывает её. Fill Method Horizontal с Fill Origin Left заставляет полоску укорачиваться к левому краю, а fillAmount от 0 до 1 показывает, какая её часть отображается. Тёмное Image позади неё показывает пустую часть. Unity ограничивает значение fillAmount, поэтому 1.4 отображает полную полоску, а -0.2 — пустую.
fillAmount — это доля оставшегося здоровья: здоровье, делённое на его максимум. Для полей типа int это целочисленное деление, и 350 / 500 равно 0, поэтому сначала преобразуй одну из сторон в float. Image находится в UnityEngine.UI. Эта полоска босса обновляется после каждого попадания:
public Image bossBar;
public int bossMaxHp = 500;
private int bossHp = 500;
public void Hit(int damage)
{
bossHp = Mathf.Max(bossHp - damage, 0);
bossBar.fillAmount = (float)bossHp / bossMaxHp; // 350 / 500 = 0.7
}Цвет полоски тоже может меняться в зависимости от здоровья: bossBar.color = Color.Lerp(Color.red, Color.green, bossBar.fillAmount); — полоска зелёная, когда она полная, и становится красной по мере опустошения.
Задание
ЛегкоУ рыцаря есть щит, который принимает на себя урон до того, как урон получит её здоровье. Стрелки управляют ею (Mover.cs), а шипы наносят ей 30 урона, когда она наступает на них (Spikes.cs). Напиши Knight.cs; в сцене связаны healthBar и shieldBar, которые в сцене пусты:
hpначинается со значенияmaxHp(80), аshield— со значенияmaxShield(40); обе полосы изначально заполнены.TakeDamage(int amount): щит поглощает столько урона, сколько может, а остаток вычитается изhp, которое никогда не опускается ниже 0.- После каждого удара обе полосы показывают оставшееся значение:
shieldBar— значение щита относительноmaxShield,healthBar— значение hp относительноmaxHp.
Нажми Play, несколько раз пройдись по шипам, затем нажми Check.
Попробуйте сами
using UnityEngine;
using UnityEngine.UI;
public class Knight : MonoBehaviour
{
public Image healthBar;
public Image shieldBar;
public int maxHp = 80;
public int maxShield = 40;
private int hp;
private int shield;
void Start()
{
hp = maxHp;
shield = maxShield;
// Заполнить обе шкалы
}
public void TakeDamage(int amount)
{
// Щит поглощает столько урона, сколько может; оставшийся урон уменьшает hp, но не ниже 0. Затем отобразить обе шкалы.
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня7Управление временем
Пауза с timeScaleЗамедленное движениеНемасштабируемое времяПовторение: Bullet Time10Проект: 3D-платформер
ТрассаДвижущиеся платформы2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банке