‫Hej.
‫Witamy spowrotem.
‫Teraz skonfigurowaliśmy funkcję wywołania zwrotnego powiązaną z delegatem w przypadku poniesienia jakichkolwiek szkód.
‫A ostatnim krokiem jest faktyczne wygenerowanie tego zdarzenia uszkodzenia.
‫I chcemy to zrobić, gdy nasz pocisk w coś trafi.
‫Kiedy już nadamy dla tego delegata, możemy uszkodzić przedmiot, w który trafiliśmy.
‫Będziemy transmitować to wydarzenie, używając obrażeń zadawanych, które należą do klasy statyki
‫rozgrywki.
‫Przyjrzyjmy się więc zastosowanej funkcji obrażeń.
‫Oto dokumentacja dotycząca obrażeń zadanych, które według niego rani określonego aktora obrażeniami ogólnymi.
‫Jest to więc ogólna funkcja do zadawania obrażeń.
‫A to, co zrobimy w odpowiedzi na transmisję dla tego delegata, zależy od nas.
‫Teraz widzimy, że musimy uwzględnić statykę rozgrywki, a w składni widzimy kilka parametrów wejściowych.
‫Teraz otrzymujemy opis parametrów.
‫Jeśli będziemy przewijać w dół, zobaczymy, że uszkodzony aktor ma się dobrze, aktor, który
‫otrzyma obrażenia podstawowe, to podstawowe obrażenia, aby zastosować tutaj naprawdę opisową dokumentację.
‫Dziękuję.
‫Inicjator zdarzenia Epic to kontroler, który był odpowiedzialny za spowodowanie tych szkód.
‫I mówi na przykład o graczu, który strzelił z broni.
‫Kiedy mówi gracz, odnosi się do tego kontrolera.
‫Następnie mamy sprawcę szkody, czyli aktora, który faktycznie spowodował szkodę.
‫Mówi granat, który eksplodował.
‫W naszym przypadku będzie to pocisk, który eksplodował.
‫I na koniec mamy klasę typu obrażeń, która jest klasą opisującą wyrządzone obrażenia.
‫Teraz z powrotem w sekcji składni, możemy zobaczyć typy tych danych wejściowych i widzimy, że
‫klasa typu obrażeń jest podklasą i widzieliśmy wcześniej, że podklasa TW spełnia parametr wejściowy klasy
‫typu U.
‫Cóż, kiedy wywołamy obrażenia aplikacyjne, możemy przekazać klasę U reprezentującą typ obrażeń, którego chcielibyśmy
‫użyć.
‫Za chwilę porozmawiamy o tym, jak spełnić ten parametr wejściowy.
‫Tak więc funkcja statyki rozgrywki w odcieniu, zadawane obrażenia będą wymagały kilku parametrów wejściowych.
‫Zastanówmy się więc, jak przekazać odpowiednie wartości, gdy wywołamy tę funkcję,
‫widzieliśmy, że najpierw potrzebujemy uszkodzonego aktora.
‫Cóż, wróćmy do CP pocisku, gdzie chcielibyśmy nazwać zadawanie obrażeń.
‫Chcielibyśmy to zrobić tutaj w momencie trafienia i nie potrzebujemy już tych dzienników.
‫Więc po prostu je usunę i zauważę, że nasze wywołanie zwrotne przy trafieniu otrzymuje pewne dane wejściowe, gdy
‫zostanie wywołane.
‫Gdy zostanie wyemitowany delegat trafienia w komponencie, zobaczymy, że mamy innego aktora.
‫Mamy więc dostęp do aktora, który został trafiony pociskiem i to jest aktor, którego chcielibyśmy
‫uszkodzić.
‫To zajmuje się pierwszym parametrem wejściowym.
‫To będzie ten inny aktor.
‫Następnie potrzebujemy wielkości obrażeń, co oznacza, że nasz pocisk powinien mieć zmienną obrażeń, abyśmy
‫wiedzieli, ile obrażeń zadać.
‫Więc dlaczego nie przejdziemy do efektów pocisku i dodamy zmienną obrażeń, a to może być pływak.
‫Możemy więc po prostu nazwać to uszkodzenie i zainicjalizować je do wartości, powiedzmy coś w rodzaju
‫50 F, a ponieważ jest to coś, z czym prawdopodobnie chcielibyśmy poeksperymentować, możemy nadać temu właściwość
‫U, aby ją ujawnić i edytować gdziekolwiek.
‫Więc teraz mamy ilość obrażeń do przekazania, kiedy wołamy o obrażenia.
‫Teraz następny parametr to inicjator i widzieliśmy, że jest to kontroler typu A.
‫Jak więc zdobędziemy kontroler?
‫Cóż, widzieliśmy, że możemy uzyskać właściciela konkretnego komponentu za pomocą funkcji get owner.
‫I to zwraca aktora, który jest właścicielem konkretnego komponentu, te pociski są generowane dynamicznie.
‫Więc musimy się upewnić, że jeśli zamierzamy zadzwonić do get owner, że właściciel jest ustawiony teraz, odradzamy
‫je z pionka podstawowego.
‫Więc jeśli pójdziemy do pionka bazowego.
‫CP Oto wiersz, w którym tworzymy aktora, ale Spawn Actor zwraca również wskaźnik do odrodzonego aktora,
‫abyśmy mogli zapisać to w zmiennej lokalnej.
‫Na przykład, moglibyśmy powiedzieć auto pocisk i przypisać wartość zwróconą przez aktora odradzania.
‫Teraz, jeśli nie jesteś zaznajomiony z auto, pozwala kompilatorowi określić typ, jaki ma przypisać do tej
‫nowej zmiennej.
‫Jeśli najedziesz na niego kursorem, zobaczysz, że ma wskaźnik pocisku typu A, ponieważ to
‫właśnie podpisujemy z funkcji aktora odradzania.
‫To jest to samo, co gdybyśmy umieścili wskaźnik pocisku właśnie tutaj i teraz możemy uzyskać dostęp do
‫nowo powstałego pocisku.
‫A powodem, dla którego chcemy to zrobić, jest to, że chcielibyśmy ustawić jego właściciela.
‫Chcielibyśmy upewnić się, że jego właściciel jest ustawiony na pionka, który go zrodził.
‫Więc możemy powiedzieć pocisk.
‫Jest też funkcja dla tego właściciela zestawu.
‫Właściciel zestawu bierze aktora i zamierzamy go przekazać, aby za każdym razem, gdy jeden z naszych pionków
‫odrodzi pocisk, ustawi tego właściciela pocisków.
‫W ten sposób, jeśli kiedykolwiek wywołamy get owner dalej w dół linii, otrzymamy instancję
‫klasy, która jest właścicielem tego pocisku.
‫Wracając do DHCP pocisku, mamy wywołanie funkcji Get Owner i możemy to zapisać w zmiennej
‫lokalnej.
‫Zamierzam śmiało użyć auto ponownie i nazwać to moim właścicielem i ustawić go na wynik zwrócony przez
‫get owner.
‫Więc teraz mamy wskaźnik lokalnego aktora, który przechowuje wartość właściciela.
‫Teraz możemy uzyskać dostęp do kontrolera inicjatora z tego aktora.
‫Teraz, zanim to zrobimy, dobrze jest sprawdzić, czy mój właściciel nie jest pusty.
‫Więc powiem, że jeśli mój właściciel jest równy null równa się null wskaźnikowi, to po prostu zwrócę.
‫Teraz, jeśli ciało ma taką samą instrukcję, możesz umieścić ją w tej samej linii bez nawiasów
‫klamrowych, na wypadek, gdybyś nie wiedział.
‫A null pointer to słowo kluczowe w C++, które pozwala sprawdzić, czy wskaźnik jest pustym wskaźnikiem.
‫Więc jeśli mój właściciel ma wartość null, wrócimy wcześniej z funkcji i nie zrobimy nic więcej.
‫Teraz, jak mówiłem, możemy pobrać kontroler inicjatora od mojego właściciela i
‫to jest właśnie funkcja o nazwie get instigator controller.
‫A jeśli najedziemy na to kursorem, zobaczymy, że zwraca wskaźnik kontrolera A.
‫Po prostu użyję auto i przechowam to w zmiennej lokalnej, którą będę nazywać inicjatorem właściciela.
‫Więc teraz wiemy, co uchodzić za inicjatora.
‫Następnym sygnałem wejściowym jest sprawca obrażeń, a to aktor, który zadaje obrażenia pociskowi.
‫To będzie po prostu to.
‫Pozostaje ostatni parametr wejściowy, czyli rodzaj obrażeń.
‫Widzieliśmy, że jest to podklasa, co oznacza, że do przejścia potrzebujemy odpowiedniej klasy użycia.
‫N Teraz masz nierealną dokumentację silnika dla twojego typu uszkodzenia.
‫Mówi, że typ uszkodzenia ma na celu zdefiniowanie i opisanie określonej formy uszkodzenia oraz
‫zapewnienie możliwości dostosowania reakcji na uszkodzenia z różnych źródeł.
‫Teraz nie zamierzamy dostosowywać naszych obrażeń.
‫Musimy tylko spełnić parametr wejściowy, co oznacza, że potrzebujemy wartości klasy U, która reprezentuje tę
‫klasę typu obrażeń.
‫Teraz w C++, jeśli chcemy uzyskać klasę YOU dowolnej konkretnej klasy, na przykład typu obrażeń, możemy wywołać
‫funkcję o nazwie klasa statyczna.
‫Jest to dziedziczone z klasy obiektu you.
‫Teraz oczywiście używamy tutaj typu obrażeń, więc będziemy potrzebować tego nagłówka.
‫Więc z dokumentacji skopiuję linię include i wkleję ją tutaj na górze CP pocisku
‫A teraz zobaczysz, że ta statyczna funkcja klasy zwraca wskaźnik klasy U i ta nowa klasa będzie
‫reprezentować nowy typ obrażeń Klasa C++.
‫Teraz, ponieważ nie tworzymy schematu opartego na typie obrażeń i ustawianiu dodatkowych danych, tak
‫naprawdę nie potrzebujemy podklasy zmiennej.
‫Więc w tym przypadku możemy użyć klasy statycznej, a to zwróci klasę U, która reprezentuje ten typ.
‫I możemy to przechowywać w zmiennej, jeśli chcemy, a ja nazwę tę klasę typu obrażeń.
‫I to właśnie możemy podać jako ostatni parametr do zadawania obrażeń.
‫Mamy teraz wszystkie informacje, które musimy przekazać do funkcji zadawania obrażeń.
‫Ale zanim to zrobimy, chciałbym przeprowadzić kilka sprawdzeń, aby upewnić się, że wywołanie tej funkcji
‫jest właściwe.
‫Więc złożę tutaj oświadczenie if.
‫Po pierwsze, chcę się upewnić, że inny aktor nie jest null.
‫Więc umieszczę tutaj innego aktora.
‫Umieszczę tutaj i, aby sprawdzić, czy inny aktor nie jest równy temu aktorowi.
‫Nie chcemy wyrządzić sobie krzywdy, jeśli jesteśmy pociskiem, teraz położę inny koniec i upewnię
‫się, że inny aktor nie jest równy mojemu właścicielowi.
‫Nie byłoby dobrze, gdyby pocisk wyrządził szkody swojemu właścicielowi.
‫A teraz, jeśli wejdziemy w to stwierdzenie if, to wiemy, że właściwe jest wywołanie obrażeń, abyśmy
‫mogli to zrobić.
‫I to będzie twoje wyzwanie.
‫Tak więc w naszej nowej instrukcji if w funkcji wywołania przy trafieniu, statystyki gry stosuje funkcję obrażeń.
‫Oznacza to, że będziesz musiał podać poprawny nagłówek dla statystyk rozgrywki i wiesz, które parametry
‫wejściowe przekazać.
‫Zatrzymaj więc wideo i dodaj teraz wywołanie funkcji, aby zadać obrażenia w funkcji przy trafieniu.
‫Dobra.
‫Więc jestem tutaj w pocisku CP i zamierzam dołączyć plik nagłówkowy ze statystykami rozgrywki, a na stronie
‫Applied Damage Documentation możemy zobaczyć, że zawiera on statystyki rozgrywki kismet slash.
‫Więc zamierzam to tam wkleić i teraz jestem gotowy do wywołania obrażeń.
‫Nazywam cię więc statystyką rozgrywki, która zadaje obrażenia.
‫Teraz, gdy tylko wpiszę te otwierające nawiasy, otrzymuję wyskakujące okienko przypominające mi o parametrach wejściowych, których
‫potrzebuję.
‫A pierwszy to uszkodzony aktor, a to będzie inny aktor.
‫Więc napiszemy następny aktor.
‫Potrzebujemy ilości obrażeń i dodaliśmy to pływające obrażenia w efektach pocisku, które ustawiliśmy na 50.
‫Więc zamierzam przejść do końca obrażeń jako następny.
‫Potrzebujemy inicjatora i mamy inicjatora mojego właściciela.
‫Więc zamierzam przekazać inicjatora mojego właściciela.
‫Następna jest przyczyna szkód.
‫I oczywiście sam pocisk jest przyczyną uszkodzeń.
‫Więc przejdziemy przez to.
‫I na koniec potrzebujemy podklasy typu obrażeń, o których wiemy, że wskaźnik klasy U zaspokoi to i
‫dlatego mamy naszą klasę typu obrażeń.
‫Przejdźmy więc do klasy obrażeń.
‫A teraz wzywamy do zadawania obrażeń.
‫Więc kiedy to nazwiemy, wygenerujemy zdarzenie uszkodzenia, a delegat przy odbiorze będzie transmitował w odpowiedzi
‫na to, co oznacza, że w naszym zdrowiu zostaną wywołane otrzymane obrażenia.
‫Więc po prostu musimy coś zrobić tutaj w otrzymanych obrażeniach.
‫Cóż, sensowne byłoby odebranie tych obrażeń i odjęcie ich od zdrowia.
‫Zanim jednak to zrobimy, chciałbym się upewnić, że obrażenia nie są mniejsze ani równe zeru.
‫F Rozsądne jest przeprowadzenie tych kontroli przed udokumentowaniem uszkodzeń, aby upewnić się, że nie stosujemy wartości, która
‫nie ma żadnego sensu, np. zero lub wartość ujemna.
‫Więc jeśli tak jest, po prostu wrócimy.
‫I oczywiście, jeśli chcesz być sprytny i zrobić to, co ja zrobiłem w pocisku w CP, możemy umieścić
‫tam powrót.
‫Teraz, jeśli przekroczymy tę linię, obrażenia są wartością dodatnią, więc możemy odebrać zdrowie i użyć
‫minus to obrażenia.
‫Aby upewnić się, że to działa, dlaczego nie umieścimy tutaj dziennika euy?
‫Więc dziennik dziennika Yui, tekst ostrzeżenia tymczasowego i możemy po prostu wydrukować wartość zdrowia z procentem F i zdrowiem i
‫dzięki temu możemy skompilować.
‫Teraz, po pomyślnej kompilacji, wskoczymy z powrotem do edytora iz otwartym dziennikiem wyjściowym, włączmy
‫odtwarzanie.
‫Zobaczmy teraz, czy możemy zostać trafieni pociskiem.
‫I tam idziemy.
‫Nasze zdrowie spadło teraz do 50, a jeśli ponownie zostaniemy trafieni, otrzymaliśmy sporo zdarzeń trafienia,
‫ponieważ uderzaliśmy w pocisk wiele razy, bardzo szybko.
‫Ale widzimy, że nasze zdrowie jest właściwie dokumentowane.
‫Musimy więc upewnić się, że wdrażamy prawidłowe zachowanie po śmierci, gdy zdrowie osiągnie zero.
‫Ale musimy również upewnić się, że to zdarzenie trafienia nie zostanie wielokrotnie spamowane.
‫Teraz wiemy, że pocisk powinien zostać zniszczony po trafieniu w coś, więc najlepszym sposobem
‫zapobiegania spamowaniu zdarzenia trafienia jest zniszczenie pocisku.
‫To ostatnia rzecz, jaką zrobimy w tym filmie.
‫Więc wracając do pocisku, zaraz po zadanym uszkodzeniu, możemy zrobić, aby pocisk sam się zniszczył, a to nie
‫może być prostsze.
‫Po prostu wywołujemy funkcję zniszczenia.
‫Więc z jeszcze jedną kompilacją z powrotem w edytorze, możemy iść dalej, zostać trafionym pociskiem i spojrzeć na
‫to.
‫Pocisk zniknął.
‫Czyli powoduje to uszkodzenie, a następnie znika.
‫I oczywiście możemy również przetestować uderzanie w wieże, strzelając w nie pociskami i upewniając się, że
‫te zdarzenia trafienia są wyzwalane.
‫Jak widzicie, mogę to spamować całą masą pocisków i zobaczymy, że
‫wartość życia tej biednej wieży staje się bardzo, bardzo ujemna.
‫Podsumowując, wywołaliśmy funkcję zadawania obrażeń, co zaowocowało transmisją dla delegata przy
‫odbiorze obrażeń.
‫Udokumentowaliśmy zdrowie w komponencie zdrowia i zniszczyliśmy pocisk.
‫Więc teraz zajęliśmy się uszkodzeniami.
‫Jeszcze nie zajęliśmy się śmiercią.
‫To będzie jedna z następnych rzeczy, które omówimy w przyszłym filmie.
‫Zobaczymy się wkrótce.