‫Witamy spowrotem.
‫Teraz mamy tryb gry i chcielibyśmy go użyć do określenia, kiedy możemy rozpocząć grę.
‫Teraz niektóre gry mają opóźnienie lub licznik czasu, który uruchamia się po rozpoczęciu gry.
‫A po określonym czasie gracz może poruszać postacią lub w naszym przypadku
‫czołgiem po całym świecie.
‫Więc zamierzamy to zaimplementować w tym filmie.
‫Będzie to obejmować najpierw wyłączenie wejścia, abyśmy nie mogli się poruszać, gdy gra się po raz
‫pierwszy rozpocznie, a następnie ustawimy zegar, a po określonym czasie będziemy mogli włączyć wejście.
‫Wróćmy więc do trybu gry w czołgi i dodajmy tutaj kilka rzeczy.
‫Po pierwsze, chciałbym dodać pływak na czas, który powinien upłynąć po rozpoczęciu gry, zanim będziemy mogli
‫zacząć się ruszać.
‫Więc to zmiennoprzecinkowe będzie nazywane opóźnieniem startu i zamierzam zainicjować to do trzech punktów F, abyśmy musieli
‫poczekać 3 sekundy, zanim będziemy mogli rozpocząć grę.
‫Teraz, jak tylko gra się uruchomi, chciałbym uruchomić ten zegar, co oznacza, że chciałbym mieć funkcję,
‫która uruchomi ten zegar, i zamierzam również uczynić tę funkcję prywatną.
‫Uczynię z tego funkcję void o nazwie handle start game start.
‫Teraz mogę zaimplementować handle start game start w trybie tune tank game.
‫Zejdź tutaj i rozpocznij grę.
‫Teraz nie zapomnę dodać tutaj nazwy klasy trybu gry tune tank i teraz mam funkcję startu
‫gry.
‫Teraz można to nazwać Begin Play.
‫Od początku gry wywoływana jest funkcja Begin Play.
‫Zadzwonię więc do gry w uchwyt, zacznij tutaj i zacznij grać.
‫A ponieważ robimy tu kilka rzeczy na początku gry, gdzie ustawiamy
‫czołg i dostrajamy czołgi, gracza, zmienne kontrolera, chciałbym przenieść je do uchwytu startu gry.
‫Więc zamierzam przesunąć je w dół, do obsługi startu gry iw ten sposób kontroler czołgu
‫i tuningu czołgów zostanie ustawiony, ponieważ nazywamy handlem game start tutaj i zaczynamy grę.
‫W tym miejscu chciałbym uruchomić licznik czasu, po którym możemy włączyć dane wejściowe użytkownika.
‫Teraz, zanim uruchomimy stoper, wyłączę wprowadzanie danych, abyśmy nie mogli jeszcze przesunąć czołgu.
‫A to będzie wymagało naszej funkcji.
‫Umieściliśmy tutaj w tuning tankach kontroler gracza o nazwie set player enabled state.
‫A to oznacza, że zamierzam używać czołgów tuningowych, kontrolera gracza.
‫A jeśli mam zamiar używać kontrolera gracza w tuningu czołgu, to dobrym pomysłem jest upewnienie się, że jest poprawny.
‫Więc powiem, że jeśli dostroicie zbiorniki, gracza, kontrolera i jeśli dotrzemy do
‫wnętrza tego wyrażenia if, wtedy mogę dostroić zbiorniki, kontroler gracza i wywołać stan włączenia gracza i przekazać jako fałsz.
‫I w ten sposób nasz czołg nie będzie mógł się ruszyć.
‫I widzę czerwone zawijasy, a to dlatego, że powiedziałem czołgi, kontroler gracza, a nie dostrajanie
‫czołgów.
‫Więc pisownia poprawnie teraz nie otrzymuję tam błędów.
‫Więc teraz musimy uruchomić stoper.
‫Teraz wiemy, że czasomierze wymagają użycia uchwytu czasomierza F i możemy w rzeczywistości utworzyć uchwyt czasomierza
‫F zamiast mieć zmienną składową należącą do klasy.
‫Więc zamierzam to zrobić i wywołam ten odtwarzacz enable timer handle.
‫A teraz musimy ustawić timer dla funkcji zwrotnej dla naszego timera, chciałbym użyć
‫set player enabled state, ale set player enabled state to funkcja, która wymaga wprowadzenia typu boolean.
‫Teraz nie widzieliśmy, jak ustawić timer za pomocą wywołania zwrotnego, które wymaga parametrów wejściowych.
‫Będzie to obejmować nową koncepcję zwaną delegatem czasowym.
‫Przyjrzyjmy się więc systemowi timera Unreal Engine.
‫Znowu wiemy, że istnieje światowy menedżer czasowy, który zarządza naszymi zegarami i ma funkcję ustawiania timera.
‫Teraz istnieje wiele przeciążeń funkcji ustawionego timera.
‫Jeden z nich już widzieliśmy.
‫Teraz opowiem o kolejnej wersji tej funkcji.
‫A ta wersja wymaga uchwytu timera, szybkości timera lub czasu opóźnienia, podczas którego musimy czekać, zanim nasza
‫funkcja zwrotna zostanie wywołana.
‫I zamiast bezpośrednio pobierać adres funkcji zwrotnej, może przyjąć coś, co nazywa się delegatem
‫czasowym.
‫Jest to struktura delegata czasomierza typu F, która pozwala nam stworzyć obiekt, który może bezpośrednio powiązać z
‫nim funkcję.
‫A delegaci czasomierza mogą wiązać funkcje, które wymagają parametrów wejściowych.
‫Teraz możemy utworzyć zmienną delegata czasomierza EF i zainicjować ją za pomocą funkcji tworzenia obiektu z
‫delegata czasomierza f.
‫Spowoduje to utworzenie nowego delegata czasomierza i zainicjowanie go na podstawie tego, co przekazujemy w nawiasach.
‫To zajmie obiekt użytkownika, który jest z.
‫Oczywiście klasa, w której istnieje nasza funkcja zwrotna.
‫A następnie pobiera adres samej funkcji zwrotnej, po której następują dowolne wartości wejściowe, które chcielibyśmy przekazać
‫do naszego wywołania zwrotnego, gdy zostanie wywołane.
‫Stamtąd możemy wywołać set timer z menedżera światowego timera i użyć przeciążenia, które wymaga delegata
‫timera.
‫To przeciążenie wymaga samego uchwytu timera, delegata timera, szybkości odtwarzania lub wartości zmiennoprzecinkowej, która określa opóźnienie, przed
‫którym zostanie wywołana nasza funkcja zwrotna, a następnie wartości logicznej, aby określić, czy nasz timer
‫powinien zapętlić się, abyśmy wiedzieli, jak utworzyć F delegat czasowy.
‫Więc chciałbym, abyś utworzył jedną w funkcji startowej uchwytu w naszej nowej instrukcji if.
‫Stwórz więc lokalnego delegata czasowego f i użyj delegata czasowego f.
‫Stwórz swój obiekt.
‫Teraz będziemy musieli przekazać obiekt użytkownika i zwykle używaliśmy go jako obiektu użytkownika,
‫ale funkcja, którą chcielibyśmy wywołać, istnieje w kontrolerze odtwarzacza.
‫Tak więc przejście to kontroler gracza ze zmiennymi dostrojeniami jako pierwsze wejście, które będzie
‫obiektem użytkownika, a funkcja wywołania zwrotnego będzie ustawiona na stan włączenia odtwarzacza, którą dodaliśmy do naszego
‫niestandardowego kontrolera odtwarzacza.
‫Nie zapomnij o adresie operatora i jako trzecie wejście przekażemy wartość.
‫To prawda, to jest to, co zostanie przekazane do stanu włączenia odtwarzacza, gdy nasz callback zostanie wywołany
‫na końcu licznika.
‫Więc zatrzymaj wideo i spróbuj teraz.
‫Tak więc tuż pod naszym uchwytem czasomierza, zamierzam utworzyć lokalnego delegata czasomierza F i
‫wywołam tego odtwarzacza, aby włączyć delegata czasomierza.
‫W porządku.
‫Jeśli nazwałeś to inaczej.
‫Teraz zamierzam zainicjować to za pomocą timera f, delegować, utworzyć obiekt.
‫A to najpierw zabierze obiekt użytkownika, a to będzie nasz kontroler odtwarzacza czołgów tuningowych.
‫Więc powiem dostroić kontroler gracza czołgów jako pierwsze wejście.
‫A po drugie potrzebujemy naszej funkcji zwrotnej i będzie to odtwarzacz dostrojenia czołgów,
‫stan włączony odtwarzacza ustawień kontrolera.
‫I nie mogę zapomnieć, że potrzebuję adresu operatora dla adresu tej funkcji, a wartość, którą chciałbym
‫przekazać do tej funkcji zwrotnej, będzie w ten sposób prawdziwa.
‫Pod koniec czasu opóźnienia, kiedy to wywołanie zwrotne zostanie wywołane, wartość zostanie przekazana do
‫funkcji zwrotnej.
‫Teraz mogę zadzwonić do ustawionego timera, co oznacza, że muszę zadzwonić po menedżera czasu światowego.
‫A potem stamtąd mogę zadzwonić do ustawionego timera.
‫A przeciążenie funkcji, którego używamy jako pierwsze, przyjmuje uchwyt licznika czasu, a będzie to uchwyt
‫licznika włączenia odtwarzacza.
‫Następnym wejściem, które przekażę, będzie delegat.
‫Więc to będzie włączenie gracza, delegat czasowy.
‫Następny.
‫Potrzebujemy naszego czasu opóźnienia, a to będzie opóźnienie startu, czyli właśnie utworzona wartość zmiennoprzecinkowa.
‫Więc dalej przejeżdżam z opóźnieniem startu.
‫I na koniec, nie chcę, aby ten zegar się zapętlał, więc przekażę fałsz, aby nie uzyskać
‫zapętlonego zachowania.
‫Teraz zamierzam przejść dalej i wciąć te dane wejściowe, aby wyglądały ładnie.
‫A teraz wywołujemy set timer za pomocą naszego nowego delegata timera.
‫I pod koniec tego czasu opóźnienia powinniśmy otrzymać wywołanie naszej funkcji zwrotnej ustawionej jako stan włączenia odtwarzacza
‫z przekazaną wartością true, ponieważ opóźnienie startu wynosi 3 sekundy i wywołujemy stan włączenia odtwarzacza
‫ustawiony na wartość false, zanim ustawimy nasz timer.
‫Kiedy wciśniemy play, nie powinniśmy być w stanie się ruszyć, dopóki nie minie to trzysekundowe opóźnienie.
‫Więc skompilujmy to i zobaczmy, jak to działa.
‫Więc zamierzam iść dalej i wciskam play, próbuję się poruszać i nie mogę.
‫A po 3 sekundach mogę się nagle ruszyć.
‫A także sprawdź to.
‫Zauważ, że mój kursor to celownik.
‫Może to być trudne do zobaczenia na ekranie, ale powinno być dobrze widoczne na ekranie.
‫A to znacznie ułatwia mi celowanie i kontrolowanie czołgów.
‫Obrót wieży.
‫Idealny.
‫Podsumowując, stworzyliśmy funkcję obsługi startu gry dla trybu gry, wywołujemy to i rozpoczynamy
‫grę.
‫Ustawiamy również licznik czasu za pomocą delegata licznika czasu, z którym powiązaliśmy naszą funkcję ustawienia stanu włączenia odtwarzacza na
‫kontrolerze odtwarzacza.
‫To pozwoliło nam na wywołanie funkcji zwrotnej dla naszego licznika, która pobiera parametry wejściowe i używamy tego, aby
‫umożliwić wprowadzanie danych przez użytkownika po trzysekundowym opóźnieniu po uruchomieniu gry.
‫Może to być frustrujące dla gracza, jeśli nie miałby jakiejś wizualnej wskazówki, jakby informującej
‫go, że wejście nie jest włączone.
‫Coś jak odliczanie na ekranie.
‫Zajmiemy się tym w przyszłych filmach.
‫Ale na razie gratulacje.
‫Wiesz teraz, jak powiązać funkcję, która pobiera parametry wejściowe z delegatem czasomierza.
‫Do zobaczenia w następnym filmie.