‫Witam ponownie.
‫Teraz poruszamy się naszym czołgiem do przodu i do tyłu, ale nie mamy możliwości sterowania czołgiem.
‫W tym filmie będziemy pracować nad obracaniem zbiornika za pomocą czegoś, co nazywa się rotacją lokalną.
‫Jest to analog obrotowy do dodania lokalnego przesunięcia aktora.
‫Teraz dodanie lokalnego przesunięcia aktora miało wiele parametrów wejściowych i przekazaliśmy tylko pierwszy z nich, ponieważ pozostałe
‫trzy były opcjonalne.
‫Ale jedna z tych trzech pozostałych dotyczyła zamiatania.
‫Przedyskutujemy trochę o zamiataniu, zanim będziemy kontynuować wdrażanie rotacji.
‫Więc wróciłem do dokumentacji dla ADD Aktor Local Offset.
‫Przyjrzyjmy się więc jeszcze raz tym parametrom wejściowym.
‫Drugi nazywa się B Sweep i jest boolowski.
‫Teraz, jeśli przewiniemy trochę w dół i przeczytamy informacje tutaj o przemiataniu B, powiemy, czy
‫przesuwamy się do lokalizacji docelowej, wyzwalając nakładanie się po drodze i zatrzymując się przed celem, jeśli
‫coś zostanie zablokowane.
‫Mówi również, że tylko komponent główny jest przemiatany i sprawdzany pod kątem kolizji blokujących.
‫Komponenty podrzędne poruszają się bez przeciągania.
‫Jeśli kolizja jest wyłączona, nie ma to wpływu.
‫Porozmawiajmy więc o tym, co to teraz oznacza w programowaniu gier, zamiatanie jest techniką wykonywaną przez silnik, o
‫ile włączone jest zamiatanie.
‫Jeśli mamy poruszający się obiekt, taki jak sfera reprezentowana przez ten okrąg, każda klatka, gdy ta
‫sfera się porusza, silnik przeprowadza kontrolę przemiatania.
‫Oznacza to, że sprawdza, czy ten ruch dla tej konkretnej klatki spowodowałby nakładanie się
‫dwóch obiektów.
‫Więc mam ten blok tutaj reprezentowany przez ten prostokąt.
‫Zastanówmy się teraz nad tym, że są to jedyne dwa obiekty na świecie.
‫Tak więc, gdy przesuwanie jest włączone, gdy kula zbliża się do obiektu, silnik sprawdza, czy te
‫dwa obiekty nakładają się na siebie.
‫Teraz, gdy kula nadal się porusza, załóżmy, że podczas jednej z tych klatek kula przesunęłaby się
‫tak, że nachodziła na inny obiekt.
‫Teraz włączone przemiatanie silnik wykryje to nakładanie się i przesunie tę sferę z powrotem
‫dla tej konkretnej klatki, aby nigdy nie penetrowała obiektu.
‫Teraz tak naprawdę nigdy nie widzimy, jak sfera penetruje obiekt.
‫Silnik łapie, które nakładają się, zanim ruch zostanie faktycznie zrealizowany.
‫W rezultacie widzimy, że kula przestaje się nakładać.
‫Więc gdyby ten prostokąt był na przykład ścianą, kula zatrzymałaby się na powierzchni ściany.
‫To właśnie dla nas osiąga zamiatanie.
‫Teraz dokumentacja mówi, że jeśli kolizja jest wyłączona, nie ma to żadnego efektu.
‫Więc kolizja musi być włączona, aby zamiatanie działało.
‫Wracając do zbiorników CP w funkcji move, oto nasze wywołanie, aby dodać lokalne przesunięcie aktora i jeśli
‫chcemy, możemy przekazać tutaj inny parametr wejściowy, drugi to wartość logiczna zamiatania, więc możemy przekazać tutaj
‫wartość true.
‫Więc skompilujmy to i zobaczmy efekt włączenia zamiatania.
‫Teraz, jeśli naciśniemy play i spróbujemy przejść na przykład przez ścianę, zobaczymy, że przechodzimy przez
‫ścianę.
‫Więc coś tu nie działa.
‫Teraz spójrzmy, czym jest ten element trasy dla zbiornika BP w stawie.
‫Przypomnijmy, użyliśmy komponentu kapsuły do trasy.
‫Tak więc z komponentami kapsułek wybranymi w zbiorniku stawowym BP.
‫Przejdźmy do panelu szczegółów i przewiń w dół, a zobaczymy tutaj sekcję o nazwie Kolizja.
‫A tutaj widzimy Presety kolizji i mają one rozwijane menu.
‫Więc rozszerzmy to.
‫Teraz ustawienia wstępne kolizji można ustawić na dowolną liczbę opcji i domyślnie widzimy nakładanie się wszystkich dynamicznych.
‫Teraz, w zależności od używanej wersji Unreal Engine.
‫Możesz zobaczyć tutaj coś innego, ale możemy to zmienić.
‫Jeśli wybierzemy menu rozwijane i wybierzemy blokowanie wszystkich dynamicznych, wówczas wyszarzane opcje poniżej się zmienią.
‫Pamiętaj, że byliśmy na nakładaniu się wszystkich dynamicznych i tutaj widzimy trzy kolumny pól wyboru.
‫Są to reakcje na kolizje, a kolumna po lewej stronie pokazuje listę typów obiektów kolizji.
‫Tak więc każdy komponent ma swój własny typ obiektu kolizyjnego.
‫Zauważ, że możemy zobaczyć typ obiektu dla kapsuły ustawiony na dynamikę świata.
‫A kiedy zmienimy ustawienia wstępne kolizji, aby zablokować całą dynamikę, zobaczysz, że wszystkie reakcje
‫na kolizje są sprawdzane pod kątem blokowania w odpowiedzi na wszystkie inne typy obiektów kolizji.
‫Więc naciśnijmy play i zobaczmy, co się dzieje, gdy próbujemy przejść przez różne rzeczy.
‫Zobaczysz, że przestajemy się na siebie nakładać.
‫Pozostałe stawy.
‫Teraz, jeśli przesunę zbiornik tak, że możemy spróbować nałożyć się na ścianę i obejść inne
‫stawy.
‫Teraz, jeśli nacisnę play, zablokuję również ścianę.
‫Tak więc ten blok predefiniowanych kolizji, all dynamic ustawia reakcję kolizji na blokowanie wszystkich innych typów obiektów.
‫I zawsze możesz zobaczyć typ obiektu kolizji konkretnego komponentu, wybierając go w panelu komponentów
‫i przewijając w dół do sekcji kolizji w panelu szczegółów i otwierając menu rozwijane dla
‫ustawień kolizji.
‫Mam wybraną siatkę bazową, a jej typ obiektu to świat dynamiczny i jest ustawiony na blokowanie wszystkich.
‫Więc teraz widzimy, że przemiatanie działa, ponieważ ustawiliśmy nasze ustawienia kolizji dla kompozycji kapsuły tak, aby blokowała
‫całą dynamikę.
‫A w dokumentacji widzieliśmy, że tylko główny komponent jest przeszukiwany i sprawdzany pod kątem kolizji blokujących.
‫Więc tak naprawdę nie ma znaczenia, jakie są ustawienia innych komponentów.
‫Sprawdzamy tylko, czy składnik główny coś blokuje.
‫Teraz jeden problem, na który natknęli się niektórzy uczniowie, to to, że nie mogą się ruszyć, gdy tylko ustawią
‫kapsułę tak, aby zablokować całą dynamikę.
‫Jednym z powodów może być to, że twoja kapsuła zachodzi na podłogę.
‫Jeśli kapsuła zachodzi na podłogę, nie będziesz w stanie się poruszyć, ponieważ
‫silnik nie pozwoli twojemu czołgowi na ruch, jeśli element kapsuły nachodzi na coś, co ma blokować.
‫Więc łatwym rozwiązaniem tego problemu byłoby upewnienie się, że kapsuła nie zachodzi na podłogę.
‫Teraz możesz wejść do swojego BP -- zbiornika i upewnić się, że twoja kapsuła jest tuż nad kołami.
‫Przejdę do widoku ortogonalnego.
‫I wybierz moją podstawową siatkę i po prostu ją obniż.
‫Tak więc koła znajdują się tuż pod komponentem kapsuły.
‫Więc teraz, jeśli twoja siatka jest na podłodze, a kapsuła jest tuż nad siatką.
‫Powinieneś być w stanie się poruszać.
‫Więc włączę odtwarzanie i gotowe.
‫Więc teraz, gdy mamy zamiatanie z drogi, czas zacząć wdrażać rotację.
‫Wróćmy do naszych ustawień projektu.
‫Idziemy więc do edycji ustawień projektu, przewijamy w dół do input iw sekcji input mamy nasze mapowania osi.
‫Teraz już się tym zajęliśmy.
‫Ruszaj naprzód.
‫Nadszedł czas, aby zająć się następnym, zwanym Turn and Turn ma przypisane D i A, gdzie D ma
‫skalę jeden, a A ma skalę ujemną.
‫Chcielibyśmy użyć D i AX do obracania czołgiem.
‫Tak więc, aby powiązać funkcję z mapowaniem osi skrętu, potrzebujemy funkcji do powiązania.
‫Wróciliśmy więc do kodu V i zamierzam przejść do pliku tank, abyśmy mogli stworzyć funkcję do powiązania z
‫mapowaniem osi obrotu.
‫Teraz po prostu wywołam tę funkcję void turn i po prostu jak move.
‫Potrzebuje parametru wejściowego zmiennoprzecinkowego i nazwiemy tę wartość.
‫Więc zadeklarowaliśmy tę funkcję, zdefiniujmy ją i tank CP, a ja zamierzam umieścić ją tuż
‫pod funkcją move.
‫Więc nadałem jej treść funkcji i potrzebuję nazwy klasy wraz z podwójnymi dwukropkami tuż przed
‫nazwą funkcji.
‫Teraz mamy właściwą funkcję.
‫To nie jedyna rzecz, którą musimy zrobić.
‫Musimy się upewnić, że ta funkcja jest powiązana z odwzorowaniem osi zwanym turn.
‫Robimy to w ustawieniach komponentu wejściowego odtwarzacza i robimy to tak, jak robiliśmy mapowanie osi ruchu do przodu.
‫Więc powiemy komponent wejściowy gracza, użyjemy operatora strzałki i osi bind.
‫Teraz pierwszym parametrem będzie nazwa odwzorowania osi opakowana w makro tekstowe.
‫Więc powiemy turn, ponieważ to była nazwa odwzorowania osi.
‫Dalej jest obiekt, dla którego przypisujemy funkcję.
‫Możemy to przekazać i na koniec przekazać funkcję, którą chcielibyśmy ponownie powiązać.
‫Potrzebujemy adresu operatora i czeka nas kolej na czołg.
‫Więc to takie proste.
‫Powiązaliśmy funkcję skrętu z mapowaniem osi skrętu.
‫Pozostało tylko zrobić coś w funkcji turn.
‫Widzieliśmy, że mamy lokalne przesunięcie aktora ADD, ale istnieje odpowiednik rotacji tej funkcji i nazywa
‫się to lokalnym obrotem aktora ADD.
‫To, co to robi, to dodanie lokalnego obrotu do aktora, jak sugeruje jego nazwa, i zobaczysz, że istnieją
‫dwie różne wersje funkcji, jedna, która przyjmuje rotator F i druga, która przyjmuje coś, co nazywa
‫się F kwadrat.
‫Użyjemy wersji, która przyjmuje rotator F.
‫Nazywa się to rotacją delta.
‫I podobnie jak przesunięcie lokalne aktora ADD, może również przyjąć parametr wobulacji i te same dwa inne parametry wejściowe,
‫co dodanie lokalnego przesunięcia aktora.
‫A te ostatnie trzy parametry wejściowe są opcjonalne, podobnie jak dodanie lokalnego przesunięcia aktora.
‫Więc zamiast wektora F, przekażemy rotator F.
‫Wracając do funkcji turn, jeśli utworzymy rotator F i nazwiemy to rotacją Delta, zobaczymy, że jeśli klikniemy
‫prawym przyciskiem myszy na rotator F i przejdziemy do definicji, zostaniemy przeniesieni do rotatora i zobaczymy
‫trzy publiczne zmienne składowe tutaj typu float.
‫Teraz, tak jak rotator F wektora F ma tylko te trzy komponenty zamiast X, Y i Z, mamy
‫pitch yaw and roll.
‫Teraz tym elementem, który nas interesuje, jest zbaczanie z kursu.
‫Mówi obrót wokół górnej osi w nawiasach wokół osi Z.
‫I to jedyny rodzaj rotacji, na którym nam zależy, obracając się wokół osi Z.
‫W ten sposób możemy sterować naszym czołgiem.
‫Teraz tylko zaznaczę, że istnieje wiele konstruktorów również dla rotatora F i że domyślnie ponownie
‫mówi, że nie ma inicjalizacji, tak jak w przypadku wektora F.
‫Możemy więc użyć tego, który przyjmuje pojedynczą liczbę zmiennoprzecinkową, a wszystkie komponenty zostaną zainicjowane do tej wartości
‫zmiennoprzecinkowej.
‫Jest jeden z trzema wartościami zmiennoprzecinkowymi i możesz spojrzeć i zobaczyć niektóre z pozostałych.
‫Teraz zaznaczę również, że jest zerowy rotator, a tak przy okazji, to jest statyczny zerowy rotator.
‫Dlatego możemy wrócić do zbiornika CP i powiedzieć coś w rodzaju równa się F rotator zero rotator zero rotator jest statyczną zmienną składową
‫i można uzyskać dostęp do statycznych funkcji składowych i zmiennych takich jak ta, określając nazwę klasy za pomocą
‫operatora rozwiązywania zakresu i odwołując się do tej zmiennej statycznej zmienna lub funkcja według
‫nazwy.
‫To właśnie robimy tutaj z tobą.
‫Statystyka rozgrywki, w której delta sekund na świecie, jest statyczna.
‫Funkcja, co oznacza, że nie potrzebujemy rzeczywistej instancji klasy statyki rozgrywki, aby móc uzyskać
‫dostęp do tej statycznej funkcji.
‫Po prostu już istnieje.
‫To samo z rotatorem zerowym i wektorem zerowym.
‫Więc zamierzam zamknąć rotator h i mamy ten obrót delta i jest on zainicjalizowany z rotatorem
‫zerowym.
‫Teraz twoja wysokość i rola są wyzerowane, tak jak X, Y i Z są wyzerowane dla wektora F.
‫Więc będziemy musieli zmienić twój komponent.
‫Tak jak zrobiłem z naszą lokalizacją delta w funkcji MOV, stwórzmy trochę pseudokodu dla rotacji
‫delta.
‫Tak, oczywiście chcemy, aby wszyscy byli nastawieni na wartość skalowaną przez czas Delta, ponieważ chcemy, aby to obracanie
‫było niezależne od szybkości klatek, ale potrzebujemy również pewnego rodzaju szybkości obracania, którą możemy nazwać tą
‫szybkością obracania.
‫Więc kiedy już to ustawimy, tak, wtedy możemy dodać ten lokalny obrót, który będzie obracał aktora zgodnie z
‫rotatorem F w każdej klatce i że ya będzie skalowane według wartości.
‫Więc będzie zero, jeśli nie naciskamy żadnych klawiszy i będzie miało wartość, jeśli wciśniemy DX
‫i ax.
‫Więc teraz masz wyzwanie.
‫To będzie działać tak samo, jak dodanie lokalnego przesunięcia aktora.
‫Jedyna różnica polega na tym, że obracamy teraz aktora.
‫Więc ponieważ potrzebujemy pewnego rodzaju szybkości obracania się aktora, utworzysz zmienną szybkości obracania, ustawisz
‫ją jako zmiennoprzecinkową i umieścisz w sekcji prywatnej tuż obok zmiennej szybkości.
‫Ujawnij tę zmienną ze swoją właściwością i wybierz odpowiednie nowe specyfikatory właściwości.
‫Teraz w funkcji turn będziesz w szczególności ustawiać rotację delta, dbamy o twój komponent
‫ustaw wartość równą wartości razy nasza zmienna rotacji, a także pomnóż przez czas delta, a następnie jesteś gotowy, aby
‫wywołać add aktor lokalny obrót przechodzący przez ten rotator f teraz dla drugiego parametru, śmiało
‫i przejdź w true dla wejścia przemiatania B, ponieważ chcemy zamiatać podczas obracania, wstrzymać wideo i teraz
‫zaimplementować obrót dla zbiornika.
‫Dobra.
‫Więc to będzie dość proste.
‫Potrzebujemy tylko zmiennej szybkości obrotu.
‫Teraz wejdę do zbiornika tuż pod prędkością i stworzę pływak skrętu.
‫Teraz prawdopodobnie zainicjujesz to do jakiejś wartości i to jest w porządku.
‫Jeśli jest inny niż to, co wybieram, pójdę z 45 F i zobaczę, jak to działa.
‫Ale pokażemy to planom, abyśmy mogli to zmienić podczas rozwoju.
‫Teraz chciałbym, aby był edytowany w dowolnym miejscu i zamierzam umieścić go w tej samej kategorii ruchu, co prędkość.
‫Więc zamierzam śmiało ukraść tę twoją własność i wkleić ją tutaj, powyżej, skręć w prawo, aby ustawić
‫ją gdziekolwiek.
‫Ruch kategorii teraz i CP czołgu.
‫Jestem gotowy, aby ustawić tak dla rotacji Delta.
‫Więc powiemy rotacja delta.
‫Tak.
‫I ustawimy go na równe czasy wartości, czasy obrotu, czas delta.
‫I oczywiście możemy uzyskać czas delta ze statystykami gry U, uzyskać delta sekund świata przechodzące w
‫tym jako obiekt kontekstu świata.
‫Więc zamierzam to wkleić właśnie tam.
‫Teraz wiem, że mój pseudokod dokładnie się nie zgadza.
‫Jest w złej kolejności.
‫Czas delta jest tutaj pośrodku.
‫Nie ma to znaczenia, ponieważ mnożąc trzy wartości razem, możesz je pomnożyć w dowolnej kolejności i nadal
‫uzyskać ten sam wynik.
‫Więc na wypadek, gdybyś się nad tym zastanawiał, matematyka nadal wyjdzie taka sama, jeśli pomnożysz te
‫trzy wartości w innej kolejności.
‫Więc nie przejmuj się tym zbytnio.
‫Teraz mamy rotację delta.
‫Jedyne, co pozostało do zrobienia, to wywołanie dodawania aktora rotacji lokalnej i przechodzimy w rotacji Delta, a
‫dla drugiego wejścia przekażemy true, aby umożliwić przemiatanie podczas obracania.
‫Więc skompilujmy to.
‫W porządku, jesteśmy teraz skompilowani.
‫W kilku następnych filmach możesz zauważyć, że w tych liniach brakuje wektora zerowego i rotatora
‫zerowego.
‫To dlatego, że zacząłem od tych zainicjowanych, a później zdałem sobie sprawę, że prawdopodobnie powinny
‫one zostać zainicjowane przynajmniej z wartościami zerowymi.
‫Więc nie martw się, jeśli później zobaczysz te linie wyglądające tak po inicjalizacji, zachowaj swój wektor zerowy
‫i zerowy rotator, a zobaczysz, że złapię to w niedalekiej przyszłości.
‫Więc nie martw się.
‫Jeśli nie widzisz tych inicjujących, powinny tam być.
‫I wracamy do edytora.
‫Włączmy odtwarzanie, a ja użyję klawisza D i obracamy się, a klawisz A obraca mnie z powrotem w drugą stronę i możemy też
‫poruszać się do przodu i do tyłu.
‫Więc teraz, kiedy możemy się obracać i iść do przodu, mamy możliwość poruszania się po całym świecie.
‫To wielki kamień milowy.
‫Teraz poruszam się dość wolno, ale to jest w porządku, ponieważ mogę wybrać swój czołg i
‫mogę wyszukać kategorię ruchu i zmienić szybkość obrotu na coś wyższego, na przykład 90.
‫Więc chodźmy dalej i włączmy odtwarzanie.
‫A to trochę szybciej.
‫Teraz, jeśli uważasz, że to nadal jest trochę powolne.
‫Oczywiście możesz je dostosować.
‫Więc mam zamiar ponownie wybrać -- zbiornik.
‫I zamiast 400, niech będzie 800.
‫Dlaczego nie?
‫Zamiast 90 powiedzmy 120.
‫Teraz, jeśli nacisnę play, jestem trochę szybszy.
‫Więc to wygląda naprawdę, naprawdę dobrze.
‫Patrząc więc wstecz na plan sekcji, mamy teraz czołg, który może poruszać się po całym świecie.
‫Ten pierwszy punkt jest zdecydowanie odhaczony i zajmujemy się ruchem WASD.
‫Nie zajmujemy się jeszcze wprowadzaniem danych z myszy, ale do tego dojdziemy.
‫Ale jesteśmy o krok bliżej do ukończenia tej gry.
‫Podsumowując, dowiedzieliśmy się, czym jest zamiatanie i jak możemy to umożliwić, aby nasze obiekty nie przechodziły
‫przez siebie.
‫Dodaliśmy lokalną rotację aktorów i zrobiliśmy to, wprowadzając szybkość rotacji, którą mogliśmy dostosować w szczegółach.
‫Panel w edytorze ułatwiający programowanie.
‫Dobra robota.
‫Teraz przewozimy czołg na całym świecie.
‫Do zobaczenia w następnym filmie.