‫Witam ponownie.
‫Teraz jesteśmy gotowi do obracania wieżyczki i chcielibyśmy to zrobić za pomocą myszy.
‫I to miejsce trafienia ze śladu, który zrobiliśmy w poprzednim filmie.
‫Kiedy poruszam kursorem myszy, wieżyczka obraca się i jest skierowana w stronę kursora myszy.
‫I nawet gdy kliknę w rzutni i zacznę grać, nadal mogę poruszać kursorem myszy,
‫aby obrócić wieżyczkę i ustawić jej kierunek.
‫To pozwoli mi celować, gdy będę mógł strzelać pociskami.
‫Dobra.
‫Aby to osiągnąć, musimy znaleźć kierunek, w którym ma wskazywać nasza wieża.
‫A kiedy już znajdziemy ten kierunek, możemy ustawić rotację siatki wieży.
‫Teraz, aby uzyskać kierunek, w którym powinna wskazywać wieżyczka, musimy wykonać trochę
‫matematyki wektorowej.
‫To, czego szukamy, to wektor od wieży czołgu do miejsca trafienia śladem.
‫Teraz w prosty sposób możemy uzyskać lokalizację naszego czołgu lub dowolnego z jego elementów, np. lokalizację
‫wieży czołgu.
‫Nazwiemy to miejsce, wieżyczka, lokalizacja.
‫Wiemy też, jak możemy ustalić położenie głowicy śledzącej.
‫Nazwiemy to miejsce trafienia śladu.
‫Interesuje nas wektor od lokalizacji wieży do lokalizacji trafienia.
‫Nazwiemy ten wektor do celu.
‫Teraz matematyka wektorowa, aby dotrzeć do celu, jest całkiem prosta.
‫Aby uzyskać wektor od punktu początkowego do punktu końcowego, zawsze należy odjąć punkt końcowy od punktu początkowego.
‫Więc jeśli weźmiemy nasz ślad, uderzymy w lokalizację i odejmiemy położenie wektora wieży, to wektor, który
‫z tego wynika, ma być celem.
‫Teraz, gdy mamy wektor dwóch kierunków docelowych, chcemy go przekonwertować na obrót, abyśmy
‫mogli ustawić obrót wieży czołgu.
‫A typ wektorowy ma wbudowaną funkcję zwaną rotacją.
‫Więc jeśli weźmiemy nasz wektor docelowy i nazwiemy go rotacją, to zwróci rotator F odpowiadający
‫temu kierunkowi.
‫Teraz musimy mieć coś na uwadze.
‫Wynik trafienia śladem często będzie znajdował się na podłodze, a wektor od wieży czołgu do wyniku
‫trafienia śladem nie będzie równoległy do ziemi.
‫Oznacza to, że jeśli ustawimy obrót wieży czołgu na rotator, który otrzymujemy z tego wektora kierunku, możemy
‫otrzymać coś takiego, gdy wieża jest pochylona w dół w kierunku ziemi, ale nie chcemy, aby
‫wieża czołgów obracała się w dół.
‫Chcemy, aby nadal wskazywał na przyszłość.
‫To jest wynik, którego chcemy.
‫Innymi słowy, chcemy tylko zmienić tak składnik obrotu wieży czołgu.
‫W ten sposób jest skierowany we właściwym kierunku, ale nadal pozostaje równoległy do podłoża.
‫Zmieniliśmy tylko jego zbaczanie, więc wróćmy do kodu VS i stwórzmy funkcję obracania wieżyczką
‫czołgu.
‫Teraz zamierzamy obracać wieżę na czołgu, ale chcielibyśmy również obrócić wieżę na naszym
‫przeciwniku z wieży, a wieża zostanie wkrótce utworzona na podstawie podstawy, co oznacza, że stworzymy obrotową
‫wieżę funkcję możemy umieścić tutaj w podstawowej klasie ponga.
‫W ten sposób zarówno zbiornik, jak i wieża odziedziczą tę funkcję.
‫Ponieważ planujemy używać go zarówno w wieży, jak i w zbiorniku, możemy zabezpieczyć tę funkcję.
‫Dodam więc sekcję chronioną, a wszelkie funkcje i zmienne, które umieścimy w sekcji chronionej, będą
‫dostępne w tych klasach potomnych, ale nie w żadnych innych klasach.
‫Jest więc prawie tak ograniczony, jak zmienne prywatne.
‫Teraz ta funkcja może zwrócić void.
‫Nazwę tę wieżę obrotową.
‫A żeby obrócić wieżę, będę potrzebował jakiegoś celu, na który będę mógł patrzeć.
‫Może to być wektor f i możemy to nazwać spojrzeniem na cel.
‫Więc pomysł jest taki, że jeśli mamy funkcję, którą możemy przekazać w jakimś miejscu na świecie, to
‫funkcja powinna skutkować obróceniem wieży w kierunku tej lokalizacji.
‫Przejdźmy więc dalej i podajmy definicję funkcji dla obracania wieżyczki.
‫Więc tutaj, w pionku bazowym CP, tuż pod konstruktorem, zamierzam zaimplementować obrotową wieżyczkę.
‫I oczywiście potrzebuję tutaj nazwy klasy pionka bazowego z operatorem rozpoznawania zasięgu.
‫Więc teraz, kiedy mam już obracaną wieżę, zastanówmy się, jak zamierzamy to zaimplementować.
‫Pierwszą rzeczą, której potrzebujemy, jest skierowanie wektora na wektor z komponentu wieży do wyniku trafienia śladu
‫pod kursorem myszy.
‫Więc może to być lokalny wektor F wywołany do celu i ustawimy go na wynik jakiejś matematyki
‫wektorowej.
‫Pamiętaj, że będzie to miejsce docelowe minus punkt początkowy.
‫A celem jest spojrzenie na cel, a punktem startowym będzie położenie wieży czołgu,
‫innymi słowy położenie siatki wieży.
‫Możemy więc powiedzieć, że siatka wieżyczki i możemy uzyskać lokalizację siatki wieży.
‫Teraz sposobem na uzyskanie światowej lokalizacji komponentu jest ta funkcja, aby uzyskać lokalizację komponentu.
‫Należy do klasy komponentu use scene.
‫Tak więc mają to wszystkie komponenty sceny.
‫Więc z siatki wieżyczki nazwiemy lokalizację komponentu.
‫Zatem spojrzenie na cel minus położenie siatki wieży daje nam wektor od siatki wieży do celu
‫obserwacji.
‫Teraz, jak wspomniałem, możemy uzyskać rotator EF od do celu za pomocą funkcji rotacji wektorów F.
‫Więc zrobimy rotator F i możemy nazwać to spojrzeniem na obrót i ustawimy to
‫jako równe docelowej rotacji kropki.
‫To jest wywołanie funkcji.
‫Więc teraz mamy rotator odpowiadający temu wektorowi kierunku celu.
‫Ale chodzi o to, że zależy nam tylko na YA.
‫Nie chcemy zmieniać tonacji ani roli.
‫Chcemy tylko obrócić wieżę wokół osi Z i utrzymać ją równolegle do podłoża.
‫Teraz możemy to zrobić na wiele sposobów.
‫Po pierwsze, możemy przyjrzeć się rotacji, skokowi i wyzerowaniu tego.
‫Innymi słowy, ustaw ją na zero.
‫Możemy również przyjrzeć się roli rotacji kropki i ją również wyzerować.
‫Teraz, gdy ustawiliśmy skok i przechylenie na zero, mamy żądany obrót, który jest tylko składową.
‫To jeden ze sposobów na zrobienie tego.
‫Innym byłoby użycie jednego z przeciążeń konstruktora F rotatora.
‫Gdybyśmy powiedzieli f rotator z nawiasami i przekazali pewne wartości, takie jak punkt zerowy F dla pierwszego, a wyskakujące okienko
‫mówi mi, że pierwszym wejściem jest wysokość dźwięku.
‫A potem dla ciebie możemy użyć do celowania w rotację.
‫Tak.
‫A potem dla roli moglibyśmy użyć zero kropki F.
‫Teraz tworzy nowy rotator F z zerem dla skoku, zerem dla roli i składową
‫rotatora zwróconą przez dwa obroty docelowe.
‫Tak więc wartość zwrócona przez to dałaby taki sam wynik, jak to, co zrobiliśmy tutaj z tymi trzema liniami.
‫Więc ponieważ jest to trochę bardziej zwarte i eleganckie, myślę, że wolałbym tego użyć,
‫abyśmy mogli zainicjować wektor rotacji z rotatorem F zwróconym przez wywołanie konstruktora rotatora F w ten sposób.
‫Więc usunę tę linię tutaj.
‫A teraz przyjrzyjmy się rotacji.
‫Teraz ostatnią rzeczą do zrobienia w tej funkcji jest ustawienie rotacji zacieru wieży.
‫Teraz możemy ustawić rotację dla danego komponentu za pomocą tej funkcji ponownie ustaw rotację świata, należy
‫użyć komponentu sceny.
‫Powodem, dla którego używamy ustawionej rotacji słów zamiast dodawania jakiegoś lokalnego przesunięcia rotacji, jest
‫to, że mamy rotację w przestrzeni świata dwa celem jest wektor kierunku w przestrzeni świata.
‫Bierzemy położenie siatki wieży w przestrzeni świata i odejmujemy lokalizację docelową w przestrzeni
‫świata.
‫Więc to jest światowy kierunek kosmiczny.
‫Dlatego spojrzenie na rotację jest rotacją przestrzeni świata.
‫Więc użyjemy ustawionej rotacji świata na siatce wieży.
‫Powiemy więc siatka wieży, ustaw rotację świata i przejdziemy do spojrzenia na rotację.
‫Więc teraz mamy funkcję, która może wziąć dowolny cel na świecie i obrócić siatkę wieży, aby na
‫nią spojrzeć, ale nie obróci siatki w dół.
‫Zmieni tylko zbaczanie, więc będzie się obracał w taki sposób, w jaki powinna obracać się wieża czołgu.
‫Mamy więc teraz funkcję obracania wieży.
‫Mam zamiar wywołać tę funkcję, aby ustawić obrót wieży, wywołać funkcję obracania wieży
‫w klasie czołgów.
‫Jest to funkcja chroniona.
‫Więc klasa czołgu ma do niego dostęp.
‫Teraz obrócenie wieży przyjmuje wektor F, spójrz na cel, użyjesz tego punktu uderzenia w wyniku trafienia
‫F z naszego śledzenia linii.
‫Więc zostawię tobie znalezienie odpowiedniego miejsca w kodzie do wywołania tej funkcji.
‫Zatrzymaj więc wideo i umieść funkcję obracania wieżyczki.
‫Wezwij klasę czołgów.
‫Dobra.
‫Mamy więc funkcję obracania wieżyczki i możemy ją wywołać.
‫Zamierzam przejść do tankowania i oto moja funkcja zaznaczenia w polu sprawdzania, czy dla kontrolera gracza ref.
‫Mam wynik trafienia i po wywołaniu wyniku trafienia pod kursorem wynik trafienia będzie zawierał
‫prawidłowe dane.
‫W rzeczywistości używamy tego punktu wpływu wyniku trafienia i rysujemy sferę debugowania.
‫Teraz, ponieważ nie muszę już rysować sfery debugowania, zamierzam ją usunąć.
‫Zamiast tego zamierzam wywołać naszą chronioną funkcję obracania wieżyczki.
‫A dla spojrzenia na cel, podam punkt uderzenia w punkt trafienia.
‫Więc teraz w każdej klatce będziemy obracać wieżę w kierunku tego punktu uderzenia z naszego wyniku trafienia.
‫Teraz, zanim to skompiluję, nie używam już pomocników debugowania rysowania, więc zamierzam usunąć ten
‫plik nagłówkowy.
‫Dobra.
‫Teraz jestem gotowy do kompilacji.
‫Dobra.
‫Wróciłem do edytora.
‫Chodźmy dalej, wciśnijmy play i sprawdźmy.
‫To jest niesamowite.
‫Nadal mogę się kręcić.
‫Mogę poruszać myszą, a wieżyczka obraca się tam, gdzie poruszam kursorem myszy.
‫Więc to jest niesamowite.
‫Ok, więc zanim to zakończymy, chciałbym poruszyć kilka kwestii.
‫Chcę, żeby to było ładne, dopracowane i świetnie wyglądało.
‫Teraz pierwszy problem pojawia się, gdy przesuwam kursor myszy blisko środka zbiornika, a następnie przechodzę
‫przez niego.
‫Zobaczysz, że w pewnym momencie ten obrót załamuje się bardzo szybko.
‫A jeśli poruszamy myszą w sposób przypadkowy, cóż, nie wygląda to zbyt dobrze.
‫To pęka.
‫Nie mamy płynnego ruchu.
‫Więc to jest jeden problem.
‫Teraz inny problem polega na tym, że jeśli kliknę, przeturlam się i podejdę do krawędzi, zobaczę, że moja wieża przeskakuje
‫w innym kierunku, gdy przesunę kursor myszy w górę.
‫Więc co się tam dzieje?
‫Cóż, dowiedzmy się.
‫Wrócimy do programu VS Code i chciałbym odzyskać moją sferę debugowania.
‫Wracając do Tanka, przejdę do funkcji tiku tuż przed obróceniem wieżyczki i
‫jeszcze raz wywołam sferę debugowania rysowania.
‫Teraz dla świata, w którym przechodzę, pobierz świat dla centrum, w którym przechodzę. Wynik trafienia Punkt
‫uderzenia kropki dla promienia Użyję 25 punktów Segmenty F mogą być 12, kolor może być F kolor czerwony Trwałe linie mogą
‫być fałszywe a życie może być negatywne.
‫Więc to samo, co robiliśmy wcześniej.
‫Więc zamierzam zachować to ogłoszenie.
‫Nie dodaję tam pliku nagłówkowego, a to dlatego, że pomocniki debugowania są domyślnie dołączone, więc
‫technicznie nie potrzebujemy ich.
‫Zamierzam po prostu zapisać, wskoczyć z powrotem w edytorze, zrobić inaugurację kodowania na żywo i nacisnąć przycisk odtwarzania.
‫Więc teraz mam swoją sferę debugowania.
‫Przejdźmy więc na skraj świata i przesunę kursor myszy do miejsca, w którym
‫spada w otchłań.
‫I tu właśnie mamy problem.
‫Widzisz, nie mamy wyniku trafienia pod kursorem, gdy nasz kursor przesuwa się tam, ponieważ nie ma tam
‫nic, z czego moglibyśmy uzyskać wynik trafienia.
‫Dlatego nasz punkt wpływu nie jest zdefiniowany.
‫Więc to, czego potrzebujemy, to coś, co ma trafić w tę linię.
‫Teraz Unreal Engine ma wiele narzędzi, z których możemy korzystać.
‫To, co zamierzam zrobić, to kliknąć menu rozwijane tutaj i otworzyć panel aktora mojego miejsca i wybrać tę
‫ikonę, która mówi woluminy i uzyskać blokującą głośność.
‫Oto blokowanie głośności.
‫Zamierzam wciągnąć jednego do środka.
‫Więc teraz mam ten blokujący wolumin.
‫Teraz domyślnie blokujące woluminy mają być niewidoczne.
‫Jeśli przejdę do panelu szczegółów i przewinę w dół do kolizji, widzę, że
‫są to ustawienia kolizji to niewidzialna ściana, co wydaje się sugerować, że powinno blokować prawie wszystko.
‫Jedyną rzeczą, której nie blokuje, jest kanał widoczności, a nasz ślad linii jest
‫zgodny z kanałem widoczności.
‫Wszystko w naszym świecie, co blokuje kanał widoczności, zostanie uderzone przez nasz ślad linii.
‫Ale ten konkretny tom nie będzie.
‫Powinno być niewidoczne.
‫Cóż, możemy przejść do ustawień kolizji, otworzyć menu rozwijane i wybrać niestandardowe.
‫To pozwoli nam to zmienić i ustawić reakcję kolizji na kanał widoczności.
‫To blok.
‫Więc teraz mam niewidzialny wolumin, ale jest ustawiony tak, aby blokować kanał widoczności, co oznacza, że
‫ślady linii, które podążają za kanałem widoczności, takim jak nasz, trafią w niego.
‫Mogę więc wziąć tę blokującą objętość i zwiększyć ją.
‫Ustawię go tuż za ścianą.
‫Właściwie mogę umieścić go dokładnie tutaj, na granicy ściany, i obniżę go trochę tak, aby
‫w pewnym sensie nachodził na ścianę.
‫I w ten sposób mamy tutaj tę niewidzialną barierę i zamierzam iść dalej i zwiększyć ją
‫również w kierunku Y.
‫Więc ustawię to ładne i duże i umieszczę go tutaj pośrodku i trochę go wyściełam.
‫I zamierzam również przeskalować to w kierunku Z.
‫Więc teraz jest ładny i duży, a nasz ślad linii powinien go trafić.
‫Przetestujmy więc tę teorię.
‫Kliknijmy w rzutni i podejdźmy do ściany.
‫I rzeczywiście, uderzam w ten blokujący wolumin za pomocą śledzenia linii i nie mam problemu, w którym
‫moja wieża zatrzaskuje się, aby spojrzeć w nieokreśloną lokalizację.
‫Prawdopodobnie patrzy w kierunku pochodzenia świata, ponieważ ten wektor punktów uderzenia ma same zera.
‫Teraz, jeśli podejdę do tej ściany, mam ten sam problem.
‫Potrzebujemy więc tych blokujących woluminów.
‫Na całym obwodzie naszego poziomu.
‫To może być całkiem proste.
‫Wszystko, co muszę zrobić, to zduplikować ten blokujący wolumin.
‫Teraz mogę zmienić widok perspektywiczny na górny widok ortogonalny.
‫Więc zamierzam wybrać górę i przewijać kółkiem myszy, po prostu przytrzymaj alt i zduplikuję tę ścianę
‫i umieszczę ją tutaj, a mogę nacisnąć E, aby przejść do trybu obracania.
‫Więc przytrzymam alt i obrócę się o 90 stopni.
‫To da mi kopię, a następnie nacisnę dwukrotnie u i uruchomię tryb tłumaczenia, przeniosę go
‫tutaj na tę stronę, przytrzymam Alt i przeciągnę kopię w dół na tę stronę.
‫Więc teraz mamy cztery ściany.
‫Teraz mogę przejść z widoku z góry z powrotem do perspektywy i nacisnąć przycisk odtwarzania, a teraz mogę podejść do
‫dowolnej z tych ścian i nie ma znaczenia, którą ścianę jestem przykryty, więc wygląda to świetnie.
‫Więc to rozwiązuje jeden z naszych problemów.
‫Ale co z tym drugim?
‫Jeśli przesuniemy mysz blisko naszego czołgu, nadal mamy to sporadyczne zachowanie.
‫Dlatego też chciałbym się tym zająć.
‫Teraz mogę się tym zająć, interpolując ten obrót.
‫Więc zamiast ustawiać tę wartość rotacji bezpośrednio, możemy użyć funkcji interpolacji,
‫która zasadniczo przesunie ten obrót w kierunku celu, który podajemy w płynny sposób.
‫Zobaczmy więc, jak to działa.
‫Teraz chciałbym, aby ta interpolacja była w naszej funkcji obracania wieżyczki, abyśmy mogli wrócić
‫do pionka podstawowego w dół, aby obrócić wieżyczkę, i zamiast ustawiać rotację naszego świata, aby wieża patrzyła
‫na obrót, możemy ustawić ją na równą wartość zwracana przez funkcję interpolacji.
‫Więc zamierzam usunąć, spójrz na rotację i zamiast tego wywołamy funkcję w bibliotece
‫matematycznej F o nazwie R między dwoma.
‫Teraz nasz w dwóch jest przeznaczony do obsługi interpolacji dla rotatorów.
‫Teraz jego pierwszym parametrem wejściowym jest stała wartość odniesienia rotatora F o nazwie current.
‫To jest aktualna wartość rzeczy, którą próbujemy zmienić.
‫To, co próbujemy zmienić, to rotacja naszych wież i możemy to uzyskać z naszej siatki wieży.
‫Powiemy więc, że siatka wieżyczki i funkcja, której chcemy użyć, to uzyskanie obrotu komponentu.
‫Więc to jest jak pobranie lokalizacji komponentu, tylko że otrzymujemy rotację.
‫Teraz następnym wejściem jest rotator F o nazwie Target.
‫To jest wartość.
‫Chcemy, aby ten obrót siatki wieży był interpretowany tak, aby zbliżał się płynnie.
‫To będzie nasze spojrzenie na rotację.
‫Więc powiem, spójrz na rotację.
‫Następnym wejściem jest czas Delta.
‫Więc wiemy, jak ważny jest czas Delta.
‫Jeśli poruszamy lub obracamy, chcemy, aby ten ruch był niezależny od liczby klatek na sekundę.
‫W tym celu możemy uzyskać czas Delta.
‫Mogę po prostu dołączyć statystyki rozgrywki, a jeśli masz dobrą pamięć, pamiętasz, że zawiera
‫ona statystyki rozgrywki kismet slash.
‫Dostaję tutaj statystyki rozgrywki, abym mógł uzyskać dostęp do funkcji statycznej, uzyskać delta sekund świata i pamiętać,
‫że wymaga to obiektu kontekstu świata.
‫Więc zamierzam to przełożyć na tamto.
‫I na koniec potrzebujemy wewnętrznej prędkości.
‫Im wyższa wartość prędkości wewnętrznej, tym szybciej będziemy interpolować w kierunku celu.
‫Więc jeśli ustawię to na, powiedzmy, pięć F, to będziemy interpolować dość wolno.
‫Zobaczmy teraz, jak to wygląda.
‫Wszystko to w jednym wierszu i znika z ekranu.
‫Więc zamierzam umieścić dane wejściowe, aby ustawić obrót świata w osobnym wierszu, w ten sposób.
‫Więc tak po prostu.
‫A potem nasz interpreter, który ma te cztery parametry wejściowe również z ekranu.
‫Więc zamierzam ustawić je na własnych liniach.
‫W ten sposób możemy zobaczyć wszystkie dane wejściowe bez konieczności przewijania ekranu w ten sposób.
‫W porządku.
‫Zamierzam to zapisać i rozpocząć kodowanie na żywo.
‫A teraz, jeśli nacisnę play i poruszę myszą, zauważ, że obrót zajmuje trochę czasu.
‫To dlatego, że płynnie interpolujemy w kierunku tej docelowej rotacji.
‫To świetnie.
‫Dokładnie tego chciałem.
‫Bez względu na to, jak poruszam myszą, nigdy nie dostanę tego gwałtownego, szarpanego, sporadycznego ruchu.
‫Teraz pięć to strasznie niska prędkość Internetu, ale możemy to zmienić.
‫Możemy to trochę przyspieszyć.
‫Ustawię to na 25, zobacz, jak to wygląda, i pozwolę ci zdecydować, jaką wartość lubisz
‫w swojej grze.
‫Więc jeszcze raz, rozpoczynając kodowanie na żywo i naciskając play.
‫Teraz mam dość szybką interpolację, ale nie pstryka.
‫Wciąż jest szybki, ale nie jest to błyskawiczne pstryknięcie.
‫Więc dopóki nie robimy czegoś takiego, cóż, nie zrozumiemy tego.
‫Szalone zachowanie.
‫I oczywiście, jeśli chcesz wolniejszej rotacji, wiesz jak to zrobić teraz i skończyliśmy z rysowaniem sfery
‫debugowania, więc pójdę dalej i usunę to.
‫Dobra.
‫Podsumowując, ustawiliśmy obrót wieży i patrzymy na Cel, który jest wektorem
‫F odpowiadającym punktowi na świecie.
‫W tej chwili używamy tylko wyniku trafienia śladu.
‫Teraz umieściliśmy tę funkcję w podstawowej klasie ponga i zabezpieczyliśmy ją, co oznacza, że
‫mogliśmy odziedziczyć tę funkcję w klasie tank.
‫A kiedy będziemy gotowi do stworzenia klasy wieży w oparciu o podstawę -- wtedy ta klasa wieży
‫odziedziczy funkcję obracania wieżyczki i będziemy mogli ją ponownie wykorzystać.
‫Wszystko, co musimy zrobić, to przejść.
‫W nowym spojrzeniu na Target będziemy pracować nad stworzeniem klasy wieżowej wywodzącej się z bazy — w przyszłych
‫wykładach.
‫Zobaczymy się wkrótce.