‫Cześć i witaj.
‫W tym wykładzie podłączymy nasz system zdrowia do planu animacji, abym mógł strzelać
‫do tej postaci, dopóki nie umrze.
‫Zanurzmy się i zobaczmy, jak to działa.
‫Więc chcesz, aby ta wartość logiczna w planach animacji była ustawiana automatycznie z rozgrywki.
‫A jeśli przejdziemy do wykresu zdarzeń i przyjrzymy się, jak to obecnie działa, inne właściwości, takie
‫jak uzyskaj prędkość, uzyskaj aktywność, przekształć, idziemy do pionka i wykonujemy na nim
‫funkcję get za każdym razem, gdy chcemy zaktualizować animację.
‫Więc chcemy podążać za tym modelem, w którym zamierzamy sprawdzić, czy nasz gracz
‫jest martwy.
‫Takie robią, że musimy wyeksponować jakąś funkcjonalność, jakąś funkcję wywoływalną z naszego C++.
‫Przejdźmy więc do C++ i zobaczmy, co tam jest.
‫Moglibyśmy więc stworzyć funkcję publiczną, ale to niekoniecznie czyni ją dostępną.
‫Aby zapewnić dostępność, musimy mieć nową funkcję, która sprawi, że będzie widoczny dla planów i systemu narzędziowego
‫nagłówka szyn.
‫Ale musimy pójść o krok dalej niż tylko mieć to jako nową funkcję.
‫Więc zaczynamy od makra funkcji, ale chcemy, aby można je było wywołać.
‫Jest to więc opcja, którą możemy użyć do wywołania schematu.
‫Istnieje jednak inna opcja, która nadpisuje możliwość wywołania schematu, a raczej sugeruje, że można go wywoływać
‫zgodnie z planem i że jest czysty.
‫Teraz za chwilę zobaczymy różnicę między czystym planem a planem, który można wywoływać.
‫Ale po prostu wiedz, że jeśli używasz czystego blueprinta, robi to to samo, co Blueprint Callable, a nawet więcej.
‫Więc to jest trochę więcej niż możliwe do wywołania w schemacie.
‫A potem potrzebujemy funkcji, która zwraca Boolean, która mówi, czy ten znak jest
‫martwy.
‫To będzie dla nas przydatne.
‫I wreszcie, chcemy, żeby była to funkcja koncertowa.
‫A teraz, dlaczego chce być koncertem?
‫Ponieważ kiedy wywołujemy tę funkcję, nie spodziewamy się, że zmieni ona jakikolwiek stan zapytania o znak, więc możemy
‫śmiało powiedzieć, że powinna to być funkcja koncertowa.
‫W rzeczywistości, koncert i czysty plan często idą w parze, ponieważ czysty plan oznacza, że jeśli przejdziemy
‫do jakiegoś planu, możemy spojrzeć na kilka czystych nut.
‫Ten tutaj otrzymuje aktywną transformację.
‫To czysta nuta.
‫Get velocity to czysta nuta, speed nie jest czystą nutą.
‫Czy widzisz, co może je ze sobą łączyć?
‫Co z nimi sprawia, że to nie jest czyste, a to jest czyste?
‫Cóż, ogólnie rzecz biorąc, to fakt, że to pióro wykonawcze, czysty węzeł, to taki, który nie
‫ma pinu wykonawczego.
‫I zwykle można bezpiecznie powiedzieć, że coś nie ma kodu wykonawczego, gdy nie ma to żadnego wpływu na
‫obiekt, który wywołuje, tylko na jego wynik.
‫Zasadniczo oznacza to, że bez względu na to, ile razy wywołamy tę funkcję, zawsze wypisze
‫ten sam wynik.
‫Zawsze będzie to miało taki sam wpływ na program.
‫To czysta funkcja.
‫Nie zmienia niczego, gdy jest wywoływana.
‫Więc to trochę to samo co const, chociaż jest trochę silniejsze, bo to, co mówi,
‫to nie tylko to, że nie zmienia niczego w tej postaci, ale nie zmienia niczego
‫globalnego, żadnego stanu, nigdzie.
‫Kropka.
‫Jedyny wkład, jedyny efekt, jaki ma, to produkty, które wytwarza.
‫Dlatego właśnie postanowiliśmy uczynić ten plan czystym.
‫Eliminuje potrzebę szpilki egzekucyjnej, co czyni ją znacznie ładniejszą w planach.
‫A także wyraża fakt, że nie wprowadzamy żadnych zmian w stanie naszej gry, kiedy wywołujemy
‫tę funkcję.
‫Więc chodźmy dalej i spróbujmy stworzyć do tego implementację.
‫W rzeczywistości pozostawię implementację Wam jako wyzwanie, a my przejdziemy do
‫tego i dołączymy to do wykresu, przepraszam, wykresu zdarzeń z planu animacji.
‫Więc zamierzamy to zrobić, mając tutaj nowy zestaw.
‫Chcemy ustawić zmienną logiczną is dead na końcu i chcemy uzyskać właściciela pionka i chcemy to rzucić, ponieważ
‫musi to być strzał w postać, aby ta właściwość była martwa.
‫Więc my też chcemy go obsadzić.
‫W tym przypadku chcę rzucić to na postać strzelanki C++, ponieważ
‫nie muszę sprowadzać się do stwierdzenia, że jest to zdecydowanie planowa wersja tego, ponieważ ta funkcja faktycznie istnieje
‫na poziomie C++.
‫Więc zamierzamy iść dalej i obsadzić.
‫Jeśli odniesiemy sukces w obsadzie, ustawimy to, co jest martwe.
‫Teraz pozwólcie, że wstawię tutaj kilka węzłów przekierowań, aby nasz projekt wyglądał trochę
‫ładniej.
‫A potem to, co chcemy zrobić, to użyć odnośnika do postaci, teraz, gdy rzuciliśmy
‫go na postać z pędów, o której wiemy, że powinna mieć to martwa właściwość, więc powinniśmy być w stanie to zrobić.
‫Po skompilowaniu i sprawdzeniu działania, możesz pobrać to jest martwą właściwość i ustawić ją tutaj.
‫Więc nadszedł czas, aby twoje wyzwanie obliczyć, czy jesteśmy martwi, czy nie.
‫Więc zwróć poprawną wartość logiczną z naszej funkcji is dead.
‫To pierwszy krok.
‫Możesz chcieć użyć do tego pewnych nierówności ze zmienną zdrowia, a następnie podłączyć naszą zmienną.
‫Martwy jest martwą zmienną.
‫W planie animacji zabrakło nam tego.
‫Po prostu potrzebowaliśmy po prostu kompilacji z dala od zrobienia tego.
‫Zatrzymaj wideo i posortuj.
‫Dobra.
‫Witamy spowrotem.
‫Przejdźmy więc najpierw do kodu.
‫Więc to całkiem prosto, zwrócę wyrażenie, które zwraca wartość logiczną.
‫Więc chcemy powiedzieć, czy zdrowie jest mniejsze lub równe zeru, w takim przypadku rzeczywiście jesteśmy martwi?
‫To tak proste, jak tylko funkcja wyrażenia.
‫Więc chodźmy dalej i zbudujmy to.
‫A kiedy to się skompiluje, możemy przejść do Unreal i podłączyć go.
‫Więc przeciągając postać strzelanki, jesteśmy węzłem, będziemy mieli tutaj odniesienie do postaci.
‫Więc chcemy zrobić, to dead daje nam to, że jest to funkcja martwa, widać, że nie ma kodu wykonawczego,
‫ponieważ jest czysta.
‫Następnie bierzemy tę wartość logiczną z tego i łączymy ją z naszą zmienną martwą.
‫A teraz, jeśli pójdziemy dalej i zagramy, powinniśmy być w stanie zabić tę postać na świecie.
‫Będziemy do niego strzelać, dopóki jego zdrowie nie spadnie do zera.
‫I proszę bardzo.
‫Animacja skutecznie go zabiła.