﻿1
00:00:04,580 --> 00:00:05,390
‫Cześć i witaj.

2
00:00:05,390 --> 00:00:10,730
‫W tym wykładzie podłączymy nasz system zdrowia do planu animacji, abym mógł strzelać

3
00:00:10,730 --> 00:00:13,700
‫do tej postaci, dopóki nie umrze.

4
00:00:13,700 --> 00:00:15,380
‫Zanurzmy się i zobaczmy, jak to działa.

5
00:00:16,580 --> 00:00:22,580
‫Więc chcesz, aby ta wartość logiczna w planach animacji była ustawiana automatycznie z rozgrywki.

6
00:00:23,180 --> 00:00:29,270
‫A jeśli przejdziemy do wykresu zdarzeń i przyjrzymy się, jak to obecnie działa, inne właściwości, takie

7
00:00:29,270 --> 00:00:34,370
‫jak uzyskaj prędkość, uzyskaj aktywność, przekształć, idziemy do pionka i wykonujemy na nim

8
00:00:34,370 --> 00:00:38,270
‫funkcję get za każdym razem, gdy chcemy zaktualizować animację.

9
00:00:38,810 --> 00:00:43,910
‫Więc chcemy podążać za tym modelem, w którym zamierzamy sprawdzić, czy nasz gracz

10
00:00:43,910 --> 00:00:45,020
‫jest martwy.

11
00:00:45,320 --> 00:00:52,130
‫Takie robią, że musimy wyeksponować jakąś funkcjonalność, jakąś funkcję wywoływalną z naszego C++.

12
00:00:52,670 --> 00:00:57,050
‫Przejdźmy więc do C++ i zobaczmy, co tam jest.

13
00:00:57,230 --> 00:01:02,300
‫Moglibyśmy więc stworzyć funkcję publiczną, ale to niekoniecznie czyni ją dostępną.

14
00:01:03,140 --> 00:01:09,740
‫Aby zapewnić dostępność, musimy mieć nową funkcję, która sprawi, że będzie widoczny dla planów i systemu narzędziowego

15
00:01:09,740 --> 00:01:10,850
‫nagłówka szyn.

16
00:01:11,120 --> 00:01:15,050
‫Ale musimy pójść o krok dalej niż tylko mieć to jako nową funkcję.

17
00:01:15,050 --> 00:01:20,090
‫Więc zaczynamy od makra funkcji, ale chcemy, aby można je było wywołać.

18
00:01:20,090 --> 00:01:22,910
‫Jest to więc opcja, którą możemy użyć do wywołania schematu.

19
00:01:24,140 --> 00:01:29,660
‫Istnieje jednak inna opcja, która nadpisuje możliwość wywołania schematu, a raczej sugeruje, że można go wywoływać

20
00:01:29,660 --> 00:01:32,420
‫zgodnie z planem i że jest czysty.

21
00:01:32,450 --> 00:01:36,620
‫Teraz za chwilę zobaczymy różnicę między czystym planem a planem, który można wywoływać.

22
00:01:36,920 --> 00:01:43,400
‫Ale po prostu wiedz, że jeśli używasz czystego blueprinta, robi to to samo, co Blueprint Callable, a nawet więcej.

23
00:01:43,400 --> 00:01:45,410
‫Więc to jest trochę więcej niż możliwe do wywołania w schemacie.

24
00:01:46,100 --> 00:01:50,600
‫A potem potrzebujemy funkcji, która zwraca Boolean, która mówi, czy ten znak jest

25
00:01:50,600 --> 00:01:51,110
‫martwy.

26
00:01:52,230 --> 00:01:54,240
‫To będzie dla nas przydatne.

27
00:01:54,540 --> 00:01:58,500
‫I wreszcie, chcemy, żeby była to funkcja koncertowa.

28
00:01:58,860 --> 00:02:00,740
‫A teraz, dlaczego chce być koncertem?

29
00:02:00,750 --> 00:02:08,010
‫Ponieważ kiedy wywołujemy tę funkcję, nie spodziewamy się, że zmieni ona jakikolwiek stan zapytania o znak, więc możemy

30
00:02:08,010 --> 00:02:11,790
‫śmiało powiedzieć, że powinna to być funkcja koncertowa.

31
00:02:12,270 --> 00:02:19,770
‫W rzeczywistości, koncert i czysty plan często idą w parze, ponieważ czysty plan oznacza, że jeśli przejdziemy

32
00:02:19,770 --> 00:02:24,120
‫do jakiegoś planu, możemy spojrzeć na kilka czystych nut.

33
00:02:24,390 --> 00:02:26,070
‫Ten tutaj otrzymuje aktywną transformację.

34
00:02:26,070 --> 00:02:27,000
‫To czysta nuta.

35
00:02:27,000 --> 00:02:30,690
‫Get velocity to czysta nuta, speed nie jest czystą nutą.

36
00:02:30,690 --> 00:02:33,240
‫Czy widzisz, co może je ze sobą łączyć?

37
00:02:33,240 --> 00:02:37,170
‫Co z nimi sprawia, że to nie jest czyste, a to jest czyste?

38
00:02:37,530 --> 00:02:43,440
‫Cóż, ogólnie rzecz biorąc, to fakt, że to pióro wykonawcze, czysty węzeł, to taki, który nie

39
00:02:43,440 --> 00:02:44,700
‫ma pinu wykonawczego.

40
00:02:45,090 --> 00:02:51,300
‫I zwykle można bezpiecznie powiedzieć, że coś nie ma kodu wykonawczego, gdy nie ma to żadnego wpływu na

41
00:02:51,300 --> 00:02:53,910
‫obiekt, który wywołuje, tylko na jego wynik.

42
00:02:54,240 --> 00:03:00,270
‫Zasadniczo oznacza to, że bez względu na to, ile razy wywołamy tę funkcję, zawsze wypisze

43
00:03:00,270 --> 00:03:01,590
‫ten sam wynik.

44
00:03:01,590 --> 00:03:04,950
‫Zawsze będzie to miało taki sam wpływ na program.

45
00:03:05,280 --> 00:03:06,690
‫To czysta funkcja.

46
00:03:06,690 --> 00:03:09,000
‫Nie zmienia niczego, gdy jest wywoływana.

47
00:03:09,360 --> 00:03:14,760
‫Więc to trochę to samo co const, chociaż jest trochę silniejsze, bo to, co mówi,

48
00:03:14,760 --> 00:03:20,190
‫to nie tylko to, że nie zmienia niczego w tej postaci, ale nie zmienia niczego

49
00:03:20,190 --> 00:03:21,960
‫globalnego, żadnego stanu, nigdzie.

50
00:03:21,960 --> 00:03:22,650
‫Kropka.

51
00:03:22,950 --> 00:03:28,740
‫Jedyny wkład, jedyny efekt, jaki ma, to produkty, które wytwarza.

52
00:03:29,700 --> 00:03:32,280
‫Dlatego właśnie postanowiliśmy uczynić ten plan czystym.

53
00:03:32,280 --> 00:03:36,930
‫Eliminuje potrzebę szpilki egzekucyjnej, co czyni ją znacznie ładniejszą w planach.

54
00:03:37,290 --> 00:03:43,110
‫A także wyraża fakt, że nie wprowadzamy żadnych zmian w stanie naszej gry, kiedy wywołujemy

55
00:03:43,110 --> 00:03:44,130
‫tę funkcję.

56
00:03:44,640 --> 00:03:48,630
‫Więc chodźmy dalej i spróbujmy stworzyć do tego implementację.

57
00:03:48,630 --> 00:03:54,120
‫W rzeczywistości pozostawię implementację Wam jako wyzwanie, a my przejdziemy do

58
00:03:54,120 --> 00:03:59,820
‫tego i dołączymy to do wykresu, przepraszam, wykresu zdarzeń z planu animacji.

59
00:04:00,300 --> 00:04:03,780
‫Więc zamierzamy to zrobić, mając tutaj nowy zestaw.

60
00:04:03,780 --> 00:04:12,660
‫Chcemy ustawić zmienną logiczną is dead na końcu i chcemy uzyskać właściciela pionka i chcemy to rzucić, ponieważ

61
00:04:12,660 --> 00:04:18,630
‫musi to być strzał w postać, aby ta właściwość była martwa.

62
00:04:18,630 --> 00:04:20,160
‫Więc my też chcemy go obsadzić.

63
00:04:20,490 --> 00:04:24,030
‫W tym przypadku chcę rzucić to na postać strzelanki C++, ponieważ

64
00:04:24,030 --> 00:04:30,120
‫nie muszę sprowadzać się do stwierdzenia, że jest to zdecydowanie planowa wersja tego, ponieważ ta funkcja faktycznie istnieje

65
00:04:30,120 --> 00:04:31,410
‫na poziomie C++.

66
00:04:31,800 --> 00:04:33,480
‫Więc zamierzamy iść dalej i obsadzić.

67
00:04:33,480 --> 00:04:36,690
‫Jeśli odniesiemy sukces w obsadzie, ustawimy to, co jest martwe.

68
00:04:37,230 --> 00:04:42,360
‫Teraz pozwólcie, że wstawię tutaj kilka węzłów przekierowań, aby nasz projekt wyglądał trochę

69
00:04:42,750 --> 00:04:43,320
‫ładniej.

70
00:04:44,190 --> 00:04:48,750
‫A potem to, co chcemy zrobić, to użyć odnośnika do postaci, teraz, gdy rzuciliśmy

71
00:04:48,750 --> 00:04:54,840
‫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ć.

72
00:04:55,020 --> 00:04:59,940
‫Po skompilowaniu i sprawdzeniu działania, możesz pobrać to jest martwą właściwość i ustawić ją tutaj.

73
00:05:00,860 --> 00:05:04,860
‫Więc nadszedł czas, aby twoje wyzwanie obliczyć, czy jesteśmy martwi, czy nie.

74
00:05:04,860 --> 00:05:08,190
‫Więc zwróć poprawną wartość logiczną z naszej funkcji is dead.

75
00:05:08,190 --> 00:05:08,970
‫To pierwszy krok.

76
00:05:09,240 --> 00:05:15,690
‫Możesz chcieć użyć do tego pewnych nierówności ze zmienną zdrowia, a następnie podłączyć naszą zmienną.

77
00:05:15,690 --> 00:05:17,370
‫Martwy jest martwą zmienną.

78
00:05:17,610 --> 00:05:20,280
‫W planie animacji zabrakło nam tego.

79
00:05:20,280 --> 00:05:23,250
‫Po prostu potrzebowaliśmy po prostu kompilacji z dala od zrobienia tego.

80
00:05:23,580 --> 00:05:25,980
‫Zatrzymaj wideo i posortuj.

81
00:05:27,460 --> 00:05:27,750
‫Dobra.

82
00:05:27,760 --> 00:05:28,270
‫Witamy spowrotem.

83
00:05:28,300 --> 00:05:31,630
‫Przejdźmy więc najpierw do kodu.

84
00:05:31,930 --> 00:05:36,550
‫Więc to całkiem prosto, zwrócę wyrażenie, które zwraca wartość logiczną.

85
00:05:36,820 --> 00:05:43,180
‫Więc chcemy powiedzieć, czy zdrowie jest mniejsze lub równe zeru, w takim przypadku rzeczywiście jesteśmy martwi?

86
00:05:43,450 --> 00:05:47,470
‫To tak proste, jak tylko funkcja wyrażenia.

87
00:05:47,830 --> 00:05:49,720
‫Więc chodźmy dalej i zbudujmy to.

88
00:05:50,680 --> 00:05:55,540
‫A kiedy to się skompiluje, możemy przejść do Unreal i podłączyć go.

89
00:05:55,540 --> 00:06:02,260
‫Więc przeciągając postać strzelanki, jesteśmy węzłem, będziemy mieli tutaj odniesienie do postaci.

90
00:06:02,530 --> 00:06:08,410
‫Więc chcemy zrobić, to dead daje nam to, że jest to funkcja martwa, widać, że nie ma kodu wykonawczego,

91
00:06:08,410 --> 00:06:09,340
‫ponieważ jest czysta.

92
00:06:09,700 --> 00:06:14,770
‫Następnie bierzemy tę wartość logiczną z tego i łączymy ją z naszą zmienną martwą.

93
00:06:15,250 --> 00:06:21,280
‫A teraz, jeśli pójdziemy dalej i zagramy, powinniśmy być w stanie zabić tę postać na świecie.

94
00:06:21,280 --> 00:06:23,980
‫Będziemy do niego strzelać, dopóki jego zdrowie nie spadnie do zera.

95
00:06:24,280 --> 00:06:25,240
‫I proszę bardzo.

96
00:06:25,240 --> 00:06:28,450
‫Animacja skutecznie go zabiła.

