﻿1
00:00:04,460 --> 00:00:05,180
‫Cześć i witaj.

2
00:00:05,180 --> 00:00:10,490
‫W tym wykładzie będziemy tworzyć tryb gry KML, który będzie tylko jednym z

3
00:00:10,490 --> 00:00:17,660
‫możliwych trybów gry, które możemy stworzyć dzięki zastosowaniu wirtualnej -- zabitej metody, którą można wywołać w dowolnej

4
00:00:17,660 --> 00:00:19,730
‫grze. tryby, które chcemy.

5
00:00:20,000 --> 00:00:24,290
‫Zanurzmy się i zobaczmy, jak zamierzamy wdrożyć tę wirtualną metodę.

6
00:00:25,600 --> 00:00:28,600
‫Chcielibyśmy więc, aby nasza gra mogła się zakończyć.

7
00:00:28,610 --> 00:00:29,710
‫Co to znaczy, że gra się kończy?

8
00:00:29,710 --> 00:00:34,720
‫Oznacza to, że wchodzimy w jakiś stan, w którym mamy lub przegraliśmy.

9
00:00:35,080 --> 00:00:37,210
‫Informujemy gracza za pomocą jakiegoś interfejsu użytkownika.

10
00:00:37,210 --> 00:00:42,880
‫Dajemy im możliwość ponownego uruchomienia i zagrania jeszcze raz, coś w tym stylu.

11
00:00:43,000 --> 00:00:46,830
‫Teraz klasy zaangażowane w to zazwyczaj są w trybie gry.

12
00:00:46,840 --> 00:00:52,210
‫Tryb gry odpowiada za decydowanie o zasadach gry, takich jak kto wygrał, a kto przegrał.

13
00:00:52,840 --> 00:00:56,410
‫A do tego będziemy musieli wiedzieć, kto zostanie zabity.

14
00:00:56,410 --> 00:01:02,440
‫Więc będziemy mieli tę wirtualną metodę zwaną zabicie pionka, która zostanie wywołana jako pionek

15
00:01:02,440 --> 00:01:03,940
‫strzelca, gdy umrze.

16
00:01:03,940 --> 00:01:09,130
‫Niezależnie od tego, czy jest to A. I. albo to gracz umiera.

17
00:01:10,450 --> 00:01:15,280
‫Co więcej, chcę dodać tutaj małą komplikację, która polega na tym, że będą miały różne

18
00:01:15,280 --> 00:01:18,310
‫tryby gry wywodzące się z naszego głównego trybu strzelanki.

19
00:01:18,610 --> 00:01:20,290
‫Zaimplementują ten tryb gry.

20
00:01:20,290 --> 00:01:21,520
‫To właśnie oznacza strzałka.

21
00:01:21,520 --> 00:01:25,780
‫Kierunek strzały często jest trochę sprzeczny z intuicją, ale zabij ich wszystkich.

22
00:01:25,780 --> 00:01:33,250
‫Tryb gry dziedziczy z trybu strzelanki i zastępuje zabitego pionka, aby liczyć i inaczej

23
00:01:33,250 --> 00:01:35,710
‫decydować o zasadach gry.

24
00:01:35,710 --> 00:01:41,740
‫Dlatego chcę umieścić metodę wirtualnego zabicia pionka w trybie nadrzędnej strzelanki, a następnie wdrożyć ją

25
00:01:42,160 --> 00:01:48,100
‫lub zastąpić ją ponownie w trybie kill all game, który będzie trybem gry, który wdrażamy

26
00:01:48,100 --> 00:01:49,360
‫dla siebie.

27
00:01:49,660 --> 00:01:54,430
‫I możesz wybrać różne tryby gry, w których być może chcesz po prostu zabić

28
00:01:54,430 --> 00:01:58,420
‫określoną liczbę wrogów na poziomie, a nie wszystkich lub coś podobnego.

29
00:01:58,420 --> 00:02:00,430
‫Może zdobądź flagę, coś innego.

30
00:02:01,960 --> 00:02:08,470
‫Ale w zasadzie to, co się wydarzy, to strzelec -- znajdzie tryb gry, który

31
00:02:08,470 --> 00:02:12,850
‫ma typ strzelanki i będzie nazywał się -- zabity.

32
00:02:13,090 --> 00:02:18,970
‫A potem, w zależności od implementacji, która faktycznie tam jest, przejdzie do

33
00:02:18,970 --> 00:02:20,980
‫implementacji poprzez override.

34
00:02:22,000 --> 00:02:28,330
‫Kolejną komplikacją jest to, że nasza logika interfejsu użytkownika i logika restartu to coś, co powinno

35
00:02:28,330 --> 00:02:35,140
‫się wydarzyć w interfejsie użytkownika kontrolera gracza, który ogólnie jest domeną gracza, a nie czymś globalnym, takim jak

36
00:02:35,140 --> 00:02:36,070
‫tryb gry.

37
00:02:36,340 --> 00:02:42,790
‫Jest to szczególnie ważne w grach wieloosobowych, ponieważ tryb gry w rzeczywistości nie istnieje na komputerze

38
00:02:42,790 --> 00:02:45,100
‫gracza, istnieje tylko na serwerze.

39
00:02:45,110 --> 00:02:49,060
‫Tak więc w kontrolerze gracza powinny dziać się wszystkie elementy interfejsu użytkownika.

40
00:02:49,600 --> 00:02:52,630
‫To komplikacja, o którą nie musimy się martwić, ponieważ nie jest

41
00:02:52,630 --> 00:02:57,190
‫to gra wieloosobowa, ale nadal dobrze jest używać klas do tego, do czego mają być używane w Unreal.

42
00:02:57,940 --> 00:03:04,690
‫Tak więc kontroler gracza, rzeczywista klasa głównego kontrolera gracza, ma wirtualną metodę zwaną grą, która została zakończona

43
00:03:04,690 --> 00:03:12,550
‫specjalnie w tym celu, aby tryb gry mógł wywołać tę metodę, a my możemy zaimplementować ją w naszym własnym kontrolerze

44
00:03:12,550 --> 00:03:17,500
‫gry strzelanki, aby wykonać interfejs użytkownika, ponowne uruchomienie wszystkich tego rodzaju rzeczy.

45
00:03:17,950 --> 00:03:23,560
‫Ale będziemy musieli wywołać to z naszego trybu gry, kiedy zdecydujemy, że gra się skończyła.

46
00:03:23,560 --> 00:03:29,950
‫Więc nazwiemy, że wirtualna gra zakończyła się na kontrolerze głównego gracza, a ponieważ ten główny kontroler

47
00:03:29,960 --> 00:03:35,230
‫gracza jest w rzeczywistości graczem strzelającym, kontroler przekieruje się z powrotem i wywoła.

48
00:03:35,230 --> 00:03:36,070
‫Ta gra się skończyła.

49
00:03:36,070 --> 00:03:41,980
‫Wygląda więc na to, że będziemy wywoływać okrężną drogę od naszego pionka strzelca przez tryb gry strzelanki, aby

50
00:03:41,980 --> 00:03:46,360
‫zabić ich wszystkich, tryb gry do kontrolera gracza do kontrolera gracza strzelającego.

51
00:03:46,690 --> 00:03:52,300
‫Ale to pozwala nam na dużą elastyczność, jeśli chodzi o powiedzenie, no cóż, możemy mieszać i dopasowywać różne kontrolery gry,

52
00:03:52,300 --> 00:03:55,720
‫które będą pokazywać interfejs użytkownika na różne sposoby, na różnych poziomach.

53
00:03:55,990 --> 00:04:00,070
‫Możemy mieszać i dopasowywać różne tryby gry, które będą działać na różne sposoby, i to jest

54
00:04:00,070 --> 00:04:02,200
‫powód, dla którego zaprojektowałem to w ten sposób.

55
00:04:02,200 --> 00:04:07,720
‫To trochę przesada dla naszego projektu, ale pokazuje, jak może to rozszerzyć się na inne

56
00:04:07,720 --> 00:04:11,740
‫projekty z przechwytywaniem trybów gry i różnymi rodzajami kontrolera gracza.

57
00:04:12,100 --> 00:04:14,170
‫Więc spróbujmy go wdrożyć.

58
00:04:14,620 --> 00:04:18,010
‫Pójdziemy i przede wszystkim znajdziemy tryb gry w trasę.

59
00:04:18,010 --> 00:04:22,060
‫Jest już utworzony, ponieważ zaczynałem od projektu w C++.

60
00:04:22,450 --> 00:04:28,090
‫Mamy tę prostą bazę trybów strzelanek i chcę tutaj stworzyć funkcję

61
00:04:28,090 --> 00:04:35,770
‫publiczną, która zwróci void i zostanie -- zabita, a my będziemy musieli przejść przez --

62
00:04:35,770 --> 00:04:37,420
‫to zginął tutaj.

63
00:04:37,420 --> 00:04:42,310
‫Więc to będzie -- nazwana gwiazda -- zabita w ten sposób.

64
00:04:42,400 --> 00:04:46,630
‫A potem, na początku, zrobimy z tego metodę wirtualną i

65
00:04:46,630 --> 00:04:50,680
‫stworzymy podstawową implementację, która zasadniczo nic tu nie robi.

66
00:04:50,710 --> 00:04:52,900
‫Następnie stworzymy podklasę.

67
00:04:52,900 --> 00:05:00,280
‫Tak więc nowa klasa C++, pokażemy wszystkie klasy i będziemy szukać podstawowego trybu gry

68
00:05:00,280 --> 00:05:10,240
‫strzelanki jako naszej podstawowej klasy i nazwiemy to trybem gry kill em all, tak jak to, i śmiało twórz

69
00:05:10,240 --> 00:05:11,830
‫ta klasa.

70
00:05:12,010 --> 00:05:17,950
‫Potem, kiedy to się skompiluje, chcę po prostu przełączyć się na sekundę i przejść do naszej postaci strzelanki.

71
00:05:18,100 --> 00:05:23,350
‫CP I widzicie tutaj, że mamy naszych martwych w metodzie przyjmowania obrażeń.

72
00:05:23,920 --> 00:05:30,430
‫Teraz, jeśli to jest martwe, to, co chcę zrobić, to zdobyć nasz tryb gry i nazwać --

73
00:05:30,430 --> 00:05:30,880
‫zabity.

74
00:05:31,240 --> 00:05:37,660
‫Więc sposób, w jaki to robimy, polega na tym, że zaczynamy od wezwania do zdobycia świata w celu uzyskania trybu gry.

75
00:05:37,900 --> 00:05:40,540
‫Następnie wychodzi z trybu gry.

76
00:05:40,720 --> 00:05:46,690
‫A potem to, co chcemy zrobić, to aby ten tryb gry był odpowiedniego typu, czyli prosty, główny,

77
00:05:46,690 --> 00:05:52,120
‫prosty tryb strzelanki, który pozwala nam następnie zmienić tę postać, używać jej w różnych trybach

78
00:05:52,120 --> 00:05:54,670
‫gry, takie jak tryby przechwytywania flagi.

79
00:05:55,210 --> 00:06:01,390
‫Więc sposób, w jaki możemy to zrobić, możemy użyć nawiasów kątowych bezpośrednio w trybie pobierania lub gry.

80
00:06:01,510 --> 00:06:07,570
‫Zrobimy prosty tryb strzelanki i będziemy musieli umieścić go na górze.

81
00:06:08,440 --> 00:06:18,040
‫Dołącz więc prostą bazę trybów strzelanek, tak abym nie do końca poprawnie określiła nazwę klasy.

82
00:06:18,040 --> 00:06:18,460
‫Myślę.

83
00:06:18,460 --> 00:06:21,880
‫Będzie to więc prosta podstawa trybu strzelania.

84
00:06:22,450 --> 00:06:28,420
‫Właśnie to staramy się uzyskać i możemy iść dalej i przechowywać to we wskaźniku zmiennej, nazwijmy to

85
00:06:28,420 --> 00:06:29,290
‫trybem gry.

86
00:06:29,290 --> 00:06:35,800
‫A potem to, co chcemy zrobić, to na tej nowej linii, prawdopodobnie chcemy sprawdzić, czy mamy to i nie jest to

87
00:06:35,800 --> 00:06:36,730
‫wskaźnik zerowy.

88
00:06:36,730 --> 00:06:40,570
‫Tak więc tryb gry nie jest równy wskaźnikowi zerowemu.

89
00:06:40,600 --> 00:06:47,560
‫A jeśli to nie jest równe wszystkim punktom, to tutaj chcemy nazwać tryb gry strzałka pionek zabity

90
00:06:47,680 --> 00:06:50,530
‫i pionek zabity, czy tak jest?

91
00:06:50,620 --> 00:06:54,940
‫Więc teraz tryb gry jest świadomy, że pionek został zabity.

92
00:06:55,220 --> 00:07:00,460
‫Małe mini wyzwanie, aby pominąć tryb gry „zabij ich wszystkich”, abyś mógł.

93
00:07:00,520 --> 00:07:06,670
‫Wyloguj się, gdy -- zostanie zabity i ustaw go jako domyślny tryb gry na swojej mapie.

94
00:07:06,850 --> 00:07:07,210
‫Dobra.

95
00:07:07,210 --> 00:07:09,460
‫Miejmy więc nadzieję, że spróbowałeś tego małego wyzwania.

96
00:07:09,760 --> 00:07:11,770
‫Idziemy dalej i wdrażamy.

97
00:07:11,770 --> 00:07:17,680
‫Zamierzam to zrobić, kopiując publiczną sekcję naszej prostej bazy trybów strzelanek i trudno jest śledzić

98
00:07:17,680 --> 00:07:19,240
‫wszystkie te rzeczy.

99
00:07:19,660 --> 00:07:23,800
‫Następnie przejdziemy do naszej bazy trybów „zabij ich wszystkich”, która po niej dziedziczy.

100
00:07:24,430 --> 00:07:31,300
‫I wkleimy metodę wirtualną i dodamy słowo kluczowe override, aby upewnić się, że

101
00:07:31,300 --> 00:07:33,610
‫przesłaniamy tę metodę poprawnie.

102
00:07:34,760 --> 00:07:39,350
‫Następnie stworzę implementację w C++ dla naszego podstawowego trybu gry KML.

103
00:07:40,130 --> 00:07:42,920
‫To tutaj powinniśmy otrzymywać ten komunikat dziennika.

104
00:07:42,920 --> 00:07:47,030
‫I żeby być bardzo ostrożnym, wiemy, że nie ma nic w implementacji.

105
00:07:47,390 --> 00:07:48,380
‫Ale nigdy nie wiesz.

106
00:07:48,390 --> 00:07:52,080
‫Sprawy mogą się później zmienić i możemy wbić się w bombę.

107
00:07:52,100 --> 00:07:54,950
‫Więc chcemy zabić pionka.

108
00:07:56,340 --> 00:07:58,830
‫Super -- zabity z -- zabity.

109
00:07:59,280 --> 00:07:59,820
‫Ma sens.

110
00:08:00,420 --> 00:08:07,830
‫A potem chcemy przeprowadzić tutaj dialog, mówiąc w zasadzie, że... został zabity.

111
00:08:08,490 --> 00:08:15,900
‫Możemy sprawdzić, czy to działa, przechodząc do Unreal i kompilując, a następnie przechodząc do elementu

112
00:08:15,900 --> 00:08:20,850
‫planów na pasku narzędzi i wybierając w ustawieniach projektu.

113
00:08:20,850 --> 00:08:27,420
‫Domyślnym trybem gry, którym chcemy być, jeśli wybierzemy tryb gry, klasę podstawową, chcemy, aby był to tryb

114
00:08:27,420 --> 00:08:31,710
‫gry podstawowej „zabij ich wszystkich”, w zasadzie śmiało zrób to.

115
00:08:31,710 --> 00:08:35,370
‫W rzeczywistości nie jest to dokładnie to, co chcemy zrobić, jeśli pójdziemy i wybierzemy.

116
00:08:35,730 --> 00:08:44,100
‫Chcieliśmy, żeby to było właściwie jego projektowe dziecko, a my już mamy projektowe dziecko, które ma wiele skonfigurowanych

117
00:08:44,100 --> 00:08:45,000
‫rzeczy.

118
00:08:45,000 --> 00:08:47,520
‫Więc zróbmy tam re-rodzicielstwo.

119
00:08:48,390 --> 00:08:53,850
‫Zajrzymy do korzeni, znajdziemy tryb gry BP shooter, który mamy tutaj.

120
00:08:54,360 --> 00:09:03,060
‫Zamierzamy zmienić nazwę tego trybu gry BP kill all, a następnie możemy go otworzyć, zadokować okno, otworzyć pełny

121
00:09:03,060 --> 00:09:11,670
‫edytor planów, przejść do ustawień klasy i zmienić rodzica na tryb gry KML, w zasadzie C++.

122
00:09:12,150 --> 00:09:18,360
‫W ten sposób powinniśmy uruchomić poprawny kod, jeśli przejdziemy do naszej wiadomości, aby wyświetlić

123
00:09:18,360 --> 00:09:26,490
‫dziennik i nacisnąć przycisk odtwarzania, a następnie zabić postać, z którą mamy problem, wygląda na to, że nie

124
00:09:26,820 --> 00:09:35,550
‫ma właściwej konfiguracji, więc jeśli wrócimy do domyślnych ustawień klasy i zmień domyślną klasę na postać strzelca BP, co powinno

125
00:09:35,550 --> 00:09:36,780
‫być poprawne.

126
00:09:36,960 --> 00:09:39,300
‫Zapisz i skompiluj na wszelki wypadek.

127
00:09:39,300 --> 00:09:41,910
‫A potem sprawdź tutaj moje plany.

128
00:09:41,940 --> 00:09:44,640
‫Wybrano grę KML, grę C++.

129
00:09:44,640 --> 00:09:49,470
‫Więc tak naprawdę chcemy wybrać ten schemat tutaj i iść dalej i nacisnąć play.

130
00:09:49,470 --> 00:09:50,820
‫Teraz mamy naszego pionka.

131
00:09:50,820 --> 00:09:55,800
‫Możemy iść dalej i zabić tego gościa, a zobaczysz, że zabito pionka.

132
00:09:55,800 --> 00:09:57,090
‫Czy Prince jest w komunikacie dziennika?

133
00:09:57,420 --> 00:09:59,820
‫To działa fantastycznie.

134
00:10:00,360 --> 00:10:05,070
‫Teraz, w następnej sekcji, przyjrzymy się drugiej części tego, czyli

135
00:10:05,070 --> 00:10:12,630
‫wywołaniu gry zakończonej, gdy rzeczywiście chcemy ją zakończyć i móc od tego momentu zacząć ją od nowa.

136
00:10:13,110 --> 00:10:15,720
‫Więc zobaczymy się w tym wykładzie.

