﻿1
00:00:04,370 --> 00:00:05,330
‫你好, 欢迎｡

2
00:00:05,330 --> 00:00:10,250
‫在这节课中, 我们将通过勾选复选框来让搬运工进行搬运.

3
00:00:10,250 --> 00:00:14,780
‫我们将使它能够以恒定的速度移动和移动｡

4
00:00:14,780 --> 00:00:19,460
‫这次我们将在内部使用一些库函数｡

5
00:00:19,460 --> 00:00:20,150
‫不真实｡

6
00:00:20,150 --> 00:00:24,920
‫因此, 它将测试我们对头文件和包含文件的所有知识｡

7
00:00:24,920 --> 00:00:26,780
‫让我们深入了解一下它是如何工作的｡

8
00:00:27,380 --> 00:00:34,670
‫所以我希望这个移动器的工作方式是, 在一定的秒数内,

9
00:00:34,670 --> 00:00:38,540
‫从开始的位置平稳地移动到目标偏移量｡

10
00:00:38,540 --> 00:00:43,640
‫因此, 我们需要配置的方法是在头文件中添加一些新属性｡

11
00:00:43,640 --> 00:00:49,010
‫我们先在文件头中添加一个私有节,

12
00:00:49,010 --> 00:00:59,060
‫然后添加一个可在任意位置编辑得新属性, 该属性将定义偏移量, 即移动偏移量.

13
00:00:59,060 --> 00:01:03,650
‫因此, 当激活时, 这个移动器应该移动多远｡

14
00:01:03,710 --> 00:01:09,560
‫我们将使用一个F向量, 我们将称之为移动偏移, 就像这样,

15
00:01:09,560 --> 00:01:11,960
‫我不会给予它一个默认值｡

16
00:01:11,990 --> 00:01:13,610
‫我们将在编辑器中执行此操作｡

17
00:01:13,880 --> 00:01:19,370
‫然后, 我将创建另一个新属性, 该属性也将在任何位置进行编辑,

18
00:01:19,370 --> 00:01:24,050
‫该属性将是移动到目标所需的时间｡

19
00:01:24,050 --> 00:01:33,410
‫我们将它设为浮点数, 即移动时间, 我将它设为默认值, 比如4秒｡

20
00:01:33,440 --> 00:01:39,740
‫现在, 我还想在这里放一个东西,

21
00:01:39,740 --> 00:01:47,060
‫这是一个布尔值, 它允许我们激活移动器, 当我们激活这个布尔值时, 它会向下移动｡

22
00:01:47,060 --> 00:01:49,790
‫因此, 让我们再次创建另一个U属性｡

23
00:01:49,790 --> 00:01:57,560
‫在任何地方编辑, 这样我们就可以在玩的时候编辑它, 它是一个布尔值, 表示应该移动,

24
00:01:57,740 --> 00:02:01,100
‫默认情况下它被设置为false｡

25
00:02:01,100 --> 00:02:08,750
‫所以当我们在编辑器中勾选它时, 当我们播放时, 它会移动到它的目标移动偏移｡

26
00:02:08,750 --> 00:02:13,340
‫之前, 当我们有一个移动组件时, 我们手动执行所有步骤｡

27
00:02:13,340 --> 00:02:18,050
‫但我想向大家展示的是, 它实际上内置了一些功能, 可以完成我们需要的大量计算｡

28
00:02:18,050 --> 00:02:24,830
‫它内置在Unreal中, 还有一个函数叫做V interpret constant.

29
00:02:24,830 --> 00:02:28,460
‫有趣的是, 我们来看看评论｡

30
00:02:28,460 --> 00:02:36,740
‫因此, 使用恒定步长将向量从当前向量内插到目标向量｡

31
00:02:36,740 --> 00:02:43,940
‫这意味着, 随着时间的推移, 我们将以一定的速度从当前位置移动到目标位置, 而且会不断地这样做,

32
00:02:43,940 --> 00:02:47,330
‫这听起来正是我们想要的｡

33
00:02:47,330 --> 00:02:52,430
‫我们希望以恒定速度从当前位置移动到目标偏移位置｡

34
00:02:52,640 --> 00:02:59,990
‫现在, 如果你看一下这个函数的语法, 你会发现它的返回类型是F向量｡

35
00:02:59,990 --> 00:03:03,590
‫这就是插值的新位置｡

36
00:03:03,770 --> 00:03:06,620
‫然后它有两个输入｡

37
00:03:06,620 --> 00:03:14,360
‫我们有一个当前的F矢量, 不用担心其他符号的影响, 现在重要的是,

38
00:03:14,360 --> 00:03:21,950
‫它是一个当前的矢量, 然后是我们希望它最终到达的目标｡

39
00:03:22,190 --> 00:03:25,220
‫然后它就有了时间差｡

40
00:03:25,220 --> 00:03:32,180
‫因此, 它使用此来使运动帧速率独立于插值速度｡

41
00:03:32,180 --> 00:03:37,220
‫那么我们应该以多快的速度从当前位置移动到目标位置？

42
00:03:37,220 --> 00:03:45,530
‫现在你会注意到, 在文档中有一个包含的部分, 它告诉你, 为了使用这个函数,

43
00:03:45,530 --> 00:03:52,280
‫在C++文件中, 需要包含哪一行｡

44
00:03:52,280 --> 00:04:02,390
‫正如我们在上一个视频中看到的, include行允许我们从这个特定文件中复制定义｡

45
00:04:02,390 --> 00:04:05,990
‫其中一个定义就是这个函数的定义｡

46
00:04:05,990 --> 00:04:15,170
‫所以我们可以用这个V来解释常数, 这个函数前面的V基本上意味着它在向量上做插值｡

47
00:04:15,170 --> 00:04:22,430
‫这就是为什么它被称为V解释, 而不是其他插值函数, 也在这个库文件中提供｡

48
00:04:22,430 --> 00:04:24,140
‫让我们来看看如何使用它｡

49
00:04:24,140 --> 00:04:29,900
‫首先, 我们将从文档中复制include行, 然后进入CP的移动,

50
00:04:29,900 --> 00:04:34,580
‫我们希望在tick组件的主体中实现它｡

51
00:04:34,580 --> 00:04:38,660
‫但它们包括我们不包括在体内的蜱成分｡

52
00:04:38,660 --> 00:04:41,900
‫我们要做的是把文件的顶部都包括进去｡

53
00:04:42,050 --> 00:04:47,660
‫这就是我要把我的放在这里我把我的放在包含动子H之后.

54
00:04:47,660 --> 00:04:53,240
‫所以我们要输入并包括数学, 正斜杠, 非真实数学工具｡

55
00:04:53,660 --> 00:04:59,930
‫现在我们可以在tick组件中使用这个函数.

56
00:04:59,930 --> 00:05:03,550
‫我们先把已经写好的代码去掉吧｡

57
00:05:03,560 --> 00:05:03,800
‫计算｡

58
00:05:04,020 --> 00:05:09,300
‫因为我们用它来理解如何调用其他参与者的函数｡

59
00:05:10,140 --> 00:05:17,190
‫我们需要做的是, 如果你向上滚动, 你可以看到它的名字是, F质量, Colon, Colon, V截距,

60
00:05:17,190 --> 00:05:18,770
‫常数2｡

61
00:05:18,780 --> 00:05:30,180
‫所以我们在F的数学类里面做了冒号运算符, 它把所有的数学工具组织在一起｡

62
00:05:30,180 --> 00:05:33,300
‫所以我们要做F数学题｡

63
00:05:33,330 --> 00:05:34,500
‫结肠｡

64
00:05:35,340 --> 00:05:41,460
‫在这里你可以看到一堆自动完成功能, 这些功能是针对头文件中包含的不同数学函数的,

65
00:05:41,460 --> 00:05:44,760
‫这些头文件也是我们刚刚包含在这个文件中的｡

66
00:05:44,760 --> 00:05:48,900
‫所以你们可以看一下, 看到这里有什么有趣的东西, 我可以看到一堆插值,

67
00:05:48,900 --> 00:05:56,580
‫圆形插值, 等等｡

68
00:05:56,580 --> 00:06:04,080
‫但我们希望将V解释常量设置为, 可以单击tab键完成此操作, 然后打开一些括号,

69
00:06:04,080 --> 00:06:09,180
‫我们可以看到需要在当前､ 目标增量时间和截取速度中传递的参数｡

70
00:06:09,180 --> 00:06:13,920
‫让我们开始创建一些变量来保存其中的一些｡

71
00:06:14,250 --> 00:06:23,370
‫首先, 我们需要一个F向量, 它是我们的当前位置, 我们现在还不需要设置它｡

72
00:06:23,370 --> 00:06:32,340
‫然后我们会得到目标位置的F矢量, 然后我们会得到速度的浮点数｡

73
00:06:33,090 --> 00:06:38,640
‫我们要分别计算每一个, 来找出如何让这个运动发生｡

74
00:06:38,640 --> 00:06:42,450
‫因此, 目前的位置将相对简单｡

75
00:06:42,450 --> 00:06:46,440
‫我们需要得到拥有参与者的当前位置｡

76
00:06:46,440 --> 00:06:47,190
‫那我们该怎么做呢？

77
00:06:47,190 --> 00:06:50,370
‫让我们用等号替换这个分号｡

78
00:06:50,400 --> 00:06:54,750
‫然后我们将执行一个get owner的括号对｡

79
00:06:54,930 --> 00:06:56,370
‫然后我们要做一个箭头｡

80
00:06:56,370 --> 00:07:08,520
‫所以我们要在拥有角色的角色上调用一个函数, 我们要获取角色位置, 然后用一对括号和一个分号结束它.

81
00:07:08,520 --> 00:07:12,570
‫这样我们就得到了拥有者的当前位置｡

82
00:07:12,750 --> 00:07:15,000
‫现在, 我们的目标位置呢？

83
00:07:15,000 --> 00:07:21,000
‫我们知道有一个属性叫做移动偏移量, 所以这里会用到它｡

84
00:07:21,000 --> 00:07:26,640
‫但我们需要将原始位置添加到该移动偏移中｡

85
00:07:26,820 --> 00:07:32,820
‫因此, 我们需要捕捉比金游戏中的原始位置｡

86
00:07:32,820 --> 00:07:34,860
‫所以我们需要一个变量来存储它｡

87
00:07:34,860 --> 00:07:38,820
‫现在我们来看一下移动器H, 它在任何地方都不是编辑｡

88
00:07:38,820 --> 00:07:40,460
‫一旦我把它放在我们的U｡

89
00:07:40,470 --> 00:07:46,590
‫属性, 它将是一个F向量, 称为原始位置｡

90
00:07:47,220 --> 00:07:49,020
‫这里不设置任何值｡

91
00:07:49,020 --> 00:07:54,480
‫然后我们进入到我们的移动器CP, 开始播放, 去掉这条注释行,

92
00:07:54,480 --> 00:08:06,180
‫写上我们自己的代码, 也就是说, 原始位置等于, 得到所有者, 括号, 箭头, 得到参与者位置,

93
00:08:06,180 --> 00:08:08,790
‫就像这样.

94
00:08:08,790 --> 00:08:13,260
‫现在我们已经捕获了原始位置并开始播放, 我们可以在TTIC中使用它｡

95
00:08:13,260 --> 00:08:21,870
‫所以我们进入Tick, 我们把目标位置设置为等于原始位置加上移动偏移｡

96
00:08:21,870 --> 00:08:25,560
‫这就是我们的目标位置和速度｡

97
00:08:25,560 --> 00:08:32,610
‫这基本上就是我们需要移动的距离除以我们需要移动的时间｡

98
00:08:32,610 --> 00:08:38,820
‫所以如果我们有一个目标位置和一个原始位置, 我们需要找到两者之间的距离,

99
00:08:38,820 --> 00:08:45,270
‫我们可以用F向量, 结肠, 结肠距离来做｡

100
00:08:45,270 --> 00:08:54,750
‫然后, 我们将原始位置和目标位置传递给括号｡

101
00:08:54,930 --> 00:08:58,260
‫这就给出了这两个矢量之间的距离｡

102
00:08:58,260 --> 00:09:05,400
‫然后我们将其除以我们反复得到的移动时间｡

103
00:09:05,730 --> 00:09:08,970
‫这就给出了我们应该移动的速度｡

104
00:09:09,210 --> 00:09:13,920
‫现在我们可以用这些作为参数, 使V截距也保持恒定｡

105
00:09:13,920 --> 00:09:20,730
‫首先, 我们需要给予出当前位置, 然后是目标位置｡

106
00:09:21,150 --> 00:09:27,210
‫然后我们将告诉它Delta时间, 它已经是tick组件中的一个参数｡

107
00:09:27,220 --> 00:09:31,890
‫所以我们只需要把它传递过去, 然后我们就得到了截距速度｡

108
00:09:31,890 --> 00:09:40,410
‫我们只需要传递速度, 就像这样, 在行尾加一个分号, 这实际上就是新的位置｡

109
00:09:40,410 --> 00:09:50,130
‫我们把它存储到一个新的变量F向量中, 叫做新位置, 等于这个cool｡

110
00:09:50,430 --> 00:09:57,960
‫现在我们需要对这个新位置做些什么因为仅仅计算它是没有用的, 我们确实需要把演员移到新的位置.

111
00:09:58,290 --> 00:09:59,370
‫这就是我们要做的｡

112
00:09:59,400 --> 00:10:02,280
‫我们将在get owner上调用它｡

113
00:10:02,280 --> 00:10:03,740
‫所以我们做一个得到自己的｡

114
00:10:04,730 --> 00:10:06,640
‫圆括号箭头｡

115
00:10:06,650 --> 00:10:17,780
‫然后我们要设置演员位置我们要像这样传入新的位置在行尾有一个分号.

116
00:10:17,960 --> 00:10:20,990
‫让我们继续编译它, 看看它是否有效｡

117
00:10:20,990 --> 00:10:25,280
‫如果我们进入地牢,

118
00:10:25,280 --> 00:10:35,480
‫选择要移动的墙, 你现在可以看到移动器组件有一个移动偏移量, 我想在Z方向上做这个, 我想做-600｡

119
00:10:35,960 --> 00:10:38,930
‫然后是移动时间, 4秒应该就可以了｡

120
00:10:38,930 --> 00:10:44,060
‫我们先保存它, 然后点击播放, 看看它是否会移动.

121
00:10:44,060 --> 00:10:51,350
‫在输出日志中有一个错误, 说演员的移动性被设置为静态, 这就是为什么它不能移动｡

122
00:10:51,350 --> 00:11:01,370
‫因此, 如果我们再次选择参与者并查看其移动性设置, 您实际上可以看到静态网格组件的移动性设置｡

123
00:11:01,370 --> 00:11:03,920
‫因此, 选择静态网格组件, 然后查看移动性｡

124
00:11:03,920 --> 00:11:06,740
‫您可以看到它被设置为静态, 这基本上意味着它不允许移动｡

125
00:11:06,890 --> 00:11:11,900
‫让我们把它切换到可移动的, 因为我们确实希望它移动, 然后让我们继续, 点击播放｡

126
00:11:11,930 --> 00:11:18,200
‫现在你可以在黑暗中看到墙正在倒塌, 这很完美｡

127
00:11:18,200 --> 00:11:23,540
‫我确实认为在我们的场景中有一个移动器在这个柱子上, 它也在试图移动｡

128
00:11:23,540 --> 00:11:24,680
‫所以我们还是别这么做了｡

129
00:11:24,680 --> 00:11:32,510
‫让我们删除添加到这里的mover组件, 它只是为了测试, 它应该不会在输出日志中显示错误｡

130
00:11:32,510 --> 00:11:38,450
‫如果我们现在按播放键, 我们就能让那堵墙下降到目标位置｡

131
00:11:38,450 --> 00:11:42,890
‫所以让我们挑战一下, 用我们创建的布尔值来移动它｡

132
00:11:42,890 --> 00:11:52,730
‫所以你要把代码包装在一个合适的if语句和合适的代码中, 这样它只在布尔值为真时才移动平台｡

133
00:11:53,000 --> 00:11:58,520
‫然后你要重新编译代码, 用F8键播放和弹出, 然后改变布尔值,

134
00:11:58,520 --> 00:12:02,420
‫当你检查布尔值时, 观察它是否移动｡

135
00:12:02,420 --> 00:12:04,400
‫所以暂停视频, 开始吧｡

136
00:12:07,410 --> 00:12:07,740
‫好吧, 我会的

137
00:12:07,770 --> 00:12:08,510
‫欢迎回来｡

138
00:12:08,520 --> 00:12:15,390
‫我们用一个if语句来包装tick组件, 不是super, 而是我们要做的其他事情.

139
00:12:15,390 --> 00:12:24,450
‫如果要移动, 打开括号, 把所有的代码都移动到一个层次, 因为我们在括号里,

140
00:12:24,450 --> 00:12:29,610
‫我们想证明这只在if语句中执行.

141
00:12:29,610 --> 00:12:37,230
‫让我们很容易地读取控制所有的f 11编译, 然后我们应该能够去点击播放和点击F 8弹出,

142
00:12:37,230 --> 00:12:42,300
‫如果我们有我们的鼠标捕获｡

143
00:12:42,660 --> 00:12:49,680
‫然后, 我们将查看离群值, 我们将尝试找到墙,

144
00:12:49,680 --> 00:12:56,340
‫或者我们可以在场景中单击, 然后选择移动组件并检查是否应移动, 然后,

145
00:12:56,340 --> 00:13:00,540
‫墙开始移动｡

146
00:13:00,570 --> 00:13:01,350
‫好东西｡

147
00:13:01,350 --> 00:13:03,570
‫我们下节课再见｡

