Menu
CoddyTech

Шкалы здоровья

Часть раздела Создание настоящих игр путешествия по 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); — полоска зелёная, когда она полная, и становится красной по мере опустошения.

challenge icon

Задание

Легко

У рыцаря есть щит, который принимает на себя урон до того, как урон получит её здоровье. Стрелки управляют ею (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. Затем отобразить обе шкалы.
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Создание настоящих игр