﻿1
00:00:04,340 --> 00:00:05,390
‫你好, 欢迎｡

2
00:00:05,390 --> 00:00:09,320
‫在这节课中, 我们将对这位演员造成伤害.

3
00:00:09,320 --> 00:00:13,610
‫我们将通过覆盖一个名为take damage的虚方法来实现｡

4
00:00:13,610 --> 00:00:18,380
‫你可以在这个日志中看到, 当我射击这个角色时, 生命值一直下降到零,

5
00:00:18,380 --> 00:00:21,860
‫然后它停在零, 而不是变成负数｡

6
00:00:21,860 --> 00:00:23,780
‫让我们深入了解一下这是如何实现的｡

7
00:00:26,450 --> 00:00:33,050
‫因此, 虽然我们目前能够对我们在这里击中的演员造成伤害, 比如这个家伙,

8
00:00:33,380 --> 00:00:36,590
‫但我们实际上并没有受到伤害｡

9
00:00:36,590 --> 00:00:43,190
‫这就是上节课的虚拟方法的用武之地, 因为就像开始, play或者tic一样,

10
00:00:43,190 --> 00:00:46,080
‫我们希望能够对演员造成伤害｡

11
00:00:46,100 --> 00:00:50,690
‫幸运的是, 如果你看一下演员H,

12
00:00:50,690 --> 00:00:53,160
‫你会发现这里有一个取损伤虚拟方法.

13
00:00:53,180 --> 00:01:01,470
‫现在, 这也可以通过事件来完成, 您可能在注册事件之前已经看到过这种方式｡

14
00:01:01,490 --> 00:01:09,680
‫现在我要做的是一种不同的破坏方式, 我们实际上把破坏存储在参与者身上, 而不是存储在组件中｡

15
00:01:10,160 --> 00:01:15,950
‫一个简单的方法就是通过虚拟的方法来接受这种伤害｡

16
00:01:15,950 --> 00:01:18,620
‫这是我们要重写的虚方法｡

17
00:01:18,620 --> 00:01:25,210
‫我复制这个, 然后转到我们的演员,

18
00:01:25,250 --> 00:01:31,340
‫也就是射手角色, 会更快的去寻找射手角色H我想检查的是,

19
00:01:31,340 --> 00:01:35,480
‫演员H的位置.

20
00:01:35,720 --> 00:01:41,660
‫如果我们向上滚动, 应该可以看到我们在哪个部分｡

21
00:01:42,080 --> 00:01:51,200
‫我将向上滚动, 直到我发现无论我们是在公共场所还是他们去哪里, 我们都在公共部分｡

22
00:01:51,200 --> 00:01:54,530
‫所以这也应该放在公共部分｡

23
00:01:54,530 --> 00:02:00,200
‫所以我把它贴在tick下面,

24
00:02:00,440 --> 00:02:09,650
‫在shooter H中设置播放器输入组件, 我们把它粘贴进去, 就像我上节课说的,

25
00:02:09,650 --> 00:02:17,180
‫你可以用override来确保你确实覆盖了父函数的虚方法, 这里没有必要把virtual放在前面, 但我们还是要保留它.

26
00:02:17,180 --> 00:02:21,560
‫在这里, 您可以看到所有即将损坏的数据｡

27
00:02:21,560 --> 00:02:30,530
‫我们已经得到了损坏金额､ 损坏事件和造成损坏的控制者､ 煽动者和损坏原因｡

28
00:02:30,530 --> 00:02:34,250
‫所有我们从枪里传来的东西也在这里出现了｡

29
00:02:34,250 --> 00:02:35,150
‫所以这很好｡

30
00:02:35,150 --> 00:02:41,300
‫现在, 如果我们继续执行Control Shift, P创建实现或复制粘贴,

31
00:02:41,300 --> 00:02:43,820
‫然后我们就可以使实现遭受损坏.

32
00:02:43,820 --> 00:02:49,250
‫但首先要注意的是,

33
00:02:49,250 --> 00:02:58,580
‫每当我们重写某个东西的时候, 我们要考虑调用take damage的父类版本, 因为那里可能有一些实现需要运行｡

34
00:02:58,940 --> 00:03:00,140
‫这就是我们要做的｡

35
00:03:00,170 --> 00:03:01,070
‫我们一直都这样｡

36
00:03:01,070 --> 00:03:02,210
‫我们已经用技术做到了｡

37
00:03:02,210 --> 00:03:03,710
‫我们已经在“开始播放”中做到了这一点｡

38
00:03:03,710 --> 00:03:09,200
‫你可以看到我们在开始的时候总是很酷, 这是因为当我们覆盖一个方法时, 我们完全覆盖了它｡

39
00:03:09,200 --> 00:03:11,120
‫我们完全消除了这种行为｡

40
00:03:11,120 --> 00:03:17,630
‫所以, 如果我们真的想要这种行为, 我们通常会这样做, 那么我们应该总是从酷到超开始｡

41
00:03:17,630 --> 00:03:20,000
‫所以我们要做一个冷静的接受伤害｡

42
00:03:21,450 --> 00:03:23,580
‫那就要承担损失金额了｡

43
00:03:23,580 --> 00:03:25,760
‫所以这就是它变得有点乏味, 可悲的是｡

44
00:03:25,800 --> 00:03:27,870
‫我的自动完成工具不能为我们做这件事｡

45
00:03:27,870 --> 00:03:29,250
‫损坏事件｡

46
00:03:30,560 --> 00:03:32,660
‫那下一个是什么？

47
00:03:32,660 --> 00:03:34,970
‫我们有控制权｡

48
00:03:35,180 --> 00:03:37,550
‫所以事件的煽动者, 让我们只是复制｡

49
00:03:37,820 --> 00:03:42,380
‫然后我们有了破坏的原因, 也就是演员｡

50
00:03:43,160 --> 00:03:48,320
‫所有这些都被调用到take damage的父实现｡

51
00:03:48,560 --> 00:03:52,220
‫还有一点就是它有一个返回类型｡

52
00:03:52,220 --> 00:03:55,880
‫所以实际的损坏是应用的, 所以我们要做浮动｡

53
00:03:56,750 --> 00:04:01,460
‫所施加的伤害是获得伤害的返回值｡

54
00:04:01,460 --> 00:04:05,000
‫所以我们只需要保持在这里施加的伤害｡

55
00:04:05,270 --> 00:04:11,450
‫实际上, 这将与我们特定用例中的损害金额相同, 但不一定,

56
00:04:11,450 --> 00:04:14,690
‫因此我们将使用应用的损害金额｡

57
00:04:14,720 --> 00:04:21,000
‫接下来我们要做的是掌握我们实际拥有多少健康的信息｡

58
00:04:21,020 --> 00:04:24,980
‫现在我要用两个变量来做这个｡

59
00:04:25,010 --> 00:04:32,090
‫第一个是我将把这两个属性都设置为新属性, 因为我想让运行状况在检查器中可见, 至少现在是这样.

60
00:04:32,420 --> 00:04:37,220
‫第一个属性是最大生命值｡

61
00:04:37,220 --> 00:04:39,620
‫这是我们初始化的健康状况｡

62
00:04:39,620 --> 00:04:48,170
‫所以你的属性, 它将是一个编辑默认值, 因为它将在开始播放时使用｡

63
00:04:48,170 --> 00:04:53,120
‫所以在生效后改变最大生命值, 不会有任何影响.

64
00:04:53,120 --> 00:05:01,340
‫最大健康值, 我将在这里将最大健康值设置为100, 然后我们将在这里有一个其他属性, 正如我所说的,

65
00:05:01,340 --> 00:05:06,230
‫这将是一个新属性, 只是为了让我们能够检查它｡

66
00:05:06,230 --> 00:05:09,770
‫我会让它在任何地方都可见｡

67
00:05:10,690 --> 00:05:15,310
‫但不可编辑, 因为我们不想改变健康状况, 至少目前不想｡

68
00:05:15,520 --> 00:05:18,950
‫您可能希望将其用于调试目的, 但我不希望｡

69
00:05:18,970 --> 00:05:23,080
‫所以我们在这里和游戏中都要有健康｡

70
00:05:23,260 --> 00:05:27,250
‫我们要把它设置好, 这样健康｡

71
00:05:28,080 --> 00:05:31,060
‫等于最大生命值｡

72
00:05:31,080 --> 00:05:32,460
‫所以我们从产卵开始｡

73
00:05:32,460 --> 00:05:36,150
‫我们有我们的最大生命值, 然后我们可以开始减少它｡

74
00:05:36,780 --> 00:05:41,760
‫所以现在是时候让你来挑战一下降低角色的生命值了｡

75
00:05:41,760 --> 00:05:48,480
‫所以你要用这里的伤害而不是这里的其他选项｡

76
00:05:48,480 --> 00:05:52,710
‫所以我们有了射手角色, CP承受伤害｡

77
00:05:52,710 --> 00:05:57,450
‫我们已经得到了一个伤害值, 但是我们实际上想要的是从承受伤害中得到的伤害值,

78
00:05:57,450 --> 00:06:02,100
‫因为这个伤害值可以通过父进程中的一些过程来减少｡

79
00:06:02,550 --> 00:06:03,420
‫所以我们这样做｡

80
00:06:03,420 --> 00:06:10,410
‫为了简单起见, 我们降低了健康值, 并记录了结果, 这样你就可以检查,

81
00:06:10,410 --> 00:06:16,050
‫当你对着那只眼睛射击时, 他的健康值在下降, 然后测试一下｡

82
00:06:16,050 --> 00:06:17,820
‫所以暂停视频, 开始吧｡

83
00:06:18,060 --> 00:06:19,200
‫好的欢迎回来｡

84
00:06:19,200 --> 00:06:20,550
‫所以我们来试试吧｡

85
00:06:20,550 --> 00:06:27,930
‫所以健康, 我们基本上是想通过所施加的伤害来减少它｡

86
00:06:29,260 --> 00:06:30,820
‫但这就足够了吗？

87
00:06:30,850 --> 00:06:37,150
‫那么, 如果我们的伤害大于我们剩下的生命值呢？

88
00:06:37,330 --> 00:06:43,830
‫在这种情况下, 我们可能希望伤害值就是这个生命值｡

89
00:06:43,840 --> 00:06:47,860
‫所以我们可以这么做, 我们可以说损害是适用的｡

90
00:06:48,770 --> 00:06:54,620
‫应等于运行状况的f数学点min｡

91
00:06:55,610 --> 00:06:57,870
‫并施加损害｡

92
00:06:57,890 --> 00:07:01,010
‫这就是我们要应用的破坏力｡

93
00:07:01,130 --> 00:07:06,260
‫所以我们要我实际上要把它重命名, 而不是叫它已应用损害｡

94
00:07:06,380 --> 00:07:10,040
‫我打算把它叫做损害赔偿申请｡

95
00:07:10,780 --> 00:07:13,480
‫损坏适用｡

96
00:07:13,900 --> 00:07:18,490
‫所以在这里重新命名, 然后应用损害｡

97
00:07:18,520 --> 00:07:21,450
‫我们要以健康减去伤害来申请｡

98
00:07:21,460 --> 00:07:22,180
‫有道理｡

99
00:07:22,180 --> 00:07:25,270
‫最糟糕的是健康｡

100
00:07:25,270 --> 00:07:28,270
‫所以我们的健康状况会降到零｡

101
00:07:28,840 --> 00:07:33,070
‫记住, 我们应该归还我们实际使用的损坏｡

102
00:07:33,070 --> 00:07:41,530
‫因此, 我们将应用退货损坏, 现在已经应用了退货损坏, 最后我们希望在此处的末尾有一个UII日志, 它只是一个警告,

103
00:07:41,530 --> 00:07:45,430
‫以便我们可以看到它｡

104
00:07:46,150 --> 00:07:56,020
‫我希望这是这里剩下的健康值, 它是一个百分比F到或者小写的百分比F来表示浮点数｡

105
00:07:56,230 --> 00:08:03,070
‫然后, 我们可以在那里弹出健康状态, 然后继续单击构建｡

106
00:08:04,890 --> 00:08:05,220
‫现在就去

107
00:08:05,250 --> 00:08:08,460
‫我的是在修复了一个缺失的分号后编译的｡

108
00:08:08,460 --> 00:08:15,840
‫在这里, 让我们去, 并确保我们有一个窗口开发工具, 我们希望在这里的输出日志,

109
00:08:15,840 --> 00:08:18,060
‫以便我们可以看到该日志消息｡

110
00:08:18,060 --> 00:08:25,710
‫我将继续按播放键, 如果我开枪, 我将尝试向这个角色开枪｡

111
00:08:25,710 --> 00:08:26,170
‫你去那里｡

112
00:08:26,190 --> 00:08:30,210
‫1976年的健康状况, 等等, 等等, 等等, 一直降到零｡

113
00:08:30,210 --> 00:08:35,490
‫如果我继续拍摄, 我们不会低于0, 因为eff数学点最小值｡

114
00:08:35,490 --> 00:08:38,370
‫所以这告诉我我们的健康设置是正确的｡

115
00:08:38,370 --> 00:08:42,180
‫这只是另一种方式, 而不是在组件中进行｡

116
00:08:42,180 --> 00:08:46,680
‫你可以在演员内部做, 以及这种方法的一些优点和缺点｡

117
00:08:46,710 --> 00:08:52,410
‫最后, 您可能希望将其剥离到单独的组件中, 以便可以在不同的元素上重用它｡

118
00:08:52,410 --> 00:09:00,120
‫但这只是另一种方式, 就像我现在说的, 因为这个角色在我们把他打到零血后看起来并不特别死｡

119
00:09:00,120 --> 00:09:02,910
‫我们需要修复动画来支持它｡

120
00:09:02,910 --> 00:09:06,180
‫我们下节课会讲到, 到时见.

