Menu
CoddyTech

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

Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 10 из 60.

Опустошающаяся полоска — это изображение UI с параметром Тип изображения, установленным в значение Заполненное. Этот параметр появляется, когда у изображения задано Исходное изображение; если выбрано «Нет», инспектор его скрывает. При горизонтальном Способе заполнения и начале заполнения Слева полоска уменьшается к левому краю, а fillAmount — от 0 до 1 — показывает, какая её часть отображается. Тёмное изображение позади показывает пустую часть. 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

Задание

Легко

Покажи щит и здоровье рыцаря на двух полосках.

  1. Напиши ShowBars(): shieldBar.fillAmount = (float)shield / maxShield;, а также то же самое для healthBar с hp и maxHp. Вызови этот метод в Start().
  2. В TakeDamage щит принимает на себя Mathf.Min(amount, shield), а оставшийся урон вычитается из hp, но значение не может быть меньше 0. Затем вызови ShowBars().

Нажми «Играть» и наступи на шипы: полоска щита опустеет первой. Затем нажми «Проверить».

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

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. Затем отобразить обе шкалы.
    }
}

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

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