﻿1
00:00:04,260 --> 00:00:05,340
‫Witamy spowrotem.

2
00:00:05,700 --> 00:00:11,550
‫Teraz mamy tryb gry i chcielibyśmy go użyć do określenia, kiedy możemy rozpocząć grę.

3
00:00:11,580 --> 00:00:17,700
‫Teraz niektóre gry mają opóźnienie lub licznik czasu, który uruchamia się po rozpoczęciu gry.

4
00:00:17,700 --> 00:00:23,460
‫A po określonym czasie gracz może poruszać postacią lub w naszym przypadku

5
00:00:23,460 --> 00:00:25,450
‫czołgiem po całym świecie.

6
00:00:25,470 --> 00:00:28,500
‫Więc zamierzamy to zaimplementować w tym filmie.

7
00:00:28,530 --> 00:00:35,520
‫Będzie to obejmować najpierw wyłączenie wejścia, abyśmy nie mogli się poruszać, gdy gra się po raz

8
00:00:35,520 --> 00:00:41,860
‫pierwszy rozpocznie, a następnie ustawimy zegar, a po określonym czasie będziemy mogli włączyć wejście.

9
00:00:41,880 --> 00:00:47,870
‫Wróćmy więc do trybu gry w czołgi i dodajmy tutaj kilka rzeczy.

10
00:00:47,880 --> 00:00:54,030
‫Po pierwsze, chciałbym dodać pływak na czas, który powinien upłynąć po rozpoczęciu gry, zanim będziemy mogli

11
00:00:54,030 --> 00:00:55,380
‫zacząć się ruszać.

12
00:00:55,410 --> 00:01:03,120
‫Więc to zmiennoprzecinkowe będzie nazywane opóźnieniem startu i zamierzam zainicjować to do trzech punktów F, abyśmy musieli

13
00:01:03,120 --> 00:01:06,800
‫poczekać 3 sekundy, zanim będziemy mogli rozpocząć grę.

14
00:01:06,810 --> 00:01:12,420
‫Teraz, jak tylko gra się uruchomi, chciałbym uruchomić ten zegar, co oznacza, że chciałbym mieć funkcję,

15
00:01:12,420 --> 00:01:16,510
‫która uruchomi ten zegar, i zamierzam również uczynić tę funkcję prywatną.

16
00:01:16,530 --> 00:01:21,180
‫Uczynię z tego funkcję void o nazwie handle start game start.

17
00:01:21,210 --> 00:01:25,200
‫Teraz mogę zaimplementować handle start game start w trybie tune tank game.

18
00:01:25,470 --> 00:01:28,320
‫Zejdź tutaj i rozpocznij grę.

19
00:01:28,770 --> 00:01:36,090
‫Teraz nie zapomnę dodać tutaj nazwy klasy trybu gry tune tank i teraz mam funkcję startu

20
00:01:36,090 --> 00:01:36,930
‫gry.

21
00:01:37,170 --> 00:01:40,410
‫Teraz można to nazwać Begin Play.

22
00:01:40,620 --> 00:01:43,590
‫Od początku gry wywoływana jest funkcja Begin Play.

23
00:01:43,590 --> 00:01:47,180
‫Zadzwonię więc do gry w uchwyt, zacznij tutaj i zacznij grać.

24
00:01:47,190 --> 00:01:52,110
‫A ponieważ robimy tu kilka rzeczy na początku gry, gdzie ustawiamy

25
00:01:52,110 --> 00:01:58,050
‫czołg i dostrajamy czołgi, gracza, zmienne kontrolera, chciałbym przenieść je do uchwytu startu gry.

26
00:01:58,050 --> 00:02:03,600
‫Więc zamierzam przesunąć je w dół, do obsługi startu gry iw ten sposób kontroler czołgu

27
00:02:03,600 --> 00:02:08,940
‫i tuningu czołgów zostanie ustawiony, ponieważ nazywamy handlem game start tutaj i zaczynamy grę.

28
00:02:08,940 --> 00:02:15,990
‫W tym miejscu chciałbym uruchomić licznik czasu, po którym możemy włączyć dane wejściowe użytkownika.

29
00:02:15,990 --> 00:02:21,480
‫Teraz, zanim uruchomimy stoper, wyłączę wprowadzanie danych, abyśmy nie mogli jeszcze przesunąć czołgu.

30
00:02:21,690 --> 00:02:24,420
‫A to będzie wymagało naszej funkcji.

31
00:02:24,420 --> 00:02:29,670
‫Umieściliśmy tutaj w tuning tankach kontroler gracza o nazwie set player enabled state.

32
00:02:29,670 --> 00:02:33,690
‫A to oznacza, że zamierzam używać czołgów tuningowych, kontrolera gracza.

33
00:02:33,690 --> 00:02:38,400
‫A jeśli mam zamiar używać kontrolera gracza w tuningu czołgu, to dobrym pomysłem jest upewnienie się, że jest poprawny.

34
00:02:38,400 --> 00:02:46,200
‫Więc powiem, że jeśli dostroicie zbiorniki, gracza, kontrolera i jeśli dotrzemy do

35
00:02:46,200 --> 00:02:57,570
‫wnętrza tego wyrażenia if, wtedy mogę dostroić zbiorniki, kontroler gracza i wywołać stan włączenia gracza i przekazać jako fałsz.

36
00:02:57,690 --> 00:03:00,720
‫I w ten sposób nasz czołg nie będzie mógł się ruszyć.

37
00:03:00,720 --> 00:03:06,780
‫I widzę czerwone zawijasy, a to dlatego, że powiedziałem czołgi, kontroler gracza, a nie dostrajanie

38
00:03:06,780 --> 00:03:07,380
‫czołgów.

39
00:03:07,830 --> 00:03:11,250
‫Więc pisownia poprawnie teraz nie otrzymuję tam błędów.

40
00:03:11,250 --> 00:03:13,690
‫Więc teraz musimy uruchomić stoper.

41
00:03:13,710 --> 00:03:20,850
‫Teraz wiemy, że czasomierze wymagają użycia uchwytu czasomierza F i możemy w rzeczywistości utworzyć uchwyt czasomierza

42
00:03:20,850 --> 00:03:25,110
‫F zamiast mieć zmienną składową należącą do klasy.

43
00:03:25,200 --> 00:03:31,470
‫Więc zamierzam to zrobić i wywołam ten odtwarzacz enable timer handle.

44
00:03:31,800 --> 00:03:38,340
‫A teraz musimy ustawić timer dla funkcji zwrotnej dla naszego timera, chciałbym użyć

45
00:03:38,340 --> 00:03:45,390
‫set player enabled state, ale set player enabled state to funkcja, która wymaga wprowadzenia typu boolean.

46
00:03:45,990 --> 00:03:51,900
‫Teraz nie widzieliśmy, jak ustawić timer za pomocą wywołania zwrotnego, które wymaga parametrów wejściowych.

47
00:03:51,900 --> 00:03:56,190
‫Będzie to obejmować nową koncepcję zwaną delegatem czasowym.

48
00:03:56,190 --> 00:03:59,310
‫Przyjrzyjmy się więc systemowi timera Unreal Engine.

49
00:03:59,310 --> 00:04:07,080
‫Znowu wiemy, że istnieje światowy menedżer czasowy, który zarządza naszymi zegarami i ma funkcję ustawiania timera.

50
00:04:07,170 --> 00:04:11,280
‫Teraz istnieje wiele przeciążeń funkcji ustawionego timera.

51
00:04:11,370 --> 00:04:13,410
‫Jeden z nich już widzieliśmy.

52
00:04:13,440 --> 00:04:16,710
‫Teraz opowiem o kolejnej wersji tej funkcji.

53
00:04:16,710 --> 00:04:24,570
‫A ta wersja wymaga uchwytu timera, szybkości timera lub czasu opóźnienia, podczas którego musimy czekać, zanim nasza

54
00:04:24,570 --> 00:04:26,760
‫funkcja zwrotna zostanie wywołana.

55
00:04:26,760 --> 00:04:32,550
‫I zamiast bezpośrednio pobierać adres funkcji zwrotnej, może przyjąć coś, co nazywa się delegatem

56
00:04:32,550 --> 00:04:33,270
‫czasowym.

57
00:04:33,270 --> 00:04:40,440
‫Jest to struktura delegata czasomierza typu F, która pozwala nam stworzyć obiekt, który może bezpośrednio powiązać z

58
00:04:40,440 --> 00:04:41,490
‫nim funkcję.

59
00:04:41,490 --> 00:04:45,600
‫A delegaci czasomierza mogą wiązać funkcje, które wymagają parametrów wejściowych.

60
00:04:45,600 --> 00:04:53,370
‫Teraz możemy utworzyć zmienną delegata czasomierza EF i zainicjować ją za pomocą funkcji tworzenia obiektu z

61
00:04:53,370 --> 00:04:55,080
‫delegata czasomierza f.

62
00:04:55,110 --> 00:05:00,990
‫Spowoduje to utworzenie nowego delegata czasomierza i zainicjowanie go na podstawie tego, co przekazujemy w nawiasach.

63
00:05:00,990 --> 00:05:03,810
‫To zajmie obiekt użytkownika, który jest z.

64
00:05:03,860 --> 00:05:08,110
‫Oczywiście klasa, w której istnieje nasza funkcja zwrotna.

65
00:05:08,120 --> 00:05:15,110
‫A następnie pobiera adres samej funkcji zwrotnej, po której następują dowolne wartości wejściowe, które chcielibyśmy przekazać

66
00:05:15,110 --> 00:05:18,450
‫do naszego wywołania zwrotnego, gdy zostanie wywołane.

67
00:05:18,470 --> 00:05:24,830
‫Stamtąd możemy wywołać set timer z menedżera światowego timera i użyć przeciążenia, które wymaga delegata

68
00:05:24,830 --> 00:05:25,450
‫timera.

69
00:05:25,460 --> 00:05:32,300
‫To przeciążenie wymaga samego uchwytu timera, delegata timera, szybkości odtwarzania lub wartości zmiennoprzecinkowej, która określa opóźnienie, przed

70
00:05:32,300 --> 00:05:38,630
‫którym zostanie wywołana nasza funkcja zwrotna, a następnie wartości logicznej, aby określić, czy nasz timer

71
00:05:38,630 --> 00:05:43,310
‫powinien zapętlić się, abyśmy wiedzieli, jak utworzyć F delegat czasowy.

72
00:05:43,310 --> 00:05:49,610
‫Więc chciałbym, abyś utworzył jedną w funkcji startowej uchwytu w naszej nowej instrukcji if.

73
00:05:49,610 --> 00:05:54,200
‫Stwórz więc lokalnego delegata czasowego f i użyj delegata czasowego f.

74
00:05:54,200 --> 00:05:55,640
‫Stwórz swój obiekt.

75
00:05:55,640 --> 00:06:01,610
‫Teraz będziemy musieli przekazać obiekt użytkownika i zwykle używaliśmy go jako obiektu użytkownika,

76
00:06:01,610 --> 00:06:05,870
‫ale funkcja, którą chcielibyśmy wywołać, istnieje w kontrolerze odtwarzacza.

77
00:06:05,870 --> 00:06:12,320
‫Tak więc przejście to kontroler gracza ze zmiennymi dostrojeniami jako pierwsze wejście, które będzie

78
00:06:12,320 --> 00:06:18,890
‫obiektem użytkownika, a funkcja wywołania zwrotnego będzie ustawiona na stan włączenia odtwarzacza, którą dodaliśmy do naszego

79
00:06:18,890 --> 00:06:20,300
‫niestandardowego kontrolera odtwarzacza.

80
00:06:20,300 --> 00:06:25,730
‫Nie zapomnij o adresie operatora i jako trzecie wejście przekażemy wartość.

81
00:06:25,730 --> 00:06:32,330
‫To prawda, to jest to, co zostanie przekazane do stanu włączenia odtwarzacza, gdy nasz callback zostanie wywołany

82
00:06:32,330 --> 00:06:33,590
‫na końcu licznika.

83
00:06:33,590 --> 00:06:36,710
‫Więc zatrzymaj wideo i spróbuj teraz.

84
00:06:39,560 --> 00:06:46,580
‫Tak więc tuż pod naszym uchwytem czasomierza, zamierzam utworzyć lokalnego delegata czasomierza F i

85
00:06:46,580 --> 00:06:50,540
‫wywołam tego odtwarzacza, aby włączyć delegata czasomierza.

86
00:06:51,140 --> 00:06:51,710
‫W porządku.

87
00:06:51,710 --> 00:06:53,030
‫Jeśli nazwałeś to inaczej.

88
00:06:53,030 --> 00:07:00,200
‫Teraz zamierzam zainicjować to za pomocą timera f, delegować, utworzyć obiekt.

89
00:07:00,470 --> 00:07:06,590
‫A to najpierw zabierze obiekt użytkownika, a to będzie nasz kontroler odtwarzacza czołgów tuningowych.

90
00:07:06,590 --> 00:07:11,300
‫Więc powiem dostroić kontroler gracza czołgów jako pierwsze wejście.

91
00:07:11,390 --> 00:07:19,250
‫A po drugie potrzebujemy naszej funkcji zwrotnej i będzie to odtwarzacz dostrojenia czołgów,

92
00:07:19,910 --> 00:07:23,360
‫stan włączony odtwarzacza ustawień kontrolera.

93
00:07:23,360 --> 00:07:30,290
‫I nie mogę zapomnieć, że potrzebuję adresu operatora dla adresu tej funkcji, a wartość, którą chciałbym

94
00:07:30,290 --> 00:07:34,670
‫przekazać do tej funkcji zwrotnej, będzie w ten sposób prawdziwa.

95
00:07:34,670 --> 00:07:41,120
‫Pod koniec czasu opóźnienia, kiedy to wywołanie zwrotne zostanie wywołane, wartość zostanie przekazana do

96
00:07:41,120 --> 00:07:42,290
‫funkcji zwrotnej.

97
00:07:42,290 --> 00:07:48,770
‫Teraz mogę zadzwonić do ustawionego timera, co oznacza, że muszę zadzwonić po menedżera czasu światowego.

98
00:07:48,950 --> 00:07:51,530
‫A potem stamtąd mogę zadzwonić do ustawionego timera.

99
00:07:52,070 --> 00:07:59,030
‫A przeciążenie funkcji, którego używamy jako pierwsze, przyjmuje uchwyt licznika czasu, a będzie to uchwyt

100
00:07:59,060 --> 00:08:00,560
‫licznika włączenia odtwarzacza.

101
00:08:00,590 --> 00:08:04,370
‫Następnym wejściem, które przekażę, będzie delegat.

102
00:08:04,370 --> 00:08:08,630
‫Więc to będzie włączenie gracza, delegat czasowy.

103
00:08:10,130 --> 00:08:10,520
‫Następny.

104
00:08:10,520 --> 00:08:16,700
‫Potrzebujemy naszego czasu opóźnienia, a to będzie opóźnienie startu, czyli właśnie utworzona wartość zmiennoprzecinkowa.

105
00:08:16,730 --> 00:08:20,120
‫Więc dalej przejeżdżam z opóźnieniem startu.

106
00:08:20,990 --> 00:08:27,590
‫I na koniec, nie chcę, aby ten zegar się zapętlał, więc przekażę fałsz, aby nie uzyskać

107
00:08:27,590 --> 00:08:28,430
‫zapętlonego zachowania.

108
00:08:29,300 --> 00:08:33,020
‫Teraz zamierzam przejść dalej i wciąć te dane wejściowe, aby wyglądały ładnie.

109
00:08:33,710 --> 00:08:38,690
‫A teraz wywołujemy set timer za pomocą naszego nowego delegata timera.

110
00:08:38,690 --> 00:08:45,380
‫I pod koniec tego czasu opóźnienia powinniśmy otrzymać wywołanie naszej funkcji zwrotnej ustawionej jako stan włączenia odtwarzacza

111
00:08:45,380 --> 00:08:51,440
‫z przekazaną wartością true, ponieważ opóźnienie startu wynosi 3 sekundy i wywołujemy stan włączenia odtwarzacza

112
00:08:51,440 --> 00:08:55,190
‫ustawiony na wartość false, zanim ustawimy nasz timer.

113
00:08:55,190 --> 00:09:00,920
‫Kiedy wciśniemy play, nie powinniśmy być w stanie się ruszyć, dopóki nie minie to trzysekundowe opóźnienie.

114
00:09:00,920 --> 00:09:03,590
‫Więc skompilujmy to i zobaczmy, jak to działa.

115
00:09:04,100 --> 00:09:09,140
‫Więc zamierzam iść dalej i wciskam play, próbuję się poruszać i nie mogę.

116
00:09:09,140 --> 00:09:12,470
‫A po 3 sekundach mogę się nagle ruszyć.

117
00:09:12,500 --> 00:09:14,210
‫A także sprawdź to.

118
00:09:14,240 --> 00:09:17,330
‫Zauważ, że mój kursor to celownik.

119
00:09:17,330 --> 00:09:23,000
‫Może to być trudne do zobaczenia na ekranie, ale powinno być dobrze widoczne na ekranie.

120
00:09:23,000 --> 00:09:27,470
‫A to znacznie ułatwia mi celowanie i kontrolowanie czołgów.

121
00:09:27,470 --> 00:09:28,820
‫Obrót wieży.

122
00:09:29,210 --> 00:09:30,140
‫Idealny.

123
00:09:30,140 --> 00:09:36,440
‫Podsumowując, stworzyliśmy funkcję obsługi startu gry dla trybu gry, wywołujemy to i rozpoczynamy

124
00:09:36,440 --> 00:09:37,370
‫grę.

125
00:09:37,580 --> 00:09:45,830
‫Ustawiamy również licznik czasu za pomocą delegata licznika czasu, z którym powiązaliśmy naszą funkcję ustawienia stanu włączenia odtwarzacza na

126
00:09:45,830 --> 00:09:47,180
‫kontrolerze odtwarzacza.

127
00:09:47,180 --> 00:09:53,810
‫To pozwoliło nam na wywołanie funkcji zwrotnej dla naszego licznika, która pobiera parametry wejściowe i używamy tego, aby

128
00:09:53,810 --> 00:09:58,340
‫umożliwić wprowadzanie danych przez użytkownika po trzysekundowym opóźnieniu po uruchomieniu gry.

129
00:09:58,370 --> 00:10:03,470
‫Może to być frustrujące dla gracza, jeśli nie miałby jakiejś wizualnej wskazówki, jakby informującej

130
00:10:03,470 --> 00:10:05,690
‫go, że wejście nie jest włączone.

131
00:10:05,690 --> 00:10:08,150
‫Coś jak odliczanie na ekranie.

132
00:10:08,150 --> 00:10:10,640
‫Zajmiemy się tym w przyszłych filmach.

133
00:10:10,640 --> 00:10:12,410
‫Ale na razie gratulacje.

134
00:10:12,410 --> 00:10:18,170
‫Wiesz teraz, jak powiązać funkcję, która pobiera parametry wejściowe z delegatem czasomierza.

135
00:10:18,170 --> 00:10:19,640
‫Do zobaczenia w następnym filmie.

