﻿1
00:00:04,610 --> 00:00:05,450
‫你好, 欢迎｡

2
00:00:05,450 --> 00:00:10,790
‫在这节课中, 我们将把我们的医疗系统和动画蓝图连接起来, 这样我就可以拍摄这个角色,

3
00:00:10,790 --> 00:00:13,730
‫直到他死去｡

4
00:00:13,730 --> 00:00:15,680
‫让我们深入了解一下它是如何工作的｡

5
00:00:16,520 --> 00:00:22,820
‫因此, 我们希望动画蓝图中的布尔值可以从游戏中自动设置｡

6
00:00:23,090 --> 00:00:29,300
‫如果我们进入我们的事件图, 看看它目前是如何工作的, 其他属性, 比如速度,

7
00:00:29,300 --> 00:00:34,460
‫激活, 转换, 我们将进入兵,

8
00:00:34,460 --> 00:00:38,480
‫每次我们想要更新动画时, 我们都会在它上面执行一个获取函数｡

9
00:00:38,750 --> 00:00:45,180
‫所以我们要沿着这个模型中继续下去, 看看我们的参与者是否死了.

10
00:00:45,200 --> 00:00:52,400
‫因此, 要做到这一点, 我们需要公开一些功能, 一些C++中的可调用函数｡

11
00:00:52,520 --> 00:00:57,140
‫让我们来看看C++, 看看它有什么｡

12
00:00:57,140 --> 00:01:02,540
‫所以我们可以创建一个公共函数, 但这并不一定使它可访问｡

13
00:01:03,050 --> 00:01:11,030
‫为了实现可访问性, 我们需要一个U函数, 使其对蓝图可见, 并展开标题工具系统｡

14
00:01:11,030 --> 00:01:15,080
‫但我们必须更进一步, 而不仅仅是把它作为一个你的函数｡

15
00:01:15,080 --> 00:01:20,150
‫所以我们从你的函数宏开始, 但是我们想让它成为蓝图可调用的｡

16
00:01:20,150 --> 00:01:23,180
‫这就是我们可以使用可调用蓝图的选项｡

17
00:01:23,990 --> 00:01:30,170
‫然而, 还有另一个选项可以覆盖Blueprint, 或者说暗示它是可调用的蓝图,

18
00:01:30,170 --> 00:01:32,460
‫这是纯蓝图｡

19
00:01:32,480 --> 00:01:36,830
‫现在, 我们马上就能看到纯蓝图和可调用蓝图之间的区别｡

20
00:01:36,830 --> 00:01:43,430
‫但只要知道, 如果你使用蓝图纯, 它是做同样的蓝图可调用, 然后一些｡

21
00:01:43,430 --> 00:01:45,650
‫所以它做的比Blueprint可调用的多一点｡

22
00:01:46,070 --> 00:01:51,410
‫然后我们需要一个函数, 它返回布尔值来表示这个角色是否死了.

23
00:01:52,290 --> 00:01:54,440
‫这对我们来说是很有用的｡

24
00:01:54,450 --> 00:01:58,740
‫最后, 我们希望这是一个Concert成员函数｡

25
00:01:58,770 --> 00:02:00,810
‫现在, 为什么它想成为音乐会？

26
00:02:00,810 --> 00:02:08,040
‫因为当我们调用这个函数时, 我们并不期望它改变角色的任何状态｡

27
00:02:08,040 --> 00:02:12,030
‫所以我们可以有把握地说, 这应该是一个音乐会功能｡

28
00:02:12,150 --> 00:02:19,800
‫实际上, Concert和blueprint pure经常是一起的, 因为blueprint pure意味着,

29
00:02:19,800 --> 00:02:24,330
‫如果我们进入任何一个blueprint, 我们都可以看到一些pure节点｡

30
00:02:24,330 --> 00:02:26,130
‫这一个得到行为转换｡

31
00:02:26,130 --> 00:02:27,030
‫那是个纯节点｡

32
00:02:27,030 --> 00:02:30,720
‫得到的速度是一个纯节点设置的速度不是一个纯节点｡

33
00:02:30,720 --> 00:02:33,330
‫你能看出是什么把这些联系在一起的吗？

34
00:02:33,330 --> 00:02:37,380
‫为什么这些会使这个不纯而这个纯呢？

35
00:02:37,410 --> 00:02:40,800
‫嗯, 一般来说, 这是一个事实, 有一个执行针｡

36
00:02:40,800 --> 00:02:44,970
‫纯节点是指没有执行pin的节点｡

37
00:02:44,970 --> 00:02:54,210
‫通常可以说某个东西没有执行pin, 当它对它调用的东西没有任何影响时, 它只对它的结果有影响｡

38
00:02:54,270 --> 00:03:01,620
‫从本质上讲, 这意味着无论我们调用这个函数多少次, 它总是会输出相同的结果｡

39
00:03:01,620 --> 00:03:05,160
‫它总是会对程序产生同样的影响｡

40
00:03:05,160 --> 00:03:06,720
‫它是一个纯粹的函数｡

41
00:03:06,720 --> 00:03:09,240
‫调用它时不会更改任何内容｡

42
00:03:09,240 --> 00:03:14,670
‫所以它和常量差不多, 虽然它更强一点,

43
00:03:14,670 --> 00:03:22,020
‫因为它说的不仅仅是它不改变射手角色的任何东西, 而且它不改变任何全局的东西, 任何地方的任何状态｡

44
00:03:22,020 --> 00:03:22,890
‫到此为止｡

45
00:03:22,890 --> 00:03:28,980
‫唯一的输入, 唯一的效果是它产生的输出｡

46
00:03:29,580 --> 00:03:32,340
‫这就是为什么我们选择让这个蓝图变得纯粹｡

47
00:03:32,340 --> 00:03:37,170
‫它消除了对执行引脚的需要, 这使得它在蓝图中更好｡

48
00:03:37,170 --> 00:03:44,340
‫它也表达了这样一个事实当我们调用这个函数时, 我们并没有对博弈状态做任何改变.

49
00:03:44,520 --> 00:03:48,660
‫因此, 让我们继续并尝试为此创建一个实现｡

50
00:03:48,660 --> 00:03:54,180
‫实际上, 我将把实现作为一个挑战留给你们,

51
00:03:54,180 --> 00:04:00,060
‫我们将把它挂在一个动画图中, 对不起, 是动画蓝图的事件图｡

52
00:04:00,210 --> 00:04:03,810
‫所以我们要用一个新的集合来完成这个任务｡

53
00:04:03,810 --> 00:04:12,720
‫我们想在结尾处设置一个死的布尔变量, 我们想得到兵的主人, 我们想投这个角色,

54
00:04:12,720 --> 00:04:18,660
‫因为它需要是一个射手角色, 才能有这个死的属性｡

55
00:04:18,660 --> 00:04:23,430
‫所以我们想把它转换成,

56
00:04:23,430 --> 00:04:31,650
‫在这个例子中我想把它转换成C++射击角色, 因为我不需要一直说它肯定是一个蓝图版本, 因为这个新函数实际上存在于C++级别｡

57
00:04:31,650 --> 00:04:33,510
‫所以我们要开始选角了｡

58
00:04:33,510 --> 00:04:36,930
‫如果我们成功地执行了强制转换, 我们将设置is dead属性｡

59
00:04:37,110 --> 00:04:43,650
‫让我在这里放一些重定向节点, 让我们的蓝图看起来更漂亮一点｡

60
00:04:44,070 --> 00:04:47,610
‫然后我们要做的是使用这个射手角色参考｡

61
00:04:47,610 --> 00:04:52,980
‫现在我们已经将它转换为一个射击角色, 我们知道它应该具有这是一个死属性｡

62
00:04:52,980 --> 00:04:54,900
‫所以我们应该可以做到｡

63
00:04:55,080 --> 00:05:00,180
‫一旦编译并使其工作, 就可以获取this is dead属性并在此处设置它｡

64
00:05:01,080 --> 00:05:04,860
‫现在是时候让你来计算我们是死是活了.

65
00:05:04,860 --> 00:05:08,220
‫因此, 从is dead函数中返回正确的布尔值｡

66
00:05:08,220 --> 00:05:09,180
‫这是第一步｡

67
00:05:09,180 --> 00:05:15,750
‫你可能会想用一些不等式来表示健康变量, 然后再把变量联系起来｡

68
00:05:15,750 --> 00:05:20,310
‫在动画蓝图中, 死的是死的变量, 我们只差一点就做到了｡

69
00:05:20,310 --> 00:05:23,490
‫我们只需要基本上只需要一个编译就可以完成｡

70
00:05:23,490 --> 00:05:26,280
‫暂停视频, 整理一下｡

71
00:05:27,520 --> 00:05:27,790
‫好吧, 我会的

72
00:05:27,790 --> 00:05:28,340
‫欢迎回来｡

73
00:05:28,360 --> 00:05:31,840
‫首先, 让我们来看看代码｡

74
00:05:31,840 --> 00:05:36,730
‫很简单, 我将返回一个布尔值的表达式｡

75
00:05:36,730 --> 00:05:43,450
‫所以我们想说, 健康小于或等于零, 在这种情况下我们确实死了？

76
00:05:43,510 --> 00:05:47,710
‫这是一个函数表达式所能得到的最简单的结果｡

77
00:05:47,710 --> 00:05:49,990
‫所以让我们继续构建它｡

78
00:05:50,680 --> 00:05:55,600
‫一旦编译完成, 我们就可以进入虚幻世界, 把它连接起来｡

79
00:05:55,600 --> 00:06:02,020
‫把as shooter拖到字符, 我们是节点, 我们这里有一个shooter字符引用,

80
00:06:02,020 --> 00:06:09,550
‫所以我们要做的是dead, 给我们这个is dead函数, 你可以看到它没有执行引脚, 因为它是纯的｡

81
00:06:09,580 --> 00:06:15,010
‫然后我们把这个布尔值从那个中取出来, 并把它和我们的is dead变量连接起来｡

82
00:06:15,130 --> 00:06:21,340
‫现在如果我们继续玩下去, 我们应该可以在世界上杀死这个角色｡

83
00:06:21,340 --> 00:06:24,190
‫我们会一直打到他的生命值归零｡

84
00:06:24,190 --> 00:06:25,300
‫就这样｡

85
00:06:25,300 --> 00:06:28,780
‫动画已经成功地杀死了他｡

