‫Hej.
‫Witamy spowrotem.
‫Teraz mamy nasz pocisk i wiemy, że generuje zdarzenia trafienia, więc musimy coś zrobić,
‫gdy pocisk faktycznie trafi w nasz cel.
‫Teraz będzie to wiązało się z zadawaniem obrażeń, co oznacza, że potrzebujemy sposobu na śledzenie stanu zdrowia.
‫Stworzymy więc klasę do radzenia sobie ze zdrowiem i obrażeniami zwaną komponentem zdrowia.
‫Powodem, dla którego ta funkcja ma swoją własną klasę, jest to, że możemy ją ponownie wykorzystać w różnych
‫klasach, takich jak czołg i wieża.
‫Porozmawiajmy więc o tym składniku zdrowotnym.
‫Teraz znamy klasę użycia komponentu sceny.
‫Cóż, ta klasa wywodzi się z klasy zwanej komponentem aktora.
‫W rzeczywistości, oto dokumentacja komponentu użycia sceny.
‫A w hierarchii dziedziczenia widać, że nadrzędnym elementem jest twój aktor.
‫Teraz grasz jako składnik jest bardziej podstawowy niż ten, który widziałeś.
‫Nie ma transformacji.
‫Tak więc lokalizacja, rotacja i skala nie są czymś, co ma nawet komponent twojego aktora.
‫Nie obsługuje przywiązania.
‫Nie można dołączyć aktywnego komponentu do, powiedzmy, statycznego komponentu siatki lub komponentu kapsułki.
‫To po prostu coś, co należy do aktora.
‫A ponieważ nie ma wizualnej reprezentacji ani transformacji, nie musimy jej do niczego przyczepiać.
‫Porównaj to z komponentem sceny use, który faktycznie ma transformację i możliwość
‫dołączania się do innych komponentów lub dołączania innych komponentów.
‫Tak więc, aby śledzić stan zdrowia i dbać o uszkodzenia, nie potrzebujemy żadnej z tych rzeczy.
‫Więc grasz, że składnik będzie do tego idealny.
‫Wróćmy więc do edytora i uczyńmy nasz nowy akt klasą komponentu.
‫Przejdźmy więc do narzędzi i nowej klasy C++.
‫A jeśli przewinę w dół, widzę komponent aktora.
‫Oto, co zamierzamy wybrać.
‫Teraz bądź ostrożny.
‫Nie wybieraj aktora.
‫To inna klasa.
‫W rzeczywistości jest to większa klasa i ma o wiele więcej rzeczy niż aktor.
‫Potrzebujemy konkretnie komponentu aktora, więc wybierz go, kliknij Dalej.
‫I to możemy nazwać po prostu komponentem zdrowotnym.
‫Kliknijmy Utwórz klasę.
‫Teraz mamy nasze nowe komponenty zdrowia i pliki CP i możesz zobaczyć, że ty komponent zdrowia,
‫klasa, którą właśnie utworzyliśmy, jest pochodną twojego działania jako komponentu.
‫Upewnij się więc, że masz tutaj właściwy typ, a zobaczysz, że ma on w swoim U.
‫Makro klasy.
‫Ta meta określa, gdzie i mówi, że jest to składnik tabeli odradzania.
‫To właśnie pozwoli nam dodać ten komponent bezpośrednio do planów, co
‫zrobimy teraz.
‫Nowy komponent zdrowotny zajmie się zdrowiem, co oznacza, że potrzebujemy kilku zmiennych.
‫Dodajmy je i ustawię je jako prywatne.
‫Więc śmiało dodajmy sekcję prywatną tuż pod sekcją chronioną i możemy dodać kilka zmiennych
‫dotyczących zdrowia.
‫Teraz będą to pływaki, a pierwszą nazwę Max Health.
‫Będzie to maksymalna ilość zdrowia, jaką możemy mieć i możemy ustawić ją na domyślną wartość,
‫taką jak 100 F.
‫Teraz, oprócz maksymalnego zdrowia, będziemy mieli wartość zdrowia, która będzie aktualnym zdrowiem i
‫to się zmieni, gdy otrzymamy obrażenia.
‫Zróbmy więc kolejny float i po prostu nazwijmy to jednym zdrowiem.
‫Teraz możemy zainicjować zdrowie na zero F, a następnie ustawić jego wartość i rozpocząć grę.
‫Powodem, dla którego to zrobimy, jest to, że Max Health będzie miał swoją własną właściwość, która pozwoli nam
‫ustawić ją z poziomu panelu szczegółów.
‫Nadajmy więc tej właściwości U i edytujmy ją w dowolnym miejscu.
‫W ten sposób możemy to zmienić w miarę rozwoju.
‫A potem w składowych zdrowia CP tutaj i zaczynamy grę, możemy po prostu ustawić zdrowie równe wartości
‫maksymalnego zdrowia.
‫W ten sposób po rozpoczęciu gry zdrowie będzie miało wartość maksymalnego zdrowia, nawet po zmianie
‫w panelu szczegółów.
‫OK, więc skompilujmy to i wróćmy tutaj w edytorze, otworzę BP -- tank i otworzę
‫edytor pełnego schematu.
‫A teraz mogę dodać ten komponent zdrowia tutaj w panelu komponentów.
‫Więc kliknę Dodaj i wyszukaj zdrowie.
‫I tu widzimy zdrowie.
‫Teraz nazwaliśmy to komponentem zdrowia w C++.
‫W rzeczywistości wyskakujące okienko pokazuje, że nazywa się to komponentem zdrowotnym.
‫Więc usuwa tę część składową, gdy pokazuje ją tutaj.
‫I być może zauważyłeś, że kiedy szukasz statycznych komponentów siatki lub komponentów kapsuł,
‫nie widzisz tutaj słowa komponent dla nich.
‫Więc kliknij na zdrowie i teraz mamy nasz komponent zdrowia, a zobaczysz, że pod komponentem zdrowie mamy maksymalne
‫zdrowie i jest ono ustawione na 100 i nie widzimy zdrowia, ponieważ nie pokazaliśmy tej zmiennej.
‫Więc teraz BP -- tank ma składnik zdrowia i powiedział, że czołg posiada ten składnik zdrowia, BP
‫-- tank.
‫Jest właścicielem tego składnika zdrowotnego.
‫Skompilujmy i zapiszmy, zamknijmy i otwórzmy wieżyczkę pionka BP i otwórzmy pełny edytor planów, a także
‫możemy dodać komponent zdrowia do wieżyczki stawowej.
‫Kliknijmy więc dodaj składniki, wyszukaj zdrowie i wybierz zdrowie.
‫A teraz na wieży mamy również komponent zdrowia.
‫Więc mam zamiar skompilować i zapisać je, zamknąć i zapisać wszystko.
‫Mamy teraz komponent zdrowotny i wspomnieliśmy, że chcielibyśmy mieć komponent zdrowotny, abyśmy mogli go ponownie
‫wykorzystać w różnych klasach.
‫Więc jeśli mamy pionka na świecie, powiedzmy, naszą wieżę, będzie ona miała swój własny komponent zdrowia, a
‫nasz czołg może mieć swój własny komponent zdrowia.
‫Teraz, gdy nasz pocisk wchodzi w interakcję z którymkolwiek z tych elementów, na przykład, gdy
‫generuje zdarzenie trafienia, gdy uderza w jedną z tych rzeczy, nasze pionki mogą uruchomić pewną funkcjonalność
‫w komponencie zdrowia i zmienić te wartości zdrowia.
‫Umieszczenie funkcji zdrowia w komponencie, a następnie dodanie tego komponentu do klasy ma pewne zalety w
‫porównaniu z alternatywą, która polegałaby na prostym umieszczeniu funkcji zdrowia w podstawowej klasie
‫pionka i odziedziczeniu jej w czołgu i wieży.
‫Widzisz, to pozwala nam utrzymać małe klasy czołgów i wież i zajmować się tylko określoną funkcjonalnością dla
‫tych klas.
‫Natomiast składnik zdrowia można dodać do dowolnego innego aktora, na przykład rzeczy, które nie zachowują się jak czołgi
‫lub wieże.
‫Możemy na przykład zrobić zniszczalną ścianę, która może zostać zniszczona, gdy tylko dozna odpowiednich
‫obrażeń.
‫Porozmawiajmy więc trochę o tym, jak możemy to zrobić teraz.
‫Unreal Engine ma wbudowaną funkcjonalność uszkodzenia, a jego uszkodzony system jest w rzeczywistości dość wyrafinowany.
‫Każdy aktor w naszej grze dziedziczy pewną liczbę zdarzeń obrażeń, z których jedno jest wywołane, aby otrzymać jakiekolwiek obrażenia.
‫To jest delegat multiemisji, tak jak w przypadku trafienia komponentu.
‫Teraz dodamy składniki zdrowia do naszych pionków i będą one oparte na naszym U.
‫Klasa składnika zdrowia.
‫Skoro więc wiemy, że nasze pionki odziedziczą to po otrzymaniu dowolnego delegata obrażeń, to jeśli stworzymy własną
‫funkcję niestandardową w klasie komponentu zdrowia, możemy użyć tej funkcji jako wywołania zwrotnego i przypisać
‫ją do zadania po otrzymaniu obrażeń delegat.
‫Tak więc za każdym razem, gdy zostanie wygenerowane zdarzenie uszkodzenia, delegat przy odbiorze może rozgłaszać i wywołane zostaną
‫wszystkie powiązane z nim funkcje na jego liście wywołań.
‫Więc następne pytanie brzmi: jak sprawić, by delegat zaczął nadawać?
‫Potrzebujemy sposobu na wygenerowanie zdarzenia szkody.
‫Cóż, w statystykach rozgrywki jest funkcja, która właśnie to zrobi i nazywa się to zadawaniem obrażeń.
‫Jeśli użyjemy tej statycznej funkcji ze statystyk twojej rozgrywki do zadawania obrażeń, zadawanie obrażeń wymaga
‫wielu parametrów, w tym aktora, który otrzymuje obrażenia.
‫Tak więc, jeśli wywołamy Apply damage, aktorzy biorący udział w odbiorze obrażeń zostaną zwolnieni, a funkcja wywołania zwrotnego
‫zostanie wywołana w odpowiedzi.
‫Tak więc zastosowanie obrażeń jest tym, co generuje zdarzenie uszkodzenia.
‫Aby to wszystko ustawić, mamy trzy kroki.
‫Najpierw utwórz funkcję zwrotną, a ponieważ będzie ona związana z otrzymaniem jakichkolwiek obrażeń, musi mieć
‫prawidłowe parametry wejściowe, aby po otrzymaniu jakichkolwiek obrażeń wywołała ją i przekazywała wszystkie
‫powiązane informacje o zdarzeniu uszkodzenia.
‫Krok drugi to powiązanie tego wywołania zwrotnego z delegatem.
‫Widzieliśmy, jak to zrobić za pomocą delegata trafienia w składniku przy użyciu funkcji dodawania dynamicznego.
‫Zrobimy to samo tutaj.
‫Trzecim krokiem jest wygenerowanie zdarzenia uszkodzenia poprzez wywołanie statycznej funkcji gry, obrażenia
‫zadane.
‫Wróćmy więc do kodu i zacznijmy to konfigurować.
‫Dobra.
‫Więc jesteśmy tutaj w komponencie zdrowia i dodamy funkcję zwrotną.
‫To może być nieważne i możemy to nazwać jak tylko chcemy.
‫Nazwę to obrażeniami odniesionymi.
‫A ponieważ wiążemy to z delegatem, musi on mieć prawidłowe parametry wejściowe odpowiednie dla
‫tego delegata.
‫Teraz dla funkcji powiązanych z delegatem on take any damage delegate lista parametrów wejściowych musi wyglądać następująco.
‫Pierwszym z nich jest wskaźnik aktorski o nazwie Uszkodzony aktor i tak to brzmi.
‫To aktor ponosi obrażenia.
‫Dalej jest pływak zwany obrażeniami i jest to rzeczywista kwota obrażeń.
‫Teraz mamy wskaźnik kosztu typu obrażeń zwany typem obrażeń.
‫A powodem, dla którego mamy ten parametr wejściowy, jest to, że Unreal Engine ma koncepcję typów obrażeń.
‫Możesz tworzyć niestandardowe typy obrażeń, które mają dodatkowe dane, które mogą Cię informować o wykonaniu różnych czynności w zależności od
‫rodzaju obrażeń, które możesz mieć.
‫Obrażenia od ognia.
‫Szkody spowodowane przez truciznę.
‫Obrażenia wybuchowe i tak dalej.
‫A jeśli chcesz zaimplementować niestandardową funkcjonalność dla każdego typu uszkodzenia, zaimplementuj to we
‫własnym niestandardowym typie uszkodzenia.
‫Teraz nie tworzymy własnego, niestandardowego typu obrażeń, ale ponieważ wiążemy tę funkcję z delegatem
‫przy odbiorze obrażeń, musi ona mieć te parametry wejściowe.
‫Więc włączamy to tutaj.
‫Teraz następnym parametrem jest wskaźnik kontrolera A, który nazywa się instigator i Unreal Engine
‫Damage System.
‫Za szkodę odpowiedzialny jest inicjator.
‫Więc jeśli szkoda została ostatecznie spowodowana przez gracza kontrolującego pionka, to inicjatorem jest kontroler, który
‫posiada ten pionek.
‫Teraz nie zawsze musi być prowokator.
‫Gdyby go nie było, byłoby to po prostu zerowe.
‫A teraz otrzymuję czerwone zawijasy, abym mógł dalej zadeklarować klasę kontrolera A tutaj w nawiasach dla
‫funkcji.
‫Teraz ostatnim parametrem jest wskaźnik aktora A, a ten nazywa się Damage Causer.
‫To jest rzeczywisty aktor powodujący szkody.
‫To byłby sam pocisk.
‫Więc zadeklarowaliśmy tę funkcję zwrotną po otrzymaniu obrażeń i podobnie jak nasza inna funkcja zwrotna przy trafieniu.
‫To musi być funkcja u.
‫Więc damy mu makro funkcji, aby upewnić się, że działa, gdy powiążemy je z
‫delegatem przy odbiorze obrażeń.
‫A teraz, kiedy to zadeklarowaliśmy, jesteśmy gotowi do zdefiniowania go w pliku CPP.
‫Więc tutaj w składnikach zdrowotnych, CPP.
‫Na dole zamierzam nadać tej funkcji treść i w pełni zakwalifikować funkcję
‫nazwą klasy.
‫A teraz mamy oddzwonienie.
‫Więc teraz musimy powiązać to z delegatem.
‫Ale delegat nie istnieje w komponencie zdrowotnym, istnieje w szczególności na aktorach.
‫Chcemy powiązać to z otrzymaniem wszelkich obrażeń od delegata pionka, który jest właścicielem tego komponentu.
‫Jak więc uzyskać dostęp do właściciela tego komponentu, aby móc powiązać się z jednym z jego delegatów?
‫Cóż, zrobilibyśmy to i zaczęlibyśmy grać, a sposób, w jaki możemy uzyskać dostęp do właściciela komponentu,
‫jest poprzez funkcję właściciela git.
‫Jeśli najedziesz na to kursorem, zobaczysz, że zwraca wskaźnik aktora.
‫To jest wskaźnik do aktora, który jest właścicielem komponentu.
‫Komponenty mogą być własnością pionków, mogą być własnością aktorów, więc zwróci
‫właściciela w postaci wskaźnika aktora.
‫Mamy więc naszą funkcję zwrotną, a naszym drugim krokiem jest powiązanie jej z delegatem po otrzymaniu obrażeń,
‫które pojawią się u pionka będącego właścicielem komponentu zdrowia.
‫Więc ponieważ masz doświadczenie w wiązaniu wywołań zwrotnych do delegatów, będzie to wyzwanie w klasie
‫komponentów zdrowia.
‫W Rozpocznij grę, będziesz wiązał obrażenia otrzymane przy odbiorze z każdym delegatem obrażeń, który istnieje
‫u właściciela komponentu.
‫Więc masz zamiar uzyskać dostęp do tego delegata za pomocą funkcji Pobierz właściciela.
‫Innymi słowy, zadzwonisz do właściciela, a następnie uzyskasz dostęp, aby otrzymać jakiekolwiek obrażenia.
‫Od tego momentu wiesz, jak powiązać wywołania zwrotne z delegatami za pomocą funkcji add dynamic, jeśli
‫utkniesz, zobacz, jak powiązaliśmy wywołanie zwrotne po trafieniu z delegatem po trafieniu komponentu, wstrzymaj wideo i powiąż
‫obrażenia otrzymane od delegata po otrzymaniu obrażeń.
‫Dobra.
‫Wróciliśmy więc do komponentu zdrowia i jesteśmy gotowi do powiązania naszej funkcji zwrotnej.
‫Więc tutaj i zacznijmy grać, uzyskamy dostęp do właściciela za pomocą funkcji właściciela git, a stamtąd
‫użyjemy operatora strzałki, aby uzyskać dostęp do tego wezwanego delegata, otrzymać dowolne obrażenia i dalej otrzymywać dowolne
‫obrażenia ma dynamikę dodawania funkcji i po prostu pobiera obiekt użytkownika i nazwę funkcji.
‫Teraz obiekt użytkownika jest obiektem, dla którego przypisujemy funkcję.
‫Jest to klasa, która ma funkcję zwrotną i to będzie to.
‫I wreszcie mamy naszą funkcję zwrotną, którą będzie ty.
‫Otrzymane obrażenia od składnika zdrowia.
‫Teraz musimy zapamiętać adres operatora, ponieważ w rzeczywistości jest to adres funkcji.
‫Więc teraz otrzymane obrażenia są związane z otrzymaniem jakichkolwiek obrażeń i są dodawane do listy wywołań delegata.
‫Tak więc za każdym razem, gdy wygenerujemy zdarzenia obrażeń, otrzymamy transmisję od tego delegata,
‫która spowoduje wywołanie funkcji przyjmującej obrażenia.
‫Podsumowując, stworzyliśmy nasz własny komponent zdrowia i dodaliśmy jeden z nich zarówno do planu czołgu,
‫jak i planu wieży.
‫Stworzyliśmy funkcję zwrotną o nazwie Damage Taken i powiązaliśmy ją z delegatem przy odbiorze obrażeń.
‫Następnym krokiem jest wygenerowanie zdarzenia uszkodzenia, które spowoduje rozesłanie delegata on take any damage, dzięki
‫czemu nasze uszkodzenie funkcji wywołania zwrotnego zostanie wywołane w odpowiedzi.
‫Zajmiemy się tym w następnym filmie.
‫Zobaczymy się wkrótce.