‫Więc jeśli zbliżę się do naszych wież, widzę, że rysują sfery debugowania, udowadniając, że
‫wywołują funkcję ognia i robią to co 2 sekundy.
‫Teraz, dodatkowo, wywołują tylko tę funkcję.
‫Jeśli jestem w zasięgu ognia, jeśli tu wrócę, zauważysz, że nie rysują sfer debugowania.
‫Wiąże się to również z kontrolą odległości.
‫A jak tylko jestem wystarczająco blisko, to zaczynają rysować te sfery debugowania.
‫Witam ponownie.
‫Teraz stworzyliśmy już funkcję ognia i używamy jej w klasie czołgów, ponieważ powiązaliśmy
‫ją z mapowaniem akcji ognia.
‫Ale chcielibyśmy również użyć tego ponownie w klasie wieży.
‫Teraz zamiast używać danych wejściowych użytkownika dla klasy wieży, użyjemy liczników czasu.
‫Zamierzamy stworzyć licznik czasu dla klasy wieży, aby licznik czasu mógł wywołać funkcję ognia.
‫Co jakiś czas ustawiamy określoną liczbę sekund pomiędzy wywołaniami funkcji fire.
‫Więc skoro chcielibyśmy, aby funkcja ognia była wywoływana co jakiś czas w klasie wieży, musimy teraz porozmawiać
‫o zegarach.
‫Unreal Engine ma możliwość ustawiania timerów za pomocą klasy F Timer Manager.
‫Istnieje światowy menedżer zegarów, który zarządza zegarami na świecie.
‫Teraz ten światowy menedżer czasowy ma funkcję o nazwie Set Timer, a ustawianie timera pobiera szereg danych wejściowych,
‫takich jak uchwyt timera.
‫Jest to uchwyt do określonego timera zarządzanego przez menedżera timera.
‫Dzięki temu menedżer może mieć wiele liczników czasu i możemy uzyskać dostęp do informacji o liczniku dla każdego z nich,
‫używając uchwytu licznika jako rodzaju nazwy lub identyfikatora tego licznika.
‫Jest to obiekt typu uchwyt timera typu F.
‫Więc tworzymy uchwyt timera i przekazujemy go do funkcji set timer.
‫Teraz ustawiony timer wymaga również innych danych wejściowych, takich jak szybkość lub ilość czasu, przez którą powinniśmy
‫odczekać, zanim faktycznie coś zrobimy.
‫Teraz to coś będzie w naszej funkcji zwrotnej.
‫Tworzymy funkcję i wiążemy tę funkcję z zegarem, aby jak tylko upłynie odpowiedni czas,
‫a konkretnie szybkość zegara, można wywołać naszą funkcję zwrotną.
‫Widzieliśmy więc, że potrzebujemy kilku rzeczy do naszego timera i zamierzamy umieścić te rzeczy w klasie
‫wieży.
‫Przejdźmy więc do Wieży H i tutaj w pliku Wieży H dodamy kilka prywatnych zmiennych.
‫Więc tuż pod zasięgiem ognia, będziemy potrzebować naszego uchwytu timera.
‫To jest uchwyt czasomierza F i możemy go po prostu nazwać uchwytem czasomierza szybkostrzelności.
‫Potrzebujemy też szybkostrzelności, która będzie pływakiem.
‫Nazwiemy tę szybkostrzelność i możemy ją zainicjować do dwóch punktów F.
‫W ten sposób będziemy musieli czekać dwie sekundy, zanim nasza funkcja zwrotna zostanie wywołana.
‫Mówiąc o funkcjach zwrotnych, tak naprawdę potrzebujemy jednej.
‫Więc stworzymy funkcję void i możemy to nazwać sprawdzaniem warunku pożaru.
‫Mamy więc uchwyt timera i jak tylko ustawimy timer i zacznie działać, mamy 2
‫sekundy, aby poczekać, zanim timer faktycznie wywoła wywołanie naszej funkcji.
‫Nazywam to sprawdzaniem warunku pożaru, ponieważ możemy sprawdzić, czy nasza wieża powinna być w stanie wywołać funkcję
‫pożaru, więc możemy ustawić pewne warunki, które możemy sprawdzić, aby upewnić się, że należy wywołać
‫pożar.
‫Teraz mamy zadeklarowaną funkcję warunku pożaru.
‫Musimy to zdefiniować, abyśmy mogli przejść do wieży CPP i zdefiniować tutaj funkcję.
‫Zamierzam umieścić go pod rozpoczęciem odtwarzania, więc nadam mu treść funkcji i nazwę klasy wieży tuż
‫przed nazwą funkcji.
‫Więc teraz mamy funkcję, ale tak naprawdę musimy ustawić timer, aby ten czas zaczął biec i
‫funkcja zostanie wywołana pod koniec tego czasu.
‫I możemy tutaj ustawić zegar i rozpocząć grę, aby zaczęła działać od początku gry.
‫Wspomnieliśmy więc o menedżerze czasu światowego i możemy uzyskać do niego dostęp za pomocą funkcji o nazwie Get World
‫Timer Manager.
‫Teraz pobierz World Timer Manager, zwraca obiekt menedżera timera F.
‫A ponieważ używamy tego typu, będziemy musieli dołączyć plik nagłówkowy dla menedżera czasowego F.
‫Więc tutaj jest to po prostu menedżer czasowy h.
‫Możemy też zobaczyć niektóre funkcje należące do tej klasy.
‫Więc przewiń je, jeśli interesują Cię wszystkie różne funkcje, które należą do menedżera czasowego
‫F.
‫Możemy więc dołączyć ten plik nagłówkowy tutaj, na szczycie wieży, tuż pod innymi plikami dołączonymi.
‫Więc teraz, gdy mamy dołączony ten plik nagłówkowy, mamy teraz dostęp do menedżera czasu światowego, a
‫funkcja, która nas interesuje, nazywa się set timer.
‫Teraz pobierz światowy menedżer czasowy po prostu zwraca menedżer czasowy F, ale nie zwraca wskaźnika.
‫Więc użyjemy kropki zamiast.
‫Strzałka i zadzwonimy do ustawionego timera.
‫Teraz ustawiony timer ma kilka wersji lub przeciążeń funkcji.
‫Teraz vs code ma to wyskakujące okienko, które pozwala nam przejść przez każde przeciążenie i zobaczyć różne wersje
‫tej funkcji.
‫A wersja, którą jestem zainteresowany, najpierw przyjmuje uchwyt timera F, a my zamierzamy użyć naszego
‫uchwytu timera szybkostrzelności, który zadeklarowaliśmy w Tower H.
‫Teraz następnym parametrem dla naszego konkretnego przeciążenia funkcji będzie klasa użytkownika, podobnie jak w osi
‫bind i akcji bind.
‫To jest klasa, w której pracujemy, w której wiążemy funkcję, aby to było to.
‫Teraz następna będzie funkcja zwrotna, która będzie naszym warunkiem sprawdzania pożaru wieży A, funkcja,
‫którą właśnie stworzyliśmy.
‫Teraz potrzebujemy adresu operatora, ponieważ ustawiony timer przyjmuje adres funkcji.
‫Teraz następny parametr to liczba zmiennoprzecinkowa dla stawki, która będzie określać, ile czasu powinno upłynąć, zanim zostanie
‫wywołane nasze wywołanie zwrotne.
‫To będzie nasza szybkostrzelność.
‫A ostatnim parametrem jest wartość logiczna, która określa, czy ten zegar powinien się zapętlić.
‫Teraz chciałbym, aby nasza funkcja zwrotna była wywoływana co 2 sekundy, więc chcę, aby ten zegar zapętlił się.
‫Więc powiem, że prawda.
‫Gdybyśmy podawali fałsz, minęłyby 2 sekundy.
‫Nasza funkcja zostałaby wywołana i to by było na tyle.
‫Ale ponieważ ustawiliśmy to na pętlę, nasza funkcja zostanie wywołana po 2 sekundach, po czym licznik czasu
‫zostanie zrestartowany, a po kolejnych dwóch sekundach funkcja zostanie wywołana ponownie i będzie kontynuować pętlę,
‫aż gra się skończy.
‫Mamy teraz funkcję powiązaną z naszym zegarem i jest ona wywoływana co 2 sekundy.
‫Więc powiązaliśmy funkcję z naszym zegarem i będzie ona wywoływana co 2 sekundy.
‫Ale chcielibyśmy jakiegoś dowodu lub potwierdzenia, że ta funkcja jest faktycznie wywoływana.
‫Tak więc, aby sprostać wyzwaniu w klasie wieży, przejdź do naszej nowej funkcji zwrotnej, sprawdź stan pożaru.
‫Upewnij się, że czołg jest w zasięgu ognia.
‫Sprawdzisz odległość od wieży do czołgu.
‫I wiemy, jak to zrobić, ponieważ robimy to już w funkcji tiku.
‫Być może będziesz musiał zajrzeć do funkcji zaznaczania i zobaczyć, jak to się robi, aby sobie
‫przypomnieć, teraz sprawdź tę odległość, upewnij się, że jesteśmy w zasięgu ognia, a jeśli tak, wywołaj funkcję
‫ognia, zatrzymaj wideo i zaimplementuj teraz to.
‫Dobra.
‫Wróciłem więc do Tower CP i zamierzam tylko przewinąć w górę do funkcji zaznaczenia, aby przypomnieć sobie, jak
‫uzyskałem tę odległość i sprawdziłem, czy jest w zasięgu ognia.
‫Teraz możemy po prostu ponownie użyć tego kodu tutaj i sprawdzić stan pożaru.
‫Teraz ponowne użycie kodu nie jest zbyt wydajne, więc możemy pomyśleć o refaktoryzacji tego, ale najpierw upewnijmy się, że
‫wszystko działa, abyśmy mogli najpierw sprawdzić nasz wskaźnik czołgu, aby upewnić się, że jest prawidłowy.
‫Więc zrobię to tutaj i sprawdzę stan pożaru.
‫Powiem, czy zbiornik i jeśli zbiornik jest prawidłowy, następną rzeczą, jaką możemy zrobić, jest uzyskanie tej
‫odległości, która jest tą wartością tutaj obliczoną za pomocą funkcji f vector dist.
‫Więc wezmę to i położę tutaj, aby sprawdzić stan ognia.
‫Teraz następną rzeczą, którą robimy, jest sprawdzenie, czy odległość jest mniejsza lub równa zasięgowi ognia.
‫Więc to właśnie zrobimy tutaj.
‫Powiemy, czy odległość jest mniejsza lub równa zasięgowi ognia, a jeśli tak, to możemy po prostu
‫wywołać funkcję ognia.
‫Więc wezwiemy ogień, i to jest tak proste.
‫Więc chodźmy dalej i skompilujmy to, a my wrócimy do edytora, a ja włączę odtwarzanie i wejdę w
‫zasięg ognia.
‫Widzę, że nasze wieże rysują sfery debugowania na czubku lufy, więc widzimy,
‫że ta funkcja ognia jest wywoływana i działa tak samo dla wieży, jak dla czołgu.
‫Więc to jest świetne.
‫To udowadnia nam, że nasz timer działa i nasza funkcja zwrotna jest wywoływana co 2 sekundy.
‫Ok, więc mamy tę funkcję ognia wywoływaną co 2 sekundy, teraz sprawdzamy, stan ognia.
‫Mamy tę funkcję, w której sprawdzamy, czy jesteśmy w zasięgu i robimy dokładnie to samo
‫w funkcji tiku.
‫Jest to więc doskonała okazja do refaktoryzacji.
‫Moglibyśmy stworzyć jakąś funkcję, która zwróci nam wartość logiczną, jeśli będziemy w zasięgu czołgu.
‫Dlaczego więc nie pójdziemy dalej i po prostu szybko zrefaktoryzujemy to w funkcję zwracającą byki?
‫Więc tutaj, w Wieży H, stwórzmy prywatną funkcję.
‫Zwróci bool i powiemy, że na strzelnicy.
‫Teraz jest to prosta gra, a nasza wieża będzie w zasięgu tylko czołgu.
‫Więc nie jest to dwuznaczne, ponieważ nie ma nic innego, co wieża chciałaby kiedykolwiek sprawdzić,
‫aby zobaczyć, czy jest w zasięgu, gdyby była to bardziej skomplikowana gra z innymi rzeczami, dla których
‫wieża chciałaby sprawdzić odległość, moglibyśmy nazwij to trochę inaczej, ale możemy to po
‫prostu nazwać w zasięgu ognia.
‫A to, co zamierzam zrobić, to zaimplementować to tutaj w Tower.
‫Więc chodźmy dalej i stwórzmy ciało funkcji.
‫Będziemy potrzebować wieży przed ustaleniem nazwy funkcji.
‫A to, co tutaj zrobimy, to w zasadzie ta sama kontrola odległości.
‫Więc najpierw sprawdzimy, czy zbiornik jest prawidłowy, sprawdzając, czy.
‫Teraz, jeśli tak, to możemy uzyskać tę odległość, więc możemy skopiować tę linię i po prostu utworzyć nasz lokalny pływak
‫odległości tutaj i po prostu porównać tę odległość z zasięgiem ognia, abyśmy mogli powiedzieć, czy odległość jest mniejsza
‫lub równa zasięgowi ognia, a jeśli tak jest, możemy po prostu zwrócić true.
‫Ta funkcja może zwrócić wartość true.
‫A teraz mamy funkcję, którą możemy wywołać, która zwróci true, jeśli będziemy w zasięgu.
‫Teraz, gdy tylko trafimy na ten wiersz return true w instrukcji if, funkcja zwróci.
‫Wyskoczymy z funkcji.
‫Więc wszystko inne po tym, jeśli instrukcja nie zostanie uruchomiona.
‫Więc to, co możemy zrobić, to na samym końcu naszej funkcji zasięgu ognia, możemy zwrócić false, ponieważ
‫jeśli kiedykolwiek osiągniemy return true, nigdy nie dojdziemy do linii return false tutaj.
‫Po prostu wcześniej wyjdziemy z funkcji.
‫Ale jeśli nie jesteśmy w zasięgu, jeśli ten test odległości się nie powiedzie, to nigdy nie osiągniemy zwrotu prawda.
‫Dojdziemy do końca funkcji i zwrócimy false.
‫Tak więc ta funkcja zwróci prawdę lub fałsz w zależności od tego, czy jesteśmy w zakresie, czy nie, i możemy tego
‫użyć zamiast używać powtarzającego się kodu w naszych dwóch funkcjach.
‫Na przykład tutaj w tiku potrzebujemy tylko jednego sprawdzenia, aby sprawdzić, czy jesteśmy w zasięgu, zanim obrócimy
‫wieżę.
‫Więc co możemy zrobić, to powiedzieć, czy jesteśmy w zasięgu ognia, a jeśli to się powiedzie, jesteśmy w zasięgu ognia, więc możemy
‫wywołać obrót wieży.
‫Więc umieścimy to w instrukcji if.
‫A teraz cały ten kod jest niepotrzebny, więc możemy go po prostu usunąć.
‫A teraz wygląda to o wiele czyściej niż to, co mieliśmy wcześniej.
‫A potem możemy zejść tutaj, sprawdzić stan pożaru i zrobić to samo.
‫Zamiast tego możemy po prostu sprawdzić, czy znajduje się w zasięgu ognia.
‫A jeśli tak, możemy po prostu wezwać ogień.
‫Więc teraz pomyślnie zrefaktoryzowaliśmy cały ten kod w test, który jest wykonywany w naszej funkcji zasięgu
‫ognia.
‫Więc chodźmy dalej, skompilujmy to ponownie i po prostu zagrajmy w test naprawdę szybko, aby upewnić się, że wszystko
‫działa zgodnie z oczekiwaniami.
‫Więc pójdziemy dalej, wciśniemy „play” i znajdziemy się w zasięgu ognia.
‫I oczywiście jesteśmy na strzelnicy i działa to poprawnie.
‫Podsumowując, stworzyliśmy licznik czasu i co 2 sekundy wywołujemy funkcję ognia w klasie
‫wieży.
‫Teraz sprawdzamy również, czy Tank jest w zasięgu.
‫Więc wywołujemy funkcję ostrzału tylko co 2 sekundy, jeśli czołg znajduje się w zasięgu ostrzału.
‫Widzieliśmy również, że używamy tej kontroli odległości w dwóch różnych funkcjach.
‫Przekształciliśmy go więc w jego własną funkcję i po prostu wywołujemy to, aby sprawdzić, czy jesteśmy w zasięgu.
‫Tak więc mamy teraz funkcję ogniową nazywaną klasą wieży.
‫Następną rzeczą do zrobienia jest rozpoczęcie tworzenia pocisków za pomocą naszej funkcji ognia.
‫Porozmawiamy o tym w następnym filmie.
‫Zobaczymy się wkrótce.