﻿1
00:00:03,970 --> 00:00:05,720
‫你好, 欢迎回来｡

2
00:00:05,740 --> 00:00:09,340
‫在这段视频中, 我们将讨论如何提高坦克的速度｡

3
00:00:09,340 --> 00:00:13,030
‫我们想要精确控制坦克的移动速度｡

4
00:00:13,030 --> 00:00:18,940
‫现在我们只是把这个增量位置向量传递给add act, 一个局部偏移量,

5
00:00:18,940 --> 00:00:22,450
‫我们无法控制坦克的移动速度｡

6
00:00:22,450 --> 00:00:24,310
‫它实际上移动得很慢｡

7
00:00:24,310 --> 00:00:29,200
‫所以我们要做一个速度变量, 用来控制这个速度｡

8
00:00:29,200 --> 00:00:37,360
‫我们还将考虑游戏的帧速率, 因为我们的游戏会在帧之间改变帧速率｡

9
00:00:37,360 --> 00:00:40,360
‫我们实际上没有得到一致的运动｡

10
00:00:40,360 --> 00:00:45,460
‫因此, 为了考虑帧速率, 我们将讨论一种称为Delta Time的东西｡

11
00:00:45,730 --> 00:00:51,220
‫现在我们在编辑器中, 如果我点击播放, 开始移动坦克,

12
00:00:51,220 --> 00:00:53,320
‫你不一定能注意到.

13
00:00:53,320 --> 00:00:57,640
‫但我们的坦克在帧与帧之间的移动速度并不一致｡

14
00:00:57,640 --> 00:01:04,210
‫原因是因为我们的帧速率改变了, 在视口的左上角有一个小下拉菜单｡

15
00:01:04,210 --> 00:01:10,810
‫如果我单击该选项, 旁边会出现一个复选框, 显示DPS PES表示每秒帧数｡

16
00:01:10,810 --> 00:01:15,940
‫如果我选中这个, 那么在右上角我会看到每秒的帧数｡

17
00:01:15,940 --> 00:01:20,740
‫再往下一点, 从上一帧开始已经过了多少毫秒？

18
00:01:20,740 --> 00:01:23,560
‫并且这些值在帧与帧之间变化｡

19
00:01:23,560 --> 00:01:29,170
‫如果我点击播放, 你可能会错过它, 但帧速率下降, 然后回来了,

20
00:01:29,170 --> 00:01:32,920
‫因为在游戏的开始阶段, 很多事情正在发生｡

21
00:01:32,920 --> 00:01:39,820
‫所有的演员都在调用他们的开始播放功能, 并有一些幕后设置的世界｡

22
00:01:39,820 --> 00:01:49,060
‫现在, 如果我开始玩这个游戏, 我得到的120个应用程序会从一帧到另一帧变化, 尽管它徘徊在120个左右｡

23
00:01:49,060 --> 00:01:55,150
‫因此, 这导致不一致移动的原因是, 随着帧速率下降,

24
00:01:55,180 --> 00:01:57,340
‫这些节拍更新被调用的频率降低｡

25
00:01:57,340 --> 00:02:02,860
‫如果我们每帧都以相同的量移动这个坦克, 那么我们就依赖于帧速率来保持一致,

26
00:02:02,860 --> 00:02:06,040
‫以获得一致的移动｡

27
00:02:06,040 --> 00:02:11,860
‫而当游戏变得更加复杂时, 帧速率的变化会变得越来越糟｡

28
00:02:11,860 --> 00:02:17,320
‫所以我们需要确保我们通过使用一种叫做Delta Time的东西来调整｡

29
00:02:17,710 --> 00:02:20,020
‫那么, 这个神秘的三角洲时间是什么？

30
00:02:20,020 --> 00:02:25,960
‫好吧, 假设我们有一个时间线, 从0秒开始, 随着时间的推移而增加｡

31
00:02:25,960 --> 00:02:31,240
‫现在, 随着时间的推移, 这意味着tick函数正在被调用｡

32
00:02:31,240 --> 00:02:35,830
‫但请注意, tick函数并不是非常一致｡

33
00:02:35,830 --> 00:02:40,480
‫有时候跟注的速度很快, 有时候跟注的频率较低｡

34
00:02:40,630 --> 00:02:46,840
‫这是因为您的计算机必须逐帧进行计算, 有时这些计算会占用您计算机的更多资源,

35
00:02:46,840 --> 00:02:52,720
‫从而降低帧速率｡

36
00:02:52,750 --> 00:03:00,310
‫现在, tick函数中的delta时间变量是从上一帧开始经过的时间量｡

37
00:03:00,310 --> 00:03:02,590
‫所以这里它可能是0｡  1秒｡

38
00:03:02,620 --> 00:03:07,270
‫这实际上取决于CPU的使用情况及其变化方式｡

39
00:03:07,270 --> 00:03:12,490
‫因此, 随着CPU使用率的变化, 增量时间也会发生变化｡

40
00:03:12,490 --> 00:03:18,100
‫这意味着当我们每秒有更多的帧时, 我们有更多的函数调用｡

41
00:03:18,100 --> 00:03:24,910
‫现在, 如果我们更频繁地调用add actor local offset,

42
00:03:24,910 --> 00:03:27,820
‫那么我们会看到池塘移动得更快, 并且它不会有一致的移动速率｡

43
00:03:27,820 --> 00:03:31,990
‫所以解决方案是按Delta时间缩放运动｡

44
00:03:31,990 --> 00:03:38,380
‫所以如果Delta时间为0｡  1,

45
00:03:38,380 --> 00:03:46,030
‫我们想以每秒10厘米的速度移动我们的池塘, 以0为缩放比例｡ 1秒为我们提供了帧更新时间为0所需的精确移动量｡

46
00:03:46,030 --> 00:03:46,030
‫1秒｡

47
00:03:46,060 --> 00:03:52,930
‫现在考虑这里的部分, 我们有一个较小的时间增量, 这意味着TIC被调用的频率更高｡

48
00:03:52,930 --> 00:03:56,260
‫假设这里的delta时间为0｡  0 1秒｡

49
00:03:56,260 --> 00:03:59,530
‫所以TIC在这里被调用的次数是原来的十倍｡

50
00:03:59,530 --> 00:04:06,040
‫我们可以简单地将运动缩放0｡  01, 这样我们将以每秒10厘米的速度移动池塘,

51
00:04:06,040 --> 00:04:10,960
‫乘以0｡ 0 1秒｡

52
00:04:10,960 --> 00:04:17,080
‫因此, 由于TIC被调用得更频繁, 我们将池移动了一小部分｡

53
00:04:17,080 --> 00:04:24,520
‫这样做可以确保池塘以一致的方式移动, 而不受帧速率变化的影响｡

54
00:04:24,670 --> 00:04:30,460
‫回到VSE代码, 让我们考虑一下如何处理这个问题｡

55
00:04:30,490 --> 00:04:39,190
‫我们有一个delta位置向量, 我们把它的x设为value, 但是我们知道我们想用Delta时间来缩放value｡

56
00:04:39,280 --> 00:04:50,800
‫我在这里做一点说明, X等于价值乘以时间差, 意思是我们要用时间差来衡量价值｡

57
00:04:50,800 --> 00:04:56,890
‫这样做后, 我们会使值非常小, 因为Delta时间本身是一个非常小的值,

58
00:04:56,890 --> 00:05:00,400
‫尤其是在帧速率非常高的情况下｡

59
00:05:00,430 --> 00:05:02,770
‫所以我们还需要把它放大一些｡

60
00:05:02,990 --> 00:05:11,110
‫或者是一种速度变量, 我们可以决定这个值应该是多少, 以便控制坦克的速度｡

61
00:05:11,120 --> 00:05:22,340
‫这里有一点伪代码来指导我们, 现在我们只需要通过创建速度值并找出如何获得该增量时间值来实现这一点｡

62
00:05:22,370 --> 00:05:27,440
‫我们来讨论一下如何通过移动函数访问Delta时间｡

63
00:05:27,440 --> 00:05:31,790
‫现在, 虚幻引擎有多种方法来获得Delta时间｡

64
00:05:32,150 --> 00:05:38,780
‫事实上, 如果你看一下我们基于Delta的tick函数, 时间是一个浮点输入参数｡

65
00:05:38,780 --> 00:05:45,140
‫所以如果我们在tick函数中工作, 我们已经可以访问Delta时间, 但是在tank DHCP中,

66
00:05:45,170 --> 00:05:50,900
‫我们的move函数没有这个输入参数, 但是虚幻引擎有它的方式｡

67
00:05:50,900 --> 00:05:59,360
‫一种方法是访问一个名为get world delta seconds的函数, 它存在于一个名为U gameplay statics的类中｡

68
00:05:59,360 --> 00:06:06,830
‫顾名思义, 你的游戏玩静态有很多静态功能, 协助编程游戏｡

69
00:06:06,860 --> 00:06:10,010
‫Get World Delta seconds返回增量时间｡

70
00:06:10,010 --> 00:06:11,600
‫现在它有一个输入参数｡

71
00:06:11,600 --> 00:06:14,900
‫在这里, 它采用了一个世界上下文对象｡

72
00:06:14,900 --> 00:06:16,850
‫你会在虚幻引擎中看到很多｡

73
00:06:16,880 --> 00:06:20,930
‫很多静态函数都需要一个全局上下文对象｡

74
00:06:21,230 --> 00:06:24,800
‫世界是你世界类型的对象｡

75
00:06:24,860 --> 00:06:27,260
‫它是我们游戏的顶级对象｡

76
00:06:27,260 --> 00:06:32,870
‫它表示包含游戏中所有相关对象的地图｡

77
00:06:32,870 --> 00:06:38,420
‫现在静态函数, 比如get world delta seconds, 不知道我们在哪个世界｡

78
00:06:38,450 --> 00:06:45,200
‫我们需要告诉这个函数我们在哪一个世界, 这样它就可以访问那个世界, 得到时间增量值｡

79
00:06:45,230 --> 00:06:52,430
‫现在, 为了告诉它我们在哪个世界, 我们可以传入一个指针, 指向一个存在于那个世界的对象｡

80
00:06:52,430 --> 00:06:57,680
‫当我们在坦克课上学习的时候, 我们可以传入关键词this｡

81
00:06:57,710 --> 00:07:03,440
‫这是一个关键词, 我们可以在C++中的任何类中使用｡

82
00:07:03,440 --> 00:07:10,370
‫这个关键字是一个指针, 指向我们正在处理的任何特定对象的实例.

83
00:07:10,370 --> 00:07:16,220
‫如果我们在坦克类中工作, 这是一个指向坦克的指针｡

84
00:07:16,220 --> 00:07:26,570
‫因此, 需要世界上下文对象的函数通常可以将其作为输入参数接收, 因为我们正在使用的坦克存在于正确的世界中｡

85
00:07:26,570 --> 00:07:32,480
‫所以get world delta seconds就能知道它在哪个世界, 并能检索到合适的delta｡

86
00:07:32,480 --> 00:07:34,280
‫该去那个世界了｡

87
00:07:34,280 --> 00:07:39,860
‫所以如果我们在类中调用get world delta seconds, 我们将把它作为world

88
00:07:39,860 --> 00:07:41,690
‫context对象传入.

89
00:07:42,410 --> 00:07:46,850
‫所以你现在有所有的工具, 你需要控制坦克的速度｡

90
00:07:46,880 --> 00:07:54,320
‫所以你要做的就是创建一个速度变量, 使它成为一个浮点数, 然后把它放在tank类的私有区域中.

91
00:07:54,500 --> 00:07:59,750
‫现在将其公开到蓝图中,

92
00:07:59,750 --> 00:08:07,480
‫以便在开发过程中对其进行调整, 这意味着您将为它给予一个you属性, 并使用与您希望的公开级别相对应的适当的you属性说明符｡

93
00:08:07,490 --> 00:08:12,800
‫现在在MOV函数中, 我们有一段伪代码, 它是作为注释放入的｡

94
00:08:12,800 --> 00:08:14,450
‫以此为鉴｡

95
00:08:14,450 --> 00:08:17,900
‫你要得到delta位置, F矢量和比例｡

96
00:08:17,900 --> 00:08:19,880
‫这是X乘以Δ时间｡

97
00:08:19,880 --> 00:08:24,050
‫我们刚刚看到了如何使用U游戏静态来访问delta时间｡

98
00:08:24,050 --> 00:08:27,620
‫你还要用速度变量来缩放X｡

99
00:08:27,620 --> 00:08:35,240
‫现在, 因为我们在游戏静态中使用了一个函数, 所以您需要包含游戏静态的头文件｡

100
00:08:35,240 --> 00:08:42,950
‫现在, 我已经多次向您展示了如何使用unreal引擎文档来查找特定类的include｡

101
00:08:42,950 --> 00:08:49,400
‫因此, 我将挑战你在虚幻引擎文档中搜索你的游戏静态信息, 并找到那个头文件｡

102
00:08:49,400 --> 00:08:54,290
‫如果你找不到它, 那就在这个视频的资源中找到链接, 它会给予你游戏静态的文档,

103
00:08:54,290 --> 00:08:57,920
‫但试着自己找到它｡

104
00:08:57,920 --> 00:09:01,760
‫先暂停视频, 现在控制坦克速度｡

105
00:09:04,530 --> 00:09:04,890
‫好吧, 我会的

106
00:09:04,890 --> 00:09:11,460
‫所以我有伪代码来指导我, 我需要通过增量时间和速度来缩放值｡

107
00:09:11,490 --> 00:09:14,130
‫首先我要创建速度变量｡

108
00:09:14,130 --> 00:09:15,870
‫现在回到h舱｡

109
00:09:15,870 --> 00:09:17,910
‫我可以在这里放置速度变量｡

110
00:09:17,910 --> 00:09:26,730
‫然而, 如果你还记得, 在之前的一节课的练习中, 我在“基池”课程中添加了一个名为“速度”的浮子｡

111
00:09:26,760 --> 00:09:29,730
‫现在我不需要变速箱了｡

112
00:09:29,760 --> 00:09:33,060
‫这只是练习, 所以我真的不需要它｡

113
00:09:33,060 --> 00:09:38,790
‫事实上, 我不需要我创建的其他30个二来演示属性说明符｡

114
00:09:38,790 --> 00:09:43,590
‫我将突出显示所有这些内容, 并将其从基本池塘类中删除｡

115
00:09:43,590 --> 00:09:44,910
‫我不想要了｡

116
00:09:44,910 --> 00:09:46,430
‫所以他们走了｡

117
00:09:46,440 --> 00:09:52,590
‫现在, 你可能还记得, 我在池塘设计图中引用了速度变量｡

118
00:09:52,740 --> 00:09:54,990
‫所以我要打开BP池

119
00:09:54,990 --> 00:09:59,250
‫在事件图中, 有我引用的速度变量｡

120
00:09:59,250 --> 00:10:06,720
‫因为我不再需要这个了, 我将继续删除这些节点, 编译并保存我的BP池｡

121
00:10:07,020 --> 00:10:07,420
‫好吧, 我会的

122
00:10:07,440 --> 00:10:12,750
‫在清理完所有这些之后, 我将回到坦克中添加我的速度变量｡

123
00:10:12,750 --> 00:10:15,660
‫这个会放在私人区域｡

124
00:10:15,660 --> 00:10:21,420
‫我会把它加到move函数上面, 它是一个浮点数, 叫做speed.

125
00:10:21,420 --> 00:10:24,270
‫现在我要给予它一个初始值｡

126
00:10:24,270 --> 00:10:27,480
‫我想我会试试200华氏度, 看看效果如何｡

127
00:10:27,480 --> 00:10:34,020
‫但由于我希望在开发过程中能够在编辑器中编辑它, 因此它将获得一个新的属性宏,

128
00:10:34,020 --> 00:10:39,330
‫我希望能够在实例和默认情况下编辑它｡

129
00:10:39,330 --> 00:10:40,980
‫所以我打算让它在任何地方编辑｡

130
00:10:40,980 --> 00:10:43,980
‫你不必这么做, 但我会给它分类｡

131
00:10:43,980 --> 00:10:46,620
‫我将创建一个名为“运动”的新类别｡

132
00:10:46,680 --> 00:10:49,830
‫现在, 将其公开给事件图是可选的｡

133
00:10:49,860 --> 00:10:54,660
‫我将暂时不讨论这个问题, 因为我认为我不需要在事件图中访问它｡

134
00:10:54,660 --> 00:10:55,290
‫如果我需要的话｡

135
00:10:55,320 --> 00:11:00,750
‫将来, 我可以使用蓝图､ 读､ 写或蓝图只读来公开它,

136
00:11:00,750 --> 00:11:02,320
‫并使用该梅塔允许私有访问指定｡

137
00:11:02,490 --> 00:11:04,680
‫但现在我不会｡

138
00:11:04,710 --> 00:11:11,370
‫我有一个速度变量, 在tank DHCP中, 我将取值并按速度缩放它｡

139
00:11:11,400 --> 00:11:17,970
‫现在最后一件事要做的是规模价值的增量时间, 这意味着我需要你的游戏静态｡

140
00:11:18,150 --> 00:11:20,790
‫这是Unreal Engine的文档｡

141
00:11:20,790 --> 00:11:27,810
‫我要继续搜索你的游戏静态, 这里是你的游戏静态.

142
00:11:27,810 --> 00:11:34,440
‫所以我只需要向下滚动到include行, 然后复制这个并回到坦克CP中｡

143
00:11:34,470 --> 00:11:36,030
‫我可以把它贴进去｡

144
00:11:36,030 --> 00:11:43,380
‫现在我可以访问新的游戏静态, 我可以得到三角洲时间, 所以我要乘以你｡

145
00:11:43,380 --> 00:11:52,140
‫游戏静态获取世界增量秒, 正如我们所看到的, 这需要一个世界上下文对象｡

146
00:11:52,140 --> 00:11:56,610
‫你甚至可以看到弹出窗口要求一个世界上下文对象｡

147
00:11:56,610 --> 00:11:58,500
‫所以我把这个算进去｡

148
00:11:58,590 --> 00:12:05,910
‫现在我把Delta位置X设置为时间值, 速度, 时间, delta时间, 我来编译这个｡

149
00:12:05,910 --> 00:12:07,980
‫所以我们有一个成功的编译｡

150
00:12:08,250 --> 00:12:14,040
‫回到编辑器, 我可以进入BP Pond Tank, 这就是我的速度｡

151
00:12:14,130 --> 00:12:20,970
‫如果我在世界中选择坦克的实例, 我可以在细节面板中搜索移动, 那里有速度,

152
00:12:20,970 --> 00:12:24,570
‫我可以把它设置为任何我喜欢的值｡

153
00:12:24,570 --> 00:12:29,310
‫如果我把这个调大, 按播放键, 我的移动速度会快很多｡

154
00:12:29,310 --> 00:12:33,510
‫这就是将变量暴露给蓝图的好处｡

155
00:12:33,510 --> 00:12:37,920
‫我可以尝试一下, 找到一个适合我的速度｡

156
00:12:38,370 --> 00:12:40,380
‫好的, 看起来不错｡

157
00:12:40,380 --> 00:12:43,770
‫现在我将继续, 不再展示浮式生产储油船｡

158
00:12:44,010 --> 00:12:47,550
‫现在我们有了速度变量, 我们可以改变它｡

159
00:12:47,550 --> 00:12:52,170
‫而这种变化将反映在我的棋子的移动上｡

160
00:12:52,710 --> 00:12:58,560
‫我们现在控制坦克的移动速度, 我们有一个很好的速度变量, 我们可以把它暴露在蓝图中,

161
00:12:58,560 --> 00:13:03,780
‫我们可以用它的值来做实验｡

162
00:13:04,170 --> 00:13:08,940
‫我们还了解了德尔塔时间, 以及为什么根据德尔塔时间调整我们的运动很重要｡

163
00:13:08,940 --> 00:13:15,870
‫因此, 它的帧速率无关, 因为帧速率的变化仍然会得到平滑, 一致的运动与我们的坦克｡

164
00:13:16,230 --> 00:13:21,150
‫回顾一下我们的部分计划, 我们几乎完成了第一个要点｡

165
00:13:21,150 --> 00:13:24,390
‫我们制造了一个坦克它可以在世界各地移动｡

166
00:13:24,540 --> 00:13:31,290
‫我们的第二点是处理输入与WASD键盘移动和鼠标输入以及｡

167
00:13:31,290 --> 00:13:39,240
‫我们已经把W和SW键去掉了, 但是我们还需要使用A和D键, 我们将使用它们来旋转坦克｡

168
00:13:39,270 --> 00:13:42,330
‫所以我们在接下来的视频中取得了很好的进展｡

169
00:13:42,330 --> 00:13:45,690
‫我们将努力完成我们的能力, 以移动坦克｡

170
00:13:45,750 --> 00:13:46,740
‫我很快就会见到你的｡

