﻿1
00:00:04,380 --> 00:00:09,780
‫所以我们希望一旦我们的炮弹击中, 摄像机会震动, 类似这样的东西｡

2
00:00:09,780 --> 00:00:13,680
‫我们也希望它能在我们的池塘死了后摇晃｡

3
00:00:14,040 --> 00:00:15,460
‫欢迎回来

4
00:00:15,480 --> 00:00:22,950
‫在本视频中, 我们将为游戏添加另一种特殊的效果, 包括摇动摄像头｡

5
00:00:22,950 --> 00:00:29,670
‫我们想在炮弹击中物体时摇动相机, 以及在我们的一个池塘死亡时｡

6
00:00:29,700 --> 00:00:36,480
‫这将增加只是另一个有点画龙点睛的游戏, 将使它感觉更专业一点｡

7
00:00:36,480 --> 00:00:38,610
‫现在让我们开始吧｡

8
00:00:38,610 --> 00:00:45,060
‫现在我们进入编辑器了, 我想为相机抖动添加一个新类｡

9
00:00:45,060 --> 00:00:49,440
‫Unreal Engine有一个内置的类用于摇动相机｡

10
00:00:49,440 --> 00:00:55,590
‫现在我将在蓝图文件夹中创建一个新文件夹, 并将此称为相机抖动｡

11
00:00:55,590 --> 00:00:57,630
‫还有在相机抖动文件夹里｡

12
00:00:57,630 --> 00:01:00,450
‫我将右键单击并创建一个新蓝图｡

13
00:01:00,480 --> 00:01:12,900
‫我们制作蓝图的原因是因为这是一个从蓝图方面制作起来容易得多的东西, 因为有很多变量需要用相机抖动来调整, 而我们要寻找的类是日场相机抖动,

14
00:01:12,900 --> 00:01:18,060
‫这样我们就可以搜索相机抖动并进行选择｡

15
00:01:18,060 --> 00:01:20,160
‫照相机抖动｡

16
00:01:20,980 --> 00:01:24,790
‫单击“选择”, 我们将此称为第一次相机抖动｡

17
00:01:25,060 --> 00:01:27,890
‫BP击中相机抖动｡

18
00:01:27,910 --> 00:01:34,240
‫现在, 让我们双击这个新蓝图并将其打开, 我们将看到它有一个详细信息面板,

19
00:01:34,240 --> 00:01:37,300
‫其中有许多不同的变量可供选择｡

20
00:01:37,310 --> 00:01:42,350
‫我们来讨论一下相机抖动类中的一些参数｡

21
00:01:42,370 --> 00:01:49,880
‫现在, 这里有很多, 我们只会触及一对夫妇, 影响相机抖动的整体感觉｡

22
00:01:49,900 --> 00:01:53,140
‫现在你会看到有一个叫做振荡的部分｡

23
00:01:53,140 --> 00:02:00,430
‫这一部分被称为振荡的原因是因为相机抖动涉及到相机的振荡｡

24
00:02:00,670 --> 00:02:04,370
‫这是关于正弦波的维基百科页面｡

25
00:02:04,390 --> 00:02:11,650
‫正弦波是一个数学函数, 我们不需要理解正弦波背后的数学原理｡

26
00:02:11,650 --> 00:02:14,850
‫但它确实有助于看到正弦波是什么样子｡

27
00:02:14,860 --> 00:02:24,010
‫如果我向右滚动, 我会看到这个红色的波, 它被标记为正弦, 一个正弦波振荡｡

28
00:02:24,010 --> 00:02:26,920
‫这意味着它会上下或前后移动｡

29
00:02:26,920 --> 00:02:33,610
‫所以如果我们的摄像机被平滑地前后晃动, 我们说它在振荡｡

30
00:02:33,610 --> 00:02:39,940
‫现在我们看到了振荡持续时间, 融入时间和退出时间｡

31
00:02:39,940 --> 00:02:44,620
‫持续时间会影响振动的持续时间｡

32
00:02:44,650 --> 00:02:50,140
‫现在, 这些是你可以实验的值, 但我已经做了一些实验,

33
00:02:50,140 --> 00:02:53,560
‫我知道一些很好的球场值为击中相机抖动｡

34
00:02:53,560 --> 00:02:58,270
‫当抛射体击中物体时, 我们会有一个相对较短的持续时间

35
00:02:58,330 --> 00:03:05,470
‫这是以秒为单位的, 我选0｡  2 5秒,

36
00:03:05,470 --> 00:03:08,080
‫用于此相机抖动的持续时间以及混合和混合时间｡

37
00:03:08,080 --> 00:03:18,220
‫我将使用值0｡  05, 所以是0｡  05的混合时间和0｡  05用于混合时间｡

38
00:03:18,340 --> 00:03:25,360
‫这是融入和融入相机抖动所需的时间, 将持续0｡  25秒｡

39
00:03:25,390 --> 00:03:28,330
‫现在我们有不同类型的振荡｡

40
00:03:28,330 --> 00:03:35,500
‫我们有旋转振荡, 这些会根据振荡函数旋转相机｡

41
00:03:35,500 --> 00:03:42,430
‫我们有一个位置振荡, 它会在空间中左右晃动相机, 还有一个视场振荡,

42
00:03:42,430 --> 00:03:48,130
‫它会影响视场, 基本上是用相机放大和缩小｡

43
00:03:48,160 --> 00:03:54,700
‫现在, 旋转和视场振荡是更容易引起晕动病的原因｡

44
00:03:54,700 --> 00:03:57,700
‫所以如果你喜欢的话, 你可以用它们来做实验｡

45
00:03:57,700 --> 00:04:03,100
‫但是对于这个相机抖动, 我们只需要改变位置振荡｡

46
00:04:03,130 --> 00:04:10,300
‫现在我们有三个轴X, Y, Z, 我们看到正弦波会来回推动物体｡

47
00:04:10,300 --> 00:04:16,210
‫这些振荡将使照相机在X､ Y和z方向上来回抖动｡

48
00:04:16,210 --> 00:04:22,540
‫我将单击这些下拉菜单展开它们, 我们将看到每个轴都有一个幅度､ 一个频率､

49
00:04:22,540 --> 00:04:26,740
‫一个初始偏移和一个波形｡

50
00:04:26,740 --> 00:04:33,460
‫现在, 相机抖动的初始偏移量被设置为随机, 我们可以将其设置为随机,

51
00:04:33,460 --> 00:04:36,310
‫这样我们就可以减少相机抖动的可预测性｡

52
00:04:36,310 --> 00:04:41,110
‫而正弦波是抖动相机时使用的波形类型｡

53
00:04:41,110 --> 00:04:45,070
‫我们看到它有一个平滑的上下运动｡

54
00:04:45,070 --> 00:04:51,450
‫现在振幅是摄像机在该轴上移动的最大量｡

55
00:04:51,460 --> 00:04:59,680
‫我将把这三个振幅都设为10, X, Y, z,

56
00:04:59,680 --> 00:05:02,800
‫频率是摄像机振荡的速度｡

57
00:05:02,800 --> 00:05:05,650
‫我把这些也设为10｡

58
00:05:05,740 --> 00:05:10,840
‫现在, 我们将看到这看起来如何, 只要我们实现了相机抖动｡

59
00:05:10,840 --> 00:05:17,680
‫但在此之前, 我将创建另一个相机抖动, 这将是当卒死亡时｡

60
00:05:17,680 --> 00:05:27,400
‫右键单击, 创建一个新的蓝图类, 搜索相机抖动, 选择“晨间相机抖动”, 单击“选择”｡

61
00:05:27,400 --> 00:05:31,600
‫为此, 我们将把它称为BP深度相机抖动｡

62
00:05:32,320 --> 00:05:38,430
‫现在死亡摄像机的抖动会比命中摄像机的抖动更剧烈一点｡

63
00:05:38,440 --> 00:05:42,460
‫当我们的炮弹击中什么东西时, 击中相机的震动会使相机震动｡

64
00:05:42,460 --> 00:05:47,360
‫但死亡相机抖动是要动摇相机时, 有东西死了｡

65
00:05:47,380 --> 00:05:51,940
‫所以对于振荡持续时间, 我会让它长一点｡

66
00:05:51,940 --> 00:05:57,040
‫我要去4｡  3､ 5秒和4､ 融入时间和退出时间｡

67
00:05:57,040 --> 00:06:00,070
‫我将这两个参数都设置为0｡  1.

68
00:06:01,000 --> 00:06:03,820
‫现在, 只是一个旁注融入和退出时间｡

69
00:06:03,820 --> 00:06:07,990
‫全职百分比是否在0和1之间正常化？

70
00:06:07,990 --> 00:06:12,460
‫第一点是整个振荡持续时间的10%｡

71
00:06:12,490 --> 00:06:21,430
‫现在我将把振幅设为54 X和Y, 我将把Z振幅设为零这样我们只会在X和Y方向上晃动摄像机,

72
00:06:21,430 --> 00:06:26,060
‫当人死了.

73
00:06:26,080 --> 00:06:29,130
‫这样我们会得到一个不同的相机抖动｡

74
00:06:29,140 --> 00:06:33,280
‫对于频率, 我将这两个参数都设置为20｡

75
00:06:35,440 --> 00:06:43,810
‫现在我们有了一个摄像头抖动, 是时候从C++端实现播放这些摄像头抖动了｡

76
00:06:44,470 --> 00:06:49,480
‫现在, 为了播放相机抖动, 我们需要一些相机抖动变量｡

77
00:06:49,510 --> 00:06:58,700
‫如果您使用的是旧版本的虚幻引擎, 虚幻引擎4. 25及以下, 那么变量的类就是你自己.

78
00:06:58,720 --> 00:06:59,760
‫相机抖动｡

79
00:06:59,770 --> 00:07:03,040
‫但在较新的版本4. 2､ 六级及以上｡

80
00:07:03,040 --> 00:07:05,400
‫包括虚幻引擎5号｡

81
00:07:05,410 --> 00:07:07,330
‫我们要用你演日场｡

82
00:07:07,360 --> 00:07:08,260
‫相机抖动｡

83
00:07:08,260 --> 00:07:10,690
‫这就是我们在这段视频中要用到的东西｡

84
00:07:10,990 --> 00:07:14,670
‫现在, 播放相机抖动的功能也不同了｡

85
00:07:14,680 --> 00:07:19,810
‫如果你在4楼｡  2､ 5及以下, 那么您要使用的函数是客户端播放｡

86
00:07:19,840 --> 00:07:20,800
‫相机抖动｡

87
00:07:21,190 --> 00:07:30,220
‫这是4中播放器控制器类的一个函数｡  26岁及以上, 含5岁｡  0, 这是我们正在使用的｡

88
00:07:30,220 --> 00:07:34,510
‫我们将使用客户端启动相机抖动作为客户端播放｡

89
00:07:34,540 --> 00:07:36,940
‫相机抖动现在已弃用｡

90
00:07:37,060 --> 00:07:42,130
‫既然我们用的是虚幻引擎5, 我们就用客户端, 开始抖相机.

91
00:07:42,130 --> 00:07:47,170
‫如果您使用五个, 您将沿着并使用客户端启动相机抖动｡

92
00:07:47,170 --> 00:07:54,460
‫但对于较老的引擎版本, 特别是4｡  2,

93
00:07:54,460 --> 00:08:00,250
‫五个及以下的人, 使用左边的类和函数, 其他人使用右边的类和函数｡

94
00:08:00,580 --> 00:08:07,780
‫现在只是为了给你看, 这是你的相机抖动基础在文档中, 这是它的包括｡

95
00:08:07,780 --> 00:08:14,050
‫所以你要用这个相机斜线相机抖动的基础来包含｡

96
00:08:14,200 --> 00:08:18,660
‫首先, 我想在投射类中处理击中相机的抖动｡

97
00:08:18,670 --> 00:08:22,870
‫所以在这里, 我将添加一个相机抖动｡

98
00:08:23,110 --> 00:08:25,060
‫现在, 这将是正向声明｡

99
00:08:25,060 --> 00:08:26,410
‫我要做一个U形｡

100
00:08:26,440 --> 00:08:27,940
‫相机抖动底座｡

101
00:08:27,940 --> 00:08:29,050
‫是个指针｡

102
00:08:29,140 --> 00:08:35,350
‫我现在把这个叫做“相机抖动”因为我想从设计图上设置这个｡

103
00:08:35,350 --> 00:08:38,800
‫既然我们有了相机抖动的蓝图, 我就来曝光一下｡

104
00:08:38,830 --> 00:08:40,480
‫这将是一个新的财产｡

105
00:08:40,520 --> 00:08:44,200
‫我会让它在任何地方编辑, 并给予它一个类别｡

106
00:08:44,830 --> 00:08:48,410
‫为了这个, 我会把它放在战斗部分｡

107
00:08:48,430 --> 00:08:51,670
‫现在, 我准备播放相机抖动｡

108
00:08:51,850 --> 00:09:00,100
‫所以在投射CP中, 我会把这个放在hit中, 在另一个参与者的检查中｡

109
00:09:00,100 --> 00:09:10,540
‫我要做的第一件事是确保我已经从设计图中设置了相机抖动, 这意味着我需要确保击中相机抖动不为空｡

110
00:09:10,840 --> 00:09:15,220
‫所以如果我按下相机抖动, 我就可以开始相机抖动｡

111
00:09:15,960 --> 00:09:23,310
‫这里有一个播放器控制器客户端开始相机抖动的版本4. 26岁及以上｡

112
00:09:23,340 --> 00:09:24,990
‫现在请注意几件事｡

113
00:09:25,020 --> 00:09:30,720
‫这涉及到变量的tw子类, 这意味着我们需要一个新的类｡

114
00:09:30,750 --> 00:09:40,190
‫现在, 我们为这些变量创建了蓝图, 这意味着我们可以轻松地创建一个子类, 而不是一个常规变量｡

115
00:09:40,200 --> 00:09:49,650
‫所以我可以把这个类的相机抖动基础, 并把它放在一个PT子类的, 所以让我们说PT子类的, 我将保留在这里的前向声明, 我不需要星号,

116
00:09:49,650 --> 00:09:56,220
‫因为PT子类的只是包装在模板, 因为这个击中相机抖动实际上是一个PT子类的I'我把它叫做hit camera

117
00:09:56,220 --> 00:10:03,480
‫shake类, 现在在投射CPP中, 而不是hit camera

118
00:10:03,510 --> 00:10:10,170
‫shake, 我们把它叫做hit camera shake类,

119
00:10:10,200 --> 00:10:16,350
‫现在我们可以调用客户端启动camera shake｡

120
00:10:16,530 --> 00:10:23,100
‫这个函数属于播放器控制器, 我们在projectile CP中, 我们没有播放器控制器的变量, 但是我们有这个函数get first

121
00:10:23,100 --> 00:10:29,670
‫player controller, 它存在于U世界类中, 所以我们可以调用get world,

122
00:10:29,670 --> 00:10:36,000
‫然后调用get first player controller.

123
00:10:36,000 --> 00:10:37,470
‫所以我们要这么做｡

124
00:10:37,470 --> 00:10:45,030
‫首先, 我们调用Git World, 然后调用get first

125
00:10:45,030 --> 00:10:52,140
‫player控制器, 从get first player控制器, 我们可以调用客户端start

126
00:10:52,140 --> 00:10:59,610
‫camera shake, 我们会看到这需要一个PT子类, 我们将传入hit camera

127
00:10:59,610 --> 00:11:04,980
‫shake类, 其余的输入参数都有默认值, 所以我们可以省略其余的输入｡

128
00:11:04,980 --> 00:11:07,260
‫让我们继续编译它｡

129
00:11:07,860 --> 00:11:11,010
‫回到编辑器中, 我们准备测试一下｡

130
00:11:11,010 --> 00:11:16,320
‫现在, 我们创建了蓝图和的PT子类, 但我们需要设置的PT子类｡

131
00:11:16,320 --> 00:11:20,130
‫让我们来看看演员和BP炮弹｡

132
00:11:20,160 --> 00:11:26,160
‫我将打开完整的蓝图编辑器, 进入战斗部分,

133
00:11:26,160 --> 00:11:33,780
‫这是我的命中相机抖动类, 我可以打开它, 选择命中相机抖动, 现在这将被设置｡

134
00:11:33,780 --> 00:11:39,660
‫我将编译按下播放键, 看看摄像机是否会抖动｡

135
00:11:41,140 --> 00:11:42,580
‫开始了｡

136
00:11:43,300 --> 00:11:44,110
‫太棒了｡

137
00:11:44,800 --> 00:11:48,700
‫接下来, 我想在吊舱死的时候播放一个相机抖动｡

138
00:11:48,700 --> 00:11:54,410
‫我将进入鲈鱼池, 在这里添加一个相机抖动变量｡

139
00:11:54,430 --> 00:11:59,950
‫在下面, 我们再创建一个变量的t子类.

140
00:11:59,980 --> 00:12:01,480
‫我将向前声明它｡

141
00:12:01,480 --> 00:12:09,490
‫这将是你的相机抖动基础, 我将称之为深度相机抖动类｡

142
00:12:09,700 --> 00:12:13,720
‫就像我们的另一个一样, 我们要把它变成一个U属性｡

143
00:12:14,290 --> 00:12:24,280
‫编辑任何地方类别战斗, 现在我们有一个相机抖动类在这里基地pon｡

144
00:12:24,610 --> 00:12:30,550
‫现在我要向你挑战, 当卒死亡时, 你要为它播放死亡相机抖动｡

145
00:12:30,550 --> 00:12:35,560
‫所以你要在, 死的时候做这个, 当然, 这是在处理销毁中.

146
00:12:35,560 --> 00:12:42,490
‫所以在这个函数中选择正确的位置来播放这个相机抖动, 然后编译你的代码｡

147
00:12:42,490 --> 00:12:48,910
‫在坦克和塔蓝图类中设置值的子类, 并对其进行测试｡

148
00:12:48,910 --> 00:12:51,520
‫暂停视频, 实施死亡摄像机｡

149
00:12:51,520 --> 00:12:52,540
‫握手吧

150
00:12:55,580 --> 00:12:55,820
‫好吧, 我会的

151
00:12:55,820 --> 00:12:58,260
‫所以我们有我们的def相机抖动类｡

152
00:12:58,280 --> 00:13:04,460
‫让我们进入基本池塘CP, 我将向上滚动到处理破坏｡

153
00:13:04,460 --> 00:13:15,980
‫我要做的第一件事是检查以确保深度相机抖动类已设置, 如果已设置, 则我们可以实际播放相机抖动｡

154
00:13:16,040 --> 00:13:21,530
‫现在我们没有指向播放器控制器的指针, 所以我将从这里调用GetWorld, 获取第一个播放器控制器,

155
00:13:21,920 --> 00:13:27,290
‫然后从那里调用.

156
00:13:28,370 --> 00:13:30,380
‫客户端启动相机抖动｡

157
00:13:31,650 --> 00:13:36,150
‫在这里, 我们可以通过深度摄像机, 抖动类｡

158
00:13:36,780 --> 00:13:38,070
‫这就是了｡

159
00:13:38,160 --> 00:13:46,190
‫让我们编译一下, 然后回到编辑器, 打开文件夹, BP, tank.

160
00:13:46,200 --> 00:13:48,960
‫这是深度相机抖动课程｡

161
00:13:48,990 --> 00:13:50,330
‫我要把它弄死｡

162
00:13:50,340 --> 00:13:54,060
‫相机, 摇动, 编译, 保存, 关闭｡

163
00:13:54,090 --> 00:13:56,160
‫我也要关闭射弹｡

164
00:13:56,160 --> 00:14:02,880
‫并打开BP池, 炮塔和设置深度相机抖动类深度相机抖动在这里以及｡

165
00:14:02,910 --> 00:14:04,800
‫现在我们可以检验死亡了｡

166
00:14:04,800 --> 00:14:06,360
‫让我们来看看它是如何工作的｡

167
00:14:06,390 --> 00:14:10,470
‫凯, 我要去其中一座塔楼｡

168
00:14:11,490 --> 00:14:12,420
‫博姆

169
00:14:12,420 --> 00:14:14,220
‫相机抖动正常｡

170
00:14:14,640 --> 00:14:19,360
‫现在, 最后一件要检查的事情是, 如果我们得到相机抖动时, 塔死亡｡

171
00:14:19,380 --> 00:14:22,080
‫那我们就去摧毁其中一座塔吧｡

172
00:14:22,810 --> 00:14:23,930
‫好了

173
00:14:23,950 --> 00:14:27,190
‫我们把摄像机摇了摇｡

174
00:14:27,220 --> 00:14:28,030
‫太棒了｡

175
00:14:29,240 --> 00:14:32,480
‫所以总而言之, 我们现在正在摇动摄像机｡

176
00:14:32,480 --> 00:14:37,760
‫当炮弹击中什么东西, 当其中一个池塘死亡时, 我们正在摇晃它｡

177
00:14:37,790 --> 00:14:43,890
‫这只是另一个很好的润色效果, 使我们的游戏看起来更专业一点｡

178
00:14:43,910 --> 00:14:49,460
‫说到在下一个视频中的润色,

179
00:14:49,460 --> 00:14:56,450
‫我们将润色游戏并使其处于最终工作状态, 这样我们就可以结束这一部分, 并在我们的腰带下有一个完整的工作游戏｡

180
00:14:56,480 --> 00:14:57,380
‫我很快就会见到你的｡

