﻿1
00:00:04,300 --> 00:00:05,140
‫Cześć i witaj.

2
00:00:05,140 --> 00:00:10,000
‫W tym wykładzie będziemy wyświetlać luźny ekran i zamierzam to zrobić

3
00:00:10,000 --> 00:00:13,630
‫całkowicie z poziomu C++, aby stworzyć ten widżet.

4
00:00:13,900 --> 00:00:15,250
‫Zanurzmy się i zobaczmy, jak to się robi.

5
00:00:15,880 --> 00:00:21,220
‫Okej, więc chcielibyśmy wyświetlić jakiś interfejs, gdy gracz umiera, aby powiedzieć mu, co się dzieje, że przegrał

6
00:00:21,220 --> 00:00:23,230
‫i że poziom zaraz się zresetuje.

7
00:00:23,230 --> 00:00:25,240
‫Więc nie jest to dla nich zaskoczeniem.

8
00:00:25,240 --> 00:00:31,780
‫Więc nie musimy tworzyć jakiegoś UI, widżetów UI, UMG, widżetu nierealnej ruchomej grafiki.

9
00:00:32,440 --> 00:00:35,800
‫Zróbmy to przede wszystkim, tworząc folder do przechowywania interfejsu użytkownika.

10
00:00:35,800 --> 00:00:41,440
‫I już wiem, że będziemy mieć dwa elementy interfejsu użytkownika, więc myślę, że będę miał tutaj folder interfejsu użytkownika, a

11
00:00:41,440 --> 00:00:47,140
‫potem wejdźmy tutaj i kliknij prawym przyciskiem myszy, a potem idź, powinieneś był to zrobić wcześniej, ale zróbmy to. Przeprowadzę cię

12
00:00:47,140 --> 00:00:48,000
‫przez to.

13
00:00:48,040 --> 00:00:52,540
‫Przejdziemy do sekcji interfejsu użytkownika, następnie wybierzemy schemat widżetów, a prefiksem do

14
00:00:52,540 --> 00:00:56,890
‫użycia jest podkreślenie WB P, a następnie będzie to luźny ekran.

15
00:00:57,520 --> 00:01:02,710
‫Teraz możesz zrobić kilka klas bazowych dla tego rodzaju rzeczy w C++, ale nie będziemy tego omawiać w

16
00:01:02,710 --> 00:01:03,310
‫tej sekcji.

17
00:01:03,550 --> 00:01:07,450
‫Generalnie nie jest to konieczne, ao wiele łatwiej jest zrobić to w Blueprint.

18
00:01:07,450 --> 00:01:13,060
‫Nie ma dużej korzyści z robienia tego w C++, chyba że interfejs użytkownika będzie bardzo skomplikowany i chciałbyś

19
00:01:13,060 --> 00:01:15,610
‫umieścić część tej logiki interfejsu użytkownika w C++.

20
00:01:15,940 --> 00:01:20,500
‫W naszym przypadku tak nie jest, więc możemy po prostu skorzystać z planów.

21
00:01:20,500 --> 00:01:22,450
‫W końcu interfejs użytkownika to rzecz wizualna.

22
00:01:22,450 --> 00:01:28,780
‫Teraz warto użyć narzędzia wizualnego, aby je złożyć, ponieważ już wiesz, jak tworzyć

23
00:01:28,780 --> 00:01:29,470
‫widżety.

24
00:01:29,470 --> 00:01:32,830
‫Następnie dam wam to wyzwanie, aby ustawić luźny ekran.

25
00:01:32,830 --> 00:01:36,970
‫Chcemy dodać tekst wyjaśniający, że gracz przegrał i że czeka nas restart.

26
00:01:37,270 --> 00:01:41,980
‫Chcesz umieścić ten tekst prawdopodobnie centralnie, aby był widoczny, upewnij się, że jest widoczny w grze.

27
00:01:41,980 --> 00:01:45,370
‫A jednak, tak jak powiedziałem, wyjaśnij, że zbliża się restart.

28
00:01:45,850 --> 00:01:50,470
‫A potem, gdy spróbujesz tego wyzwania, przyjrzymy się, jak możemy stworzyć to z C++.

29
00:01:50,470 --> 00:01:55,660
‫Być może widziałeś, jak to zrobić w Blueprint, zanim zobaczymy, jak możemy to zrobić z poziomu C++.

30
00:01:55,660 --> 00:01:56,770
‫Więc zatrzymaj wideo i puść.

31
00:01:57,130 --> 00:01:58,180
‫OK, witaj z powrotem.

32
00:01:58,750 --> 00:02:03,040
‫Więc zamierzam najpierw stworzyć trochę tekstu.

33
00:02:03,430 --> 00:02:09,160
‫Więc chcę poszukać w palecie po lewej stronie, poszukam elementu tekstowego i wniosę go.

34
00:02:10,060 --> 00:02:13,420
‫Zmienię to, że przegrasz.

35
00:02:13,750 --> 00:02:16,630
‫Całkiem proste i pozbawione wyobraźni pisanie dialogów tutaj.

36
00:02:17,170 --> 00:02:22,210
‫Zmienię kolor, krycie i wygląd na czerwony, aby było bardzo jasne, że zgubili, i

37
00:02:22,210 --> 00:02:27,910
‫po prostu wcieram go trochę bardziej, a ja rozszerzę tę czcionkę i zmienię rozmiar na większy .

38
00:02:28,120 --> 00:02:35,310
‫A potem rozszerzę ramkę wokół naszego tekstu i wyśrodkuję nasz tekst.

39
00:02:35,320 --> 00:02:38,050
‫Więc schodząc w dół, skoncentruję tekst.

40
00:02:38,050 --> 00:02:44,340
‫A jeśli się rozszerzę, zobaczmy, czy jest gdzieś indziej, gdzie mogę zrobić wyrównanie do środka, którego nie

41
00:02:44,410 --> 00:02:44,860
‫ma.

42
00:02:44,860 --> 00:02:53,440
‫Więc po prostu idę i z grubsza sprawię, że pudła będą odpowiednie, a potem przejdę do moich wyrównań, moich kotwic i

43
00:02:53,440 --> 00:02:54,910
‫tego typu rzeczy.

44
00:02:55,540 --> 00:03:01,870
‫I zamierzam wybrać menu rozwijane dla kotwic i wybrać ustawienie wstępne do kotwiczenia w środku, ponieważ to jest to, co

45
00:03:02,080 --> 00:03:03,070
‫chcę zrobić.

46
00:03:03,850 --> 00:03:12,400
‫Chcę ustawić moje wyrównanie na 0. 5 i 0. 5, co zasadniczo oznacza, że wyrównujemy się

47
00:03:12,400 --> 00:03:16,660
‫do środka obiektu, a nie lewy górny róg, który ponownie wykona kotwicę.

48
00:03:16,660 --> 00:03:18,790
‫Dobra, to nie było bardzo pomocne.

49
00:03:19,300 --> 00:03:24,460
‫A potem pozycja X, dlaczego myślę, że jeśli ustawię pozycję obok zera i zera, bo

50
00:03:24,460 --> 00:03:29,200
‫tak ustawiłem swoje kotwice, to moja przegrana pozycja będzie gdzieś pośrodku i po

51
00:03:29,200 --> 00:03:31,180
‫prostu ją przesunę nawet nieznacznie.

52
00:03:31,240 --> 00:03:37,960
‫Utrzymuj moją pozycję X na zero, pozycję Y na -50, ponieważ chcę dodać jakiś wtórny tekst mówiący, że w efekcie

53
00:03:37,980 --> 00:03:42,430
‫może być łatwiej po prostu zduplikować inny tekst tutaj, ponieważ ma wszystkie ustawienia, których

54
00:03:42,880 --> 00:03:43,870
‫już potrzebuję.

55
00:03:43,870 --> 00:03:46,030
‫Chcę tylko trochę go zmniejszyć.

56
00:03:46,030 --> 00:03:54,100
‫Ponownie ustaw zero, a powiem, że poziom zostanie zrestartowany za 5 sekund i zamierzam znacznie zmniejszyć

57
00:03:54,100 --> 00:03:55,210
‫rozmiar czcionki.

58
00:03:55,210 --> 00:04:00,370
‫Więc jest mniej na twojej twarzy, coś takiego, a potem po prostu przesuń go trochę

59
00:04:00,370 --> 00:04:05,920
‫w dół, trochę nacięcie i ustaw ponownie tę pozycję X na zero i w 100% zadowolony z pozycjonowania.

60
00:04:05,920 --> 00:04:08,500
‫Po prostu podniosę to trochę bardziej.

61
00:04:08,500 --> 00:04:13,960
‫Jeśli przytrzymam Shift w dół, mogę zablokować go na osi, z którą się poruszam, tak aby była mniej więcej

62
00:04:13,970 --> 00:04:14,440
‫centralna.

63
00:04:14,560 --> 00:04:15,580
‫Ok, więc jestem z tego zadowolony.

64
00:04:15,580 --> 00:04:18,640
‫Teraz musimy iść dalej i spróbować odrodzić tę rzecz.

65
00:04:19,060 --> 00:04:19,810
‫Jak zamierzamy to zrobić?

66
00:04:19,810 --> 00:04:25,180
‫Cóż, przede wszystkim musimy wiedzieć, jaką klasę widżetów mamy odradzać, i musimy wiedzieć, gdzie

67
00:04:25,180 --> 00:04:27,460
‫będziemy to robić od teraz.

68
00:04:27,490 --> 00:04:31,570
‫Jak już powiedziałem, myślę, że dobrym miejscem do tego jest sam kontroler gracza.

69
00:04:32,290 --> 00:04:37,970
‫I będziemy musieli wiedzieć w kontrolerze gracza, jaką klasę, jaką klasę widżetu próbujemy odrodzić?

70
00:04:37,970 --> 00:04:42,460
‫Teraz wiem, że jest to klasa schematu, ale wciąż potrzebujemy, aby była to klasa, którą próbujemy odrodzić.

71
00:04:43,090 --> 00:04:46,840
‫Więc zamierzamy to zrobić, tworząc nową właściwość tutaj.

72
00:04:46,960 --> 00:04:54,100
‫Edycje będą dostępne wszędzie i chcemy, aby była to podklasa, ponieważ jest to zawsze dobry sposób na

73
00:04:54,100 --> 00:04:57,220
‫upewnienie się, że otrzymamy nową klasę.

74
00:04:57,220 --> 00:05:04,210
‫Zasadniczo możesz użyć typu new class, jeśli chcesz, ale to nie ogranicza tego, jakiego rodzaju klasy

75
00:05:04,210 --> 00:05:05,290
‫możemy użyć.

76
00:05:05,290 --> 00:05:09,580
‫I tutaj chcemy ograniczyć to tylko do korzystania z widżetów.

77
00:05:09,790 --> 00:05:17,210
‫Jeśli przejdziesz do swojego planu, możesz zobaczyć, czy idziemy gdzieś tutaj, możesz dowiedzieć się, czy klasa nadrzędna używa widżetu,

78
00:05:17,240 --> 00:05:22,690
‫o którym wiemy, że po umieszczeniu na nim prefiksu staje się używanym widżetem.

79
00:05:23,170 --> 00:05:26,380
‫Więc to jest podklasa.

80
00:05:27,550 --> 00:05:34,300
‫A potem użyjemy naszych nawiasów kątowych, będzie to widżet, którego używasz, i faktycznie zamierzam zadeklarować go

81
00:05:34,300 --> 00:05:37,120
‫tutaj, a nie zawierać żadnych dołączeń.

82
00:05:37,120 --> 00:05:43,660
‫A więc class używasz widżetu, a następnie nazwiemy to klasą Losuj ekran.

83
00:05:44,140 --> 00:05:46,390
‫Po prostu niech to naprawdę oczywiste, co się tam dzieje.

84
00:05:47,140 --> 00:05:54,370
‫Teraz zamierzam skompilować na tym etapie, podczas gdy będziemy robić następne rzeczy, ponieważ kompilacja przy zmianie pliku

85
00:05:54,370 --> 00:05:56,470
‫trwa tylko trochę dłużej.

86
00:05:56,740 --> 00:06:02,620
‫Teraz właściwie kompilacja nie powiedzie się na tym etapie, ponieważ nie dołączyliśmy modułu UMG.

87
00:06:02,890 --> 00:06:03,760
‫Nie wiemy, jak to zrobić.

88
00:06:03,770 --> 00:06:08,950
‫Nie martw się o kompilację na tym etapie i po około 9 minutach filmu naprawimy ten

89
00:06:08,950 --> 00:06:09,550
‫błąd.

90
00:06:10,150 --> 00:06:14,230
‫Teraz, w C++, to, co będziemy chcieli zrobić, to odrodzenie tego widżetu.

91
00:06:14,680 --> 00:06:17,260
‫Więc nie chcemy tego robić może nawet przed czasem.

92
00:06:17,260 --> 00:06:20,250
‫To naprawdę nie ma znaczenia, ponieważ minutnik nie czeka.

93
00:06:20,260 --> 00:06:24,760
‫Po prostu ustawia czas, a następnie przechodzi od razu do następnego wiersza kodu, więc nie będziemy czekać 5 sekund,

94
00:06:24,760 --> 00:06:29,050
‫jeśli zrobimy to w Stripe, jeśli odrodziliśmy interfejs użytkownika zaraz potem, nie ma znaczenia, w jakiej kolejności zrób

95
00:06:29,050 --> 00:06:29,650
‫to w.

96
00:06:30,310 --> 00:06:36,240
‫Więc to, co zamierzamy zrobić, to użyć funkcji o nazwie Utwórz widżet, która nie jest obecnie dostępna.

97
00:06:36,670 --> 00:06:43,030
‫Więc musimy najpierw dodać hash, a my zamierzamy uwzględnić to, że plan ukośnika używa

98
00:06:43,150 --> 00:06:43,720
‫widżetu.

99
00:06:44,500 --> 00:06:49,990
‫I to jest klasa, której potrzebujemy, aby uzyskać dostęp do funkcji tworzenia widżetu.

100
00:06:50,830 --> 00:06:53,560
‫I po prostu powiemy utworzyć widżet.

101
00:06:53,560 --> 00:06:58,220
‫Właściwie musi być dobrze, zobaczmy, czego potrzebujemy, aby to zapewnić.

102
00:06:58,240 --> 00:07:00,880
‫Zamierzam f 12 do jego realizacji.

103
00:07:00,880 --> 00:07:06,880
‫Widać, że jest to trochę skomplikowane, ale mamy tutaj parametr szablonu, który jest zasadniczo

104
00:07:06,880 --> 00:07:10,840
‫domyślnie używanym widżetem, więc prawdopodobnie nie musimy go podawać.

105
00:07:11,680 --> 00:07:19,360
‫A potem jest obiekt będący właścicielem i klasa, którą musimy utworzyć, a następnie nazwa widżetu, której

106
00:07:19,360 --> 00:07:20,950
‫niekoniecznie musimy podawać.

107
00:07:20,950 --> 00:07:23,590
‫A potem powraca jako wskaźnik do widżetu.

108
00:07:24,160 --> 00:07:29,110
‫Więc to, co właściwie zamierzam zrobić, to dać temu obiekt właścicielowi.

109
00:07:29,170 --> 00:07:31,450
‫Teraz tylko niektóre rzeczy mogą być właścicielem widżetu.

110
00:07:31,540 --> 00:07:34,180
‫Jedną z tych rzeczy jest właściwie kontroler gracza.

111
00:07:34,180 --> 00:07:36,130
‫Więc możemy to po prostu przekazać.

112
00:07:36,280 --> 00:07:40,700
‫A następną rzeczą jest to, że chcemy przekazać podklasę t, w której używasz widżetu.

113
00:07:40,720 --> 00:07:44,620
‫Na szczęście już to skonfigurowaliśmy w nagłówku pliku.

114
00:07:45,370 --> 00:07:51,250
‫Więc możemy po prostu iść dalej i przekazać to, a ja powstrzymam moje wcięcie przed próbami naprawienia, dopóki nie

115
00:07:51,250 --> 00:07:52,870
‫umieściłem średnika na końcu wiersza.

116
00:07:53,590 --> 00:07:55,390
‫A potem chodźmy i zobaczmy, co jeszcze.

117
00:07:55,390 --> 00:07:55,990
‫Cóż, to wszystko.

118
00:07:55,990 --> 00:07:58,480
‫W tym momencie po prostu zwraca widżet.

119
00:07:58,490 --> 00:08:06,880
‫Możemy więc mieć do ciebie wskaźnik, użyć sklepu z widżetami, a to będzie nasz ekran przegranych.

120
00:08:06,880 --> 00:08:09,010
‫Więc musimy stracić klasę ekranu.

121
00:08:09,430 --> 00:08:12,820
‫Po utworzeniu widżetu staje się on rzeczywistym luźnym ekranem.

122
00:08:13,000 --> 00:08:15,820
‫Następną rzeczą, którą musimy zrobić, to uczynić ten interfejs widocznym.

123
00:08:16,150 --> 00:08:19,960
‫Robimy to, dodając go do rzutni w nierzeczywistym języku.

124
00:08:19,960 --> 00:08:25,450
‫Ale najpierw, ponieważ dodajemy do rzutni, wywołując funkcję na niebieskim ekranie, musimy upewnić się, że nie

125
00:08:25,480 --> 00:08:27,070
‫jest to wskaźnik zerowy.

126
00:08:27,070 --> 00:08:32,320
‫Więc jeśli stracił ekran nie jest równy null pointerowi, dlaczego może nie być punktów?

127
00:08:32,320 --> 00:08:33,850
‫Przy okazji, małe wyzwanie dla ciebie.

128
00:08:34,150 --> 00:08:36,970
‫Sprawdź, czy możesz dowiedzieć się, dlaczego możemy skończyć z pustym wskaźnikiem tutaj.

129
00:08:37,690 --> 00:08:41,140
‫Cóż, jednym z powodów może być to, że zapomnieliśmy ustawić klasę utraty ekranu.

130
00:08:41,140 --> 00:08:46,150
‫A jeśli tak jest i nie mamy ustawionej poprawnej klasy niebieskiego ekranu, to create widget po

131
00:08:46,150 --> 00:08:47,830
‫prostu zwróci nam pusty wskaźnik.

132
00:08:47,830 --> 00:08:54,310
‫I nie chcemy, aby tak się stało i nie chcemy na pewno wywoływać funkcji na wskaźniku zerowym.

133
00:08:54,340 --> 00:08:56,290
‫Podobnie jak niebieska strzałka ekranu.

134
00:08:56,830 --> 00:09:00,970
‫A potem to, czego chcemy tutaj, to funkcja o nazwie add to viewport.

135
00:09:02,120 --> 00:09:03,930
‫Co po prostu to zrobi.

136
00:09:03,950 --> 00:09:07,550
‫Idź i dodaj go do ekranu, abyśmy mogli zobaczyć ten niebieski ekran.

137
00:09:08,180 --> 00:09:14,780
‫Teraz zamierzam iść dalej i to również skompilować, przejść do Unreal i otworzyć

138
00:09:14,780 --> 00:09:17,240
‫nasz plan kontrolera gracza.

139
00:09:17,330 --> 00:09:22,360
‫Więc strzelaj tutaj kontrolerem gry, a gdzieś tutaj powinniśmy być w stanie coś zobaczyć.

140
00:09:22,670 --> 00:09:25,220
‫A zmienna jeszcze się nie pojawiła.

141
00:09:25,730 --> 00:09:27,080
‫Może miałem kilka obszarów budowlanych.

142
00:09:27,080 --> 00:09:28,550
‫Chodźmy i przyjrzyjmy się dziennikowi wiadomości.

143
00:09:29,100 --> 00:09:36,110
‫Tak, widzimy tutaj kilka błędów kompilacji, a mianowicie te dziwne dotyczące braku zewnętrznych symboli.

144
00:09:36,110 --> 00:09:40,130
‫Jeśli mamy trochę informacji o Tobie, użyj widżetu, który nie jest dostępny.

145
00:09:40,490 --> 00:09:47,540
‫Teraz, jeśli cofniesz się do kilku wcześniejszych wykładów, wiemy, że tego rodzaju błędy pojawiają

146
00:09:47,540 --> 00:09:50,780
‫się, gdy brakuje nam zależności modułu.

147
00:09:50,810 --> 00:09:57,740
‫Więc jeśli otworzymy nasze proste dokumenty dotyczące budowania strzelanek, a ja po prostu zamknę terminal, aby uzyskać

148
00:09:57,740 --> 00:10:04,100
‫nieco więcej miejsca, to możesz zobaczyć, co musimy zrobić, to dodać tutaj nową publiczną zależność.

149
00:10:04,700 --> 00:10:10,130
‫Na koniec dodamy publiczną zależność dla UMG.

150
00:10:10,310 --> 00:10:14,630
‫Więc nowy przecinek, a następnie w cudzysłowie, wstawi UMG.

151
00:10:15,200 --> 00:10:23,330
‫A to w zasadzie pozwala nam korzystać z dołączonych elementów, które mieliśmy tutaj, jako widżet użycia projektu z ukośnikiem w

152
00:10:23,450 --> 00:10:24,140
‫przód.

153
00:10:24,710 --> 00:10:26,670
‫Wszystko to jest w osobnym module.

154
00:10:26,690 --> 00:10:28,630
‫Więc standardowe rzeczy, które są wliczone w cenę.

155
00:10:28,670 --> 00:10:32,540
‫Więc musimy iść i powiedzieć unveil, że chcemy użyć tego modułu w C++.

156
00:10:32,630 --> 00:10:34,910
‫Przejdźmy dalej i zbudujmy i zobaczmy, czy teraz działa.

157
00:10:35,000 --> 00:10:35,200
‫Dobra.

158
00:10:35,210 --> 00:10:36,380
‫To wygląda na udane.

159
00:10:36,380 --> 00:10:41,510
‫Jeśli przejdziemy do edytora i wrócimy, aby nakręcić kontroler gry.

160
00:10:41,540 --> 00:10:46,100
‫Z jakiegoś powodu wydaje mi się, że nie przeładowałem poprawnie, więc musiałem nacisnąć kompilację w edytorze.

161
00:10:46,480 --> 00:10:48,350
‫Wracamy teraz do kontrolera gry w strzelankę.

162
00:10:48,350 --> 00:10:50,390
‫W końcu możesz zobaczyć tę luźną klasę ekranu.

163
00:10:50,930 --> 00:10:57,740
‫Możemy kliknąć tam menu rozwijane i wybrać AWP, podkreślić, stracić tam ekran, skompilować, zapisać i chodźmy

164
00:10:57,740 --> 00:10:59,900
‫i dajmy się zabić.

165
00:11:00,110 --> 00:11:01,610
‫Zastrzel się kilka razy.

166
00:11:01,970 --> 00:11:03,170
‫Huk, huk.

167
00:11:03,500 --> 00:11:04,150
‫I proszę bardzo.

168
00:11:04,200 --> 00:11:09,650
‫Pojawił się ekran Alu informujący nas, co się dzieje, że poziom zostanie ponownie uruchomiony za 5 sekund i

169
00:11:09,650 --> 00:11:10,970
‫rzeczywiście tak się dzieje.

170
00:11:11,360 --> 00:11:20,000
‫Więc teraz wiesz nie tylko, jak możesz tworzyć grafikę UMG, ale także jak możesz tworzyć je z C++, a

171
00:11:20,000 --> 00:11:21,860
‫nie z Blueprint.

172
00:11:22,100 --> 00:11:26,900
‫W następnym wykładzie będziemy mieć mniej pesymistyczne spojrzenie na sprawy i spróbujemy

173
00:11:26,900 --> 00:11:30,380
‫stworzyć warunki do wygranej w tej grze.

174
00:11:30,680 --> 00:11:31,310
‫Zobaczymy się wtedy.

