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.
Wyzwanie
ŚredniPistolet 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):hpzmniejsza się o wartośćamountpomniejszoną oarmor, 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
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Fizyka i rozgrywka
1Ciało sztywne
Grawitacja i masaPopychanie za pomocą AddForceSkok z impulsemFixedUpdate dla fizykiPrędkośćCiała kinematycznePowtórka: platforma startowa2Kolizje
OnCollisionEnterW co uderzyłem?Rozbijanie przy zderzeniuStanie na podłożuOdbicie i tarcieKształty colliderówPodsumowanie: Zniszczalny mur3Wyzwalacze
Kolizje wyzwalająceOnTriggerEnterZnajdźkiStrefy śmierciWejście i wyjściePowtórka: klucz i drzwi6Raycasty
Physics.RaycastRaycastHitSprawdzanie podłoża za pomocą promieniaWarstwy i LayerMaskLinia widzeniaOverlapSphere i SphereCastPodsumowanie: laserowa bariera9Przeciwnicy
Gonić graczaGonić w zasięguPatrolować i gonićZdrowie i obrażeniaOdrzutPodsumowanie: pies stróżujący