Menu
CoddyTech

Paski zdrowia

Lekcja 22 z 25 w kursie Gra w Unity: Obrona wieży w Coddy.

Pasek nad każdym przeciwnikiem pokazuje, ile zdrowia mu pozostało. W prefabie przeciwnika składa się z dwóch cienkich sześcianów: ciemnego tła i zielonego wypełnienia z przodu. Szerokość wypełnienia to pozostałe zdrowie podzielone przez maksymalną wartość zdrowia, czyli liczba z zakresu od 0 do 1, a przeskalowanie jego osi x przez tę wartość sprawia, że pasek staje się krótszy. Sześcian skaluje się jednak względem środka, więc wypełnienie kurczyłoby się ku środkowi z obu stron. Wypełnienie znajduje się pod pustym obiektem pivot przy lewym brzegu paska, a skrypt skaluje zamiast niego pivot: wszystko pod nim kurczy się ku tej krawędzi, a pasek opróżnia się od prawej strony.

Ułamek trzeba obliczyć jako liczbę zmiennoprzecinkową. health / data.maxHealth dzieli dwie liczby całkowite, a C# odrzuca część ułamkową wyniku dzielenia całkowitego: 6 / 9 daje 0, więc pasek pokazywałby pusty stan już po pierwszym trafieniu. Rzutowanie najpierw jednej strony, (float)health / data.maxHealth, daje 0.67. Zbiornik na wodę, którego poziom rośnie w górę od pivota na dole:

float level = (float)water / capacity;
waterPivot.localScale = new Vector3(1f, level, 1f);

Pełny pasek niczego nie mówi graczowi, więc początkowo jest ukryty: w prefabie jest nieaktywny, a pierwsze trafienie go włącza. Nieaktywny obiekt nie wykonuje Update, ale nadal można wywoływać jego metody. Każdy przeciwnik jest własną kopią prefabu i ma własny pasek.

challenge icon

Wyzwanie

Trudny

Wyświetl pasek zdrowia nad każdym przeciwnikiem po trafieniu go.

  1. W HealthBar dodaj [SerializeField] private Transform fill; oraz public void Show(float fraction): włącz pasek i ustaw fill.localScale = new Vector3(fraction, 1f, 1f);.
  2. W Enemy dodaj [SerializeField] private HealthBar healthBar;; po tym, jak TakeDamage odejmie punkty zdrowia, wywołaj healthBar.Show((float)health / data.maxHealth);.

Naciśnij „Graj”: paski pojawią się i będą się zmniejszać, gdy wieże będą trafiać przeciwników. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

using UnityEngine;

// Dodamy później: pasek nad przeciwnikiem pokazujący, ile zdrowia mu pozostało.
public class HealthBar : MonoBehaviour
{
}

Wszystkie lekcje w sekcji Gra w Unity: Obrona wieży

Poćwicz samodzielnie: Edytor online Unity