﻿1
00:00:04,260 --> 00:00:05,280
‫你好, 欢迎｡

2
00:00:05,280 --> 00:00:11,520
‫在这堂课中, 我们将设置一些线路跟踪, 以便我们可以拍摄墙壁,

3
00:00:11,520 --> 00:00:14,250
‫看到出现的这些调试点｡

4
00:00:14,250 --> 00:00:18,510
‫我们将使用一个新的函数“按通道进行线路跟踪”来实现这一点, 我们将了解为什么要使用“按对象类型进行线路跟踪”,

5
00:00:18,510 --> 00:00:22,470
‫这是我们之前使用过的｡

6
00:00:22,500 --> 00:00:24,330
‫让我们来看看它是如何完成的｡

7
00:00:25,430 --> 00:00:32,870
‫在我们的建筑转义中, 我们使用了线跟踪, 我们在这里使用了这个函数, 线跟踪按对象类型｡

8
00:00:32,870 --> 00:00:36,350
‫这是我们想要使用的吗？

9
00:00:36,440 --> 00:00:44,450
‫那么, 按对象类型的行跟踪与其非常接近的兄弟（按通道的行跟踪）之间有什么区别呢？

10
00:00:45,170 --> 00:00:53,540
‫对象类型表示, 我想搜索这一行, 看看是否找到与此类型匹配的对象｡

11
00:00:53,540 --> 00:01:04,250
‫所以我相信我们在构建逃逸时使用的是类似物理体对象类型的东西, 这很好, 它会击中物理体｡

12
00:01:04,250 --> 00:01:10,580
‫但是如果你突然决定要用别的东西来击球, 那就没有太多的选择余地了｡

13
00:01:10,580 --> 00:01:16,490
‫因此, 通道更适合于此, 因为它允许我们定义自己的自定义通道,

14
00:01:16,490 --> 00:01:22,100
‫然后定义哪些类型的对象对该通道透明, 哪些对象会阻止它｡

15
00:01:22,100 --> 00:01:29,420
‫这很好, 因为我们想做的是,

16
00:01:30,070 --> 00:01:38,000
‫也许灌木类的东西不能阻挡子弹, 而墙可以阻挡子弹, 但它不会受到任何伤害, 但我们可以在以后处理｡

17
00:01:38,180 --> 00:01:45,200
‫通道是我们要走的路线, 我们可以通过控制找到正确的方法｡

18
00:01:45,200 --> 00:01:50,990
‫P顺便说一下, 我最近才学到的一个很酷的东西,

19
00:01:50,990 --> 00:02:00,170
‫如果你使用ACT符号, 你可以在这个文件甚至其他文件中搜索符号, 但是如果你打开这个文件, 速度会快得多｡

20
00:02:00,350 --> 00:02:07,190
‫然后, 您可以执行类似于线跟踪的操作, 您可以看到, 它为我们提供了所有符号的列表,

21
00:02:07,190 --> 00:02:14,210
‫这些符号是函数､ 类或变量, 我们可以按通道和对象类型查找线､ 跟踪､ 测试线､

22
00:02:14,210 --> 00:02:15,920
‫跟踪｡

23
00:02:15,920 --> 00:02:22,340
‫我们需要第一个单线跟踪､ 单个BI通道, 它将具有一个输出参数, 用于表示我们所遇到的情况｡

24
00:02:22,430 --> 00:02:27,800
‫起点､ 终点､

25
00:02:27,800 --> 00:02:33,290
‫碰撞轨迹通道将在一小段时间内到达, 然后是一些查询参数, 这些参数具有一些默认值, 因此我们实际上不必担心｡

26
00:02:33,290 --> 00:02:39,350
‫我们只需要考虑前面几个问题, Outhit开始､ 结束和跟踪通道｡

27
00:02:39,680 --> 00:02:41,750
‫让我们设置一个跟踪通道｡

28
00:02:41,750 --> 00:02:45,320
‫我们将转到设置和项目设置｡

29
00:02:45,320 --> 00:02:48,950
‫然后我们在引擎下面寻找碰撞区域｡

30
00:02:48,950 --> 00:02:53,300
‫在这下面, 你可以看到我们有对象通道和跟踪通道｡

31
00:02:53,300 --> 00:02:57,590
‫对象通道实际上只是表示不同类型对象的另一种方式｡

32
00:02:57,590 --> 00:03:02,120
‫所以如果你想拥有默认的对象集合, 比如兵之类的, 如果你想拥有一个新的对象类别,

33
00:03:02,120 --> 00:03:06,140
‫你可以沿着对象通道的路线走｡

34
00:03:06,140 --> 00:03:15,740
‫但是这些痕迹可以让你定义光谱的另一端, 比如, 我有一颗子弹, 它能击中什么物体？

35
00:03:15,740 --> 00:03:21,860
‫我们将沿着这条路线, 添加一个新的跟踪通道, 并将其命名为bullet｡

36
00:03:22,600 --> 00:03:25,840
‫默认的回答是｡

37
00:03:25,840 --> 00:03:29,290
‫BLOCK这基本上意味着所有对象类型都将｡

38
00:03:29,290 --> 00:03:36,820
‫BLOCK除非我们现在另外指定, 我们可以继续并接受它, 我们可以在这里查看我们的预设｡

39
00:03:37,270 --> 00:03:42,490
‫如果我们将其展开, 预设将显示我们可以应用的一系列不同的内容, 我们可以说,

40
00:03:42,490 --> 00:03:48,100
‫我们希望它是一个物理角色, 在这种情况下, 它是对象类型,

41
00:03:48,100 --> 00:03:52,840
‫这将是预定义的对象通道, 将是物理体｡

42
00:03:52,840 --> 00:04:00,550
‫但是如果我们把它展开, 你可以看到它对不同类型的迹线的反应｡

43
00:04:00,550 --> 00:04:07,030
‫因此, 我们有跟踪类型摄像头, 我们自己的子弹可见性, 它阻止所有这些, 然后它有对象类型｡

44
00:04:07,030 --> 00:04:16,750
‫所以这就是它如何与其他物体, 如卒和车辆, 等进行物理交互｡  这不是它与对象的线跟踪交互的方式｡

45
00:04:16,750 --> 00:04:19,390
‫这有点让人困惑, 我以前也是这样｡

46
00:04:19,690 --> 00:04:28,990
‫轨迹类型是很有趣的, 我们可以在这里看一下, 看到没有碰撞应该设置为不碰撞｡

47
00:04:28,990 --> 00:04:31,900
‫所以让我们的子弹也不要和它相撞｡

48
00:04:31,900 --> 00:04:39,160
‫因此, 只要覆盖一些预设, 使我们的项目符号如我们所期望的那样工作, 重叠所有, 例如,

49
00:04:39,160 --> 00:04:42,640
‫应该基本上与项目符号重叠｡

50
00:04:42,640 --> 00:04:50,710
‫而且很可能看不见的墙和看不见的墙的动态也应该被我们的子弹所忽略｡

51
00:04:50,770 --> 00:04:51,940
‫这里的动态也是一样｡

52
00:04:51,940 --> 00:04:55,300
‫您可以看到, 我们最终得到的结果基本上与可见性跟踪非常相似｡

53
00:04:55,300 --> 00:05:00,850
‫但是把它分开的原因是我们可能想做一些细微的区分, 比如你可以看到, 你不能透过这个灌木丛看到,

54
00:05:00,850 --> 00:05:04,660
‫但是你可以射穿它｡

55
00:05:04,660 --> 00:05:09,100
‫这意味着拥有自己的跟踪通道非常方便｡

56
00:05:09,100 --> 00:05:14,800
‫现在, 我们希望能够在代码中使用这个跟踪通道, 我们必须这样做, 这有点奇怪,

57
00:05:14,800 --> 00:05:21,490
‫因为这里有一个枚举, 一个E碰撞通道, 如果我们按F12键到它的定义, 你可以看到有一堆预定义的通道, 世界静态—可见性,

58
00:05:21,490 --> 00:05:27,580
‫等等｡ 下面还有一堆引擎跟踪通道1､

59
00:05:27,580 --> 00:05:35,050
‫2和游戏跟踪通道1､ 2､ 3等｡

60
00:05:35,050 --> 00:05:35,050
‫预先定义的｡

61
00:05:35,500 --> 00:05:37,570
‫这是我们中的哪一个？

62
00:05:37,570 --> 00:05:39,970
‫我们这里没有子弹｡

63
00:05:40,300 --> 00:05:42,760
‫我们实际上必须使用其中一个游戏跟踪频道｡

64
00:05:42,760 --> 00:05:44,620
‫所以这真的有点让人困惑｡

65
00:05:44,620 --> 00:05:45,790
‫是哪一个？

66
00:05:45,880 --> 00:05:50,980
‫因此, 您可以通过转到项目文件夹并进入config来执行此操作｡

67
00:05:51,130 --> 00:05:56,170
‫我们需要的是默认引擎INI, 我们希望在文本编辑器中打开它｡

68
00:05:56,170 --> 00:05:58,300
‫所以你可以在任何你喜欢的文本中这样做｡

69
00:05:58,330 --> 00:06:03,310
‫我喜欢将它拖到Visual Studio代码中, 这样Visual Studio代码就可以打开它｡

70
00:06:03,850 --> 00:06:10,960
‫在这里, 我们要寻找我们的子弹, 看看它被分配到了什么地方｡

71
00:06:10,960 --> 00:06:17,680
‫我想这第一行告诉我们, 它被赋予的通道是游戏轨迹通道1.

72
00:06:17,710 --> 00:06:18,430
‫好极了｡

73
00:06:18,430 --> 00:06:21,940
‫这就是我们在进行线路跟踪时要用到的｡

74
00:06:22,180 --> 00:06:27,130
‫现在, 让我们开始构建线路跟踪的结构｡

75
00:06:27,900 --> 00:06:30,540
‫我们首先需要一个起点｡

76
00:06:30,540 --> 00:06:31,290
‫我们已经有了｡

77
00:06:31,290 --> 00:06:33,050
‫这是我们的视口的位置｡

78
00:06:33,060 --> 00:06:37,890
‫我们还需要一个端点来表示线迹, 这个端点比较难计算｡

79
00:06:38,010 --> 00:06:45,930
‫让我们为终点创建一个F矢量, 我们将通过停止点来计算它,

80
00:06:46,380 --> 00:06:53,220
‫加上旋转乘以我们想要离开的距离｡

81
00:06:53,400 --> 00:06:58,170
‫不是旋转,

82
00:06:58,170 --> 00:07:05,880
‫而是指向旋转方向的向量, 让人有点困惑, 但实际上如果你做旋转向量, 这会给你一个指向旋转方向的向量｡

83
00:07:05,880 --> 00:07:11,810
‫这和我们在动画蓝图中做的相反, 从矢量中得到旋转｡

84
00:07:11,820 --> 00:07:13,140
‫这是另一个方向｡

85
00:07:13,200 --> 00:07:20,880
‫所以我们要计算位置加上这个旋转矢量, 然后我们需要一个最大范围｡

86
00:07:20,880 --> 00:07:26,010
‫我在这里引入一个新的属性, 让它可以在任何地方编辑, 它是一个浮点数, 叫做最大范围,

87
00:07:26,010 --> 00:07:28,050
‫就像这样.

88
00:07:28,050 --> 00:07:33,990
‫我们可以将其设置为默认值, 比如10, 000或1000, 最大范围｡

89
00:07:33,990 --> 00:07:37,050
‫大概有100米, 抱歉, 大概10米｡

90
00:07:37,140 --> 00:07:42,870
‫我们将转到旋转矢量乘以最大范围｡

91
00:07:42,870 --> 00:07:46,740
‫这就是我们从旋转中得到的向量, 大小为1｡

92
00:07:46,740 --> 00:07:51,030
‫将其乘以最大范围将使其成为大小的向量, 无论最大范围是多少｡

93
00:07:51,030 --> 00:07:54,780
‫然后我们把它加到位置上得到终点｡

94
00:07:54,810 --> 00:07:57,810
‫如果你不完全理解数学, 也不用担心｡

95
00:07:58,110 --> 00:08:01,530
‫重要的是, 这是我们想要达到终点的方式｡

96
00:08:01,530 --> 00:08:06,510
‫然后, 我将在此处放置一个to-do行,

97
00:08:06,510 --> 00:08:12,990
‫以添加一些行跟踪, 我们将删除此绘制调试摄像头, 因为我希望在此处执行不同的绘制调试助手｡

98
00:08:13,020 --> 00:08:16,950
‫我想画一个调试点, 你可以在这里找到｡

99
00:08:16,950 --> 00:08:20,610
‫它能容纳世界, 容纳位置､ 大小和颜色｡

100
00:08:20,610 --> 00:08:24,660
‫不管它是否持久, 我们可能确实希望它是持久的, 可见的｡

101
00:08:24,660 --> 00:08:27,600
‫所以我们应该能够沿着这些路线做一些事情｡

102
00:08:27,600 --> 00:08:35,430
‫让我们看看, 绘制调试点, 我们将在这里立即获取世界, 然后我们将从视口的位置开始,

103
00:08:35,430 --> 00:08:41,190
‫作为一个测试, 看看这个绘制调试点是如何工作的,

104
00:08:41,190 --> 00:08:48,450
‫给它一个大小, 使它的颜色为红色, 并使其持久性为真｡

105
00:08:48,450 --> 00:08:55,410
‫然后我们会用大写字母来表示分号, 看看它是否能在引擎中编译, 然后点击播放｡

106
00:08:55,800 --> 00:08:59,640
‫现在如果我射击, 然后稍微向后移动, 你可以看到这里有一个点.

107
00:08:59,640 --> 00:09:02,400
‫然而, 它真的, 真的很小, 很难看到｡

108
00:09:02,400 --> 00:09:07,050
‫所以他们打算把这个数字增加到20｡

109
00:09:07,140 --> 00:09:08,190
‫让我们看看这样是否更好｡

110
00:09:08,190 --> 00:09:09,510
‫编译并播放｡

111
00:09:09,540 --> 00:09:09,780
‫是的｡

112
00:09:09,780 --> 00:09:13,020
‫果然, 现在我可以看得非常非常清楚一点了｡

113
00:09:13,260 --> 00:09:16,860
‫现在, 您的挑战是按通道进行线路跟踪｡

114
00:09:16,860 --> 00:09:22,650
‫我们以前已经用对象类型做过了, 所以希望我们可以将其外推到按通道做｡

115
00:09:22,650 --> 00:09:28,290
‫因此, 使用我们已经定义的位置和结束作为开始和结束｡

116
00:09:28,530 --> 00:09:31,650
‫检查if语句的结果是否成功｡

117
00:09:31,650 --> 00:09:38,940
‫因此, 仅获取out参数或获取命中结果的参数并仅绘制调试点｡

118
00:09:38,940 --> 00:09:46,080
‫如果我们成功地击中了点, 并记住我们正在使用的通道, 我们发现在点INI文件以及｡

119
00:09:46,080 --> 00:09:51,060
‫暂停视频,

120
00:09:51,060 --> 00:09:56,160
‫看看是否可以将所有参数和自变量整理到行跟踪中, 并在我们遇到行跟踪的位置绘制调试点｡

121
00:09:56,730 --> 00:10:02,400
‫在这个阶段, 我们没有做任何聪明的事情, 比如忽略演员｡

122
00:10:02,400 --> 00:10:08,160
‫因此, 您的线路跟踪可能最终会击中玩家, 这对于本次挑战来说是可以接受的｡

123
00:10:08,190 --> 00:10:08,700
‫暂停视频｡

124
00:10:08,700 --> 00:10:09,270
‫来吧

125
00:10:10,700 --> 00:10:11,030
‫好吧, 我会的

126
00:10:11,030 --> 00:10:11,690
‫欢迎回来｡

127
00:10:11,720 --> 00:10:13,910
‫所以让我们开始吧｡

128
00:10:13,910 --> 00:10:18,410
‫我们要得到世界, 首先, 做一个箭头｡

129
00:10:18,410 --> 00:10:23,210
‫我们将逐个通道进行线路跟踪｡

130
00:10:24,170 --> 00:10:25,910
‫那我们需要一个命中结果｡

131
00:10:25,910 --> 00:10:32,870
‫所以我们的参数, 我们需要首先声明我们的命中结果结构体, 作为一个out参数传入｡

132
00:10:33,110 --> 00:10:37,820
‫它会调用hit并将其作为这里的第一个参数传入.

133
00:10:37,850 --> 00:10:39,650
‫那我们需要地点｡

134
00:10:40,410 --> 00:10:42,000
‫我们需要结局｡

135
00:10:42,090 --> 00:10:43,490
‫然后呢？

136
00:10:43,500 --> 00:10:44,430
‫接下来是什么？

137
00:10:44,430 --> 00:10:47,470
‫E碰撞e碰撞通道｡

138
00:10:47,490 --> 00:10:49,530
‫这将是一个E碰撞通道｡

139
00:10:49,530 --> 00:10:50,490
‫结肠｡

140
00:10:50,490 --> 00:10:53,610
‫然后应该是e c, 我们说什么来着？

141
00:10:53,610 --> 00:10:55,440
‫让我们来看看默认引擎｡

142
00:10:55,440 --> 00:11:01,400
‫Any e cc game trace channel one是默认any将其配置为的通道｡

143
00:11:01,410 --> 00:11:03,360
‫我们还需要更多的论据吗？

144
00:11:03,360 --> 00:11:04,770
‫我们沿着吧｡

145
00:11:04,800 --> 00:11:06,750
‫我们有默认的碰撞参数｡

146
00:11:06,750 --> 00:11:10,050
‫所以不, 我们不需要任何东西在这里｡

147
00:11:10,230 --> 00:11:14,160
‫然后我们需要一个布尔结果｡

148
00:11:14,160 --> 00:11:16,110
‫所以B成功了｡

149
00:11:16,910 --> 00:11:19,020
‫而且听起来很有帮助｡

150
00:11:19,020 --> 00:11:20,450
‫难道这不是成功吗？

151
00:11:20,810 --> 00:11:23,360
‫咱们说一个如果是成功的｡

152
00:11:24,230 --> 00:11:26,720
‫我们要画出调试点｡

153
00:11:26,720 --> 00:11:27,950
‫所以我们要把这个往下移｡

154
00:11:27,950 --> 00:11:35,300
‫我可以用Alt键来做, 然后箭头像这样移动一条线, 然后我可以用键盘上的一个控件和右方括号来缩进它,

155
00:11:35,300 --> 00:11:41,390
‫这样就得到了这样的效果｡

156
00:11:41,390 --> 00:11:46,550
‫现在我们要的不是起始点的位置, 而是命中位置｡

157
00:11:46,550 --> 00:11:50,270
‫这就是命中点的位置｡

158
00:11:50,270 --> 00:11:54,650
‫看起来我在这一行的末尾遗漏了一个分号｡

159
00:11:54,650 --> 00:11:56,750
‫让我们来建造它并尝试一下｡

160
00:11:57,020 --> 00:12:02,750
‫一旦编辑完成, 让我们点击播放, 进入世界, 并尝试拍摄我们的墙壁｡

161
00:12:02,960 --> 00:12:03,650
‫你去那里｡

162
00:12:03,650 --> 00:12:07,490
‫你可以看到我们有一个点出现在墙上, 就在我开枪的地方｡

163
00:12:07,490 --> 00:12:09,020
‫我可以做很多次｡

164
00:12:09,140 --> 00:12:16,730
‫如果我离墙太远, 它似乎会击中, 但根本不会击中, 因为我们的最大射程很短｡

165
00:12:16,730 --> 00:12:21,230
‫你可以看到, 一旦我进入最大射程, 它就会击中, 并画出一个点｡

166
00:12:21,230 --> 00:12:23,930
‫这就是成功完成的挑战｡

167
00:12:23,930 --> 00:12:29,270
‫我们现在能够显示和跟踪到特定点的线｡

168
00:12:29,270 --> 00:12:38,630
‫下一步是让它实际显示一些粒子效果, 这将比仅仅绘制一个调试点要酷得多｡

169
00:12:38,630 --> 00:12:40,160
‫我们下节课再见｡

