Menu
CoddyTech

Zdrowie i obrażenia

Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 53 z 63.

Obrażenia wymagają dwóch skryptów. Skrypt Health znajduje się na każdym obiekcie, który może zostać uszkodzony, i przechowuje jego punkty życia, a obiekt zadający obrażenia wyszukuje ten skrypt i wywołuje jego metodę. Oto skrypt Health dla skrzyni, która rozpada się po trzech trafieniach, oraz kolców, które ranią wszystko, co na nich wyląduje:

public class Health : MonoBehaviour
{
    [SerializeField] private int hp = 3;

    public void TakeDamage(int amount)
    {
        hp -= amount;
        if (hp <= 0)
        {
            Destroy(gameObject);
        }
    }
}
public class Spikes : MonoBehaviour
{
    void OnCollisionEnter(Collision collision)
    {
        Health health = collision.gameObject.GetComponent<Health>();
        if (health != null)
        {
            health.TakeDamage(1);
        }
    }
}

TakeDamage jest public, więc inne skrypty mogą je wywoływać, i to jedyny kod, który zmienia hp. Kolce, pociski i lawa wywołują tę samą metodę, a sam skrypt Health decyduje, co oznacza 0: zniszczenie skrzyni, koniec gry lub odtworzenie animacji śmierci. Każdy skrypt znajduje się we własnym pliku, którego nazwa odpowiada nazwie jego klasy.

GetComponent<Health>() zwraca null w przypadku obiektów, które nie mają komponentu Health, takich jak podłoga, dlatego kolce sprawdzają wynik przed wywołaniem metody. TryGetComponent(out Health health) wykonuje wyszukiwanie i sprawdzenie w jednym wywołaniu: zwraca true i przypisuje wartość do health tylko wtedy, gdy taki komponent istnieje.

challenge icon

Wyzwanie

Średni

Pistolet treningowy strzela do manekina i opancerzonego rycerza. Skrypt Shooter na pistolecie jest gotowy: strzałki w lewo i w prawo obracają go, a spacja wystrzeliwuje pocisk. Napisz dwa skrypty, które sprawią, że trafienia będą zadawać obrażenia.

Health na manekinie i rycerzu (w Inspectorze ustawiane są wartości hp i armor):

  • Metoda publiczna TakeDamage(int amount): hp zmniejsza się o wartość amount pomniejszoną o armor, ale zawsze co najmniej o 1.
  • Po każdym trafieniu wyświetl w logu nazwę obiektu i pozostałe hp, na przykład Dummy hp: 2.
  • Przy 0 hp lub mniej zniszcz obiekt.

Bullet na każdym pocisku (w Inspectorze wartość damage jest ustawiona na 2):

  • Gdy pocisk trafi w obiekt, który ma komponent Health, wywołaj jego TakeDamage(damage).
  • Niezależnie od tego, w co trafi, także w ścianę, zniszcz pocisk.

Naciśnij Play, pokonaj manekina i rycerza, a następnie naciśnij Check.

Spróbuj swoich sił

using UnityEngine;

public class Health : MonoBehaviour
{
    [SerializeField] private int hp = 4;
    [SerializeField] private int armor = 0;

    public void TakeDamage(int amount)
    {
        // odejmij amount pomniejszone o armor (co najmniej 1), zapisz w logu pozostałą wartość, zniszcz przy 0
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Fizyka i rozgrywka