﻿1
00:00:04,350 --> 00:00:05,340
‫你好, 欢迎｡

2
00:00:05,340 --> 00:00:11,490
‫在这节课中,

3
00:00:11,490 --> 00:00:21,030
‫我们将建立我们的第一个几何轨迹, 这样当我们去看我们的石像鬼, 并且我们足够接近它的范围时, 它肯定会打印出被轨迹击中的演员的名字｡

4
00:00:21,030 --> 00:00:27,540
‫让我们深入了解一下如何做到这一点, 以便最终准备好逐个通道处理此扫描｡

5
00:00:27,540 --> 00:00:31,290
‫有很多东西, 我们必须到位, 使它的工作｡

6
00:00:31,290 --> 00:00:32,550
‫但最后, 我们还是来了｡

7
00:00:32,700 --> 00:00:36,240
‫让我们来看看这个函数的语法｡

8
00:00:36,240 --> 00:00:43,230
‫因此, 我们在一个更好的地方来了解这里发生了什么, 当在这些类型｡

9
00:00:43,230 --> 00:00:51,510
‫所以返回值是一个布尔值, 它基本上告诉我们是否通过扫描找到了任何东西｡

10
00:00:51,990 --> 00:00:56,430
‫现在第二个参数, 正如你在这里看到的, 它是一个引用｡

11
00:00:56,430 --> 00:00:58,050
‫它有一个“&”符号｡

12
00:00:58,170 --> 00:01:02,520
‫无论是"符号后面有空格,

13
00:01:02,520 --> 00:01:07,830
‫还是变量名之间有空格, 都一样只要"符号后面的类型表示该类型是一个引用, 并且是一个叫做"

14
00:01:07,950 --> 00:01:12,690
‫F命中结果"的类型, 你就能看到它是一个结构体.

15
00:01:12,810 --> 00:01:15,870
‫因此, 这个F命中结果是输出命中｡

16
00:01:15,870 --> 00:01:18,630
‫这就是扫描的结果｡

17
00:01:18,630 --> 00:01:24,120
‫我们可以看到什么东西被击中了, 这是一个结构体, 因为有很多不同的东西,

18
00:01:24,120 --> 00:01:26,790
‫信息片段可以从这个扫描中得到｡

19
00:01:26,790 --> 00:01:31,080
‫然后我们有一个常数f矢量参考｡

20
00:01:31,080 --> 00:01:36,510
‫这是通过引用而不是复制开始向量｡

21
00:01:36,510 --> 00:01:40,530
‫结束向量也是这样, 我们得到了一个旋转｡

22
00:01:40,530 --> 00:01:47,610
‫这是使用f四元数的形状旋转, 这是使用f旋转器的替代结构｡

23
00:01:47,610 --> 00:01:51,690
‫我们来看看, 我们是如何基本上处于零旋转状态的, 因为我们使用的是一个球体｡

24
00:01:51,690 --> 00:01:52,770
‫这并不重要

25
00:01:53,220 --> 00:02:02,220
‫接下来是跟踪通道, 我们将了解如何确定跟踪通道在C++中的名称｡

26
00:02:02,370 --> 00:02:08,820
‫然后我们得到了碰撞形状, 这将是我们需要提供的最后一个参数,

27
00:02:08,820 --> 00:02:13,830
‫我们将看到如何通过这样做来创建一个特定半径的球体｡

28
00:02:13,830 --> 00:02:18,540
‫但在开始之前, 我们需要知道该半径是多少以及如何配置它｡

29
00:02:18,540 --> 00:02:23,700
‫接下来我们将继续讨论grab a, h,

30
00:02:23,700 --> 00:02:27,870
‫我们将删除这些函数, 我们将它们用作引用引用和out参数的例子｡

31
00:02:27,870 --> 00:02:35,040
‫我们将创建一个可在任意位置编辑的新属性,

32
00:02:35,310 --> 00:02:42,690
‫它将是一个名为抓取半径的浮点数, 我们将其设置为101米｡

33
00:02:42,690 --> 00:02:49,140
‫现在让我们进入C++, 删除print damage和has

34
00:02:49,140 --> 00:02:53,490
‫damage的引用, 我们也可以从tick组件中删除这些引用｡

35
00:02:53,490 --> 00:02:58,830
‫整个if语句以及我们传递损坏的位置, 因为这里我们绘制了调试行,

36
00:02:58,830 --> 00:03:03,900
‫现在我们要按通道调用扫描单通道｡

37
00:03:03,990 --> 00:03:06,150
‫所以我们要键入sweep｡

38
00:03:06,150 --> 00:03:14,070
‫所以我们要输入get world括号因为我们知道这是一个关于新的world对象的函数.

39
00:03:14,370 --> 00:03:19,500
‫然后我们可以做一个箭头, 因为我们知道get

40
00:03:19,500 --> 00:03:29,040
‫world返回一个指针, 然后我们将按通道进行一次扫描, 就像这样, 我们将必须输入一个out参数,

41
00:03:29,040 --> 00:03:31,710
‫以便作为这里的第一个参数进行填充｡

42
00:03:31,800 --> 00:03:38,100
‫所以我们要创建一个变量, 它是空的, 它会被填充, 而且它必须有正确的类型.

43
00:03:38,100 --> 00:03:44,640
‫这是一个if, f, hit, 结果, 我们把变量本身叫做hit, 结果,

44
00:03:44,640 --> 00:03:49,500
‫在末尾加一个分号, 因为我们没有初始化它, 也没有给它赋值,

45
00:03:49,500 --> 00:03:55,050
‫但是我们会把它传递进去, 让sweep, single, by, channel函数给它赋值.

46
00:03:55,770 --> 00:03:57,270
‫这就是我们的结果｡

47
00:03:57,270 --> 00:04:05,190
‫然后我们需要传入开始和结束向量, 我们知道它们不会被复制, 而是被引用｡

48
00:04:05,430 --> 00:04:13,080
‫现在我们需要填充旋转, 我们可以用一个简单的冒号, 冒号恒等式来完成,

49
00:04:13,080 --> 00:04:17,370
‫它基本上告诉我们这是一个无旋转｡

50
00:04:17,370 --> 00:04:19,290
‫这只是一个有点奇怪的语言｡

51
00:04:19,290 --> 00:04:23,190
‫这是一个数学上的说法, 意思是这不是旋转｡

52
00:04:23,760 --> 00:04:27,030
‫接下来, 我们需要轨迹碰撞通道｡

53
00:04:27,030 --> 00:04:31,020
‫现在, 我们怎么去寻找轨迹碰撞通道？

54
00:04:31,170 --> 00:04:38,370
‫好吧, 如果我们转到保存项目的文件夹, 进入config, 然后转到默认引擎INI,

55
00:04:38,370 --> 00:04:44,160
‫单击它, 然后使用Visual Studio代码打开｡

56
00:04:44,160 --> 00:04:47,700
‫我想在这里寻找抓钩

57
00:04:48,030 --> 00:04:52,770
‫因此, 您将能够看到抓取器的碰撞响应通道｡

58
00:04:52,770 --> 00:04:56,040
‫它基本上是在默认引擎INI中设置的｡

59
00:04:56,040 --> 00:05:00,990
‫在整个文件中只提到一次, 您可以看到频道名称｡

60
00:05:00,990 --> 00:05:02,820
‫这是C++中的通道名称｡

61
00:05:02,820 --> 00:05:03,750
‫不是很好｡

62
00:05:04,050 --> 00:05:06,060
‫是的, 但它是s｡  e.计算 c.其他

63
00:05:06,090 --> 00:05:13,890
‫游戏跟踪通道2, 我们可以继续复制它, 然后我们可以返回到我们的捕获CP并将其粘贴到这里,

64
00:05:13,890 --> 00:05:17,980
‫作为我们想要的跟踪通道｡

65
00:05:18,000 --> 00:05:22,590
‫现在, 这条线变得相当长了, 我们可以做的是,

66
00:05:22,590 --> 00:05:27,030
‫我们可以把这些参数放在单独的线上, 或者至少把它们分散开｡

67
00:05:27,030 --> 00:05:29,220
‫所以也许开始和结束在同一个地方｡

68
00:05:29,220 --> 00:05:35,250
‫同一性准则在一行上, 跟踪通道在另一行上, 就像这样｡

69
00:05:35,250 --> 00:05:39,640
‫这就给了我们更多的空间来阅读这些长长的论证列表｡

70
00:05:39,660 --> 00:05:44,130
‫现在, 如果我们返回到文档, 我们可以看到,

71
00:05:44,130 --> 00:05:47,250
‫下一个需要传入的是一个F碰撞形状｡

72
00:05:47,250 --> 00:05:49,890
‫所以我们需要构造一个形状｡

73
00:05:49,890 --> 00:05:52,980
‫也许我们可以把它作为一个单独的变量放在上面｡

74
00:05:52,980 --> 00:05:58,140
‫我将在hit结果之前执行此操作, 以明确hit结果实际上是一个out参数.

75
00:05:58,140 --> 00:06:02,490
‫我总是把它作为函数调用之前的最后一项｡

76
00:06:02,850 --> 00:06:08,970
‫所以我们要创建一个F碰撞形状, 我们称之为球体,

77
00:06:08,970 --> 00:06:15,210
‫我们要把它设置为等于F碰撞形状, 冒号, 冒号, 生成球体｡

78
00:06:15,210 --> 00:06:18,540
‫这将创建一个新的球体, 碰撞形状｡

79
00:06:18,540 --> 00:06:26,580
‫这个函数的参数是球体半径, 我们已经把它作为抓取半径变量,

80
00:06:26,580 --> 00:06:33,060
‫我们已经把它配置为U属性,

81
00:06:33,060 --> 00:06:41,130
‫但是在这行的末尾有一个分号, 我们可以把球体作为最后一个参数传递给扫描通道函数, 并在这行的末尾加上一个分号｡

82
00:06:41,130 --> 00:06:47,790
‫现在还有一件事, 这个函数返回一个布尔值, 表示我们是否命中了.

83
00:06:47,790 --> 00:06:57,480
‫所以我会把结果放入一个布尔变量has hit中, 这就是我们在后面的函数中要用到的.

84
00:06:57,480 --> 00:07:02,280
‫所以我想挑战你把这位当红演员的名字印出来｡

85
00:07:02,280 --> 00:07:04,440
‫所以现在我们要进行大扫除了｡

86
00:07:04,440 --> 00:07:07,230
‫我们应该能从中得到一些结果｡

87
00:07:07,230 --> 00:07:11,700
‫因此, 如果我们有任何东西, 就使用if语句来打印｡

88
00:07:11,700 --> 00:07:16,830
‫如果布尔值为真, 我们就打印出演员的名字.

89
00:07:16,830 --> 00:07:22,950
‫你将通过使用hit result结构体得到球体轨迹被击中的演员｡

90
00:07:22,950 --> 00:07:28,530
‫它有一个方法, 你可以用点操作符访问它, 因为它是中的一个结构体｡

91
00:07:28,530 --> 00:07:30,300
‫它不是指向结构的指针｡

92
00:07:30,600 --> 00:07:36,630
‫你可以输入一个点, 得到actor, 然后用括号, 返回一个actor指针.

93
00:07:37,140 --> 00:07:42,240
‫然后使用这个活动指针, 你可以用get actor

94
00:07:42,240 --> 00:07:49,020
‫name或label方法得到演员的名字, 考虑是用点还是箭头操作符, 然后编译和测试, 打印出演员的名字,

95
00:07:49,020 --> 00:07:53,700
‫看看你能在场景中找到什么｡

96
00:07:53,700 --> 00:07:55,500
‫暂停视频, 开始体验｡

97
00:07:58,460 --> 00:07:58,750
‫好吧, 我会的

98
00:07:58,750 --> 00:07:59,710
‫欢迎回来｡

99
00:07:59,740 --> 00:08:02,410
‫我们从创建if语句开始｡

100
00:08:02,410 --> 00:08:10,270
‫如果命中了, 我们就用括号括起来, 我们首先要做的是, 我们要得到参与点｡

101
00:08:10,270 --> 00:08:17,710
‫所以一个演员的星星命中了演员就等于命中了结果｡

102
00:08:18,670 --> 00:08:20,260
‫小点声｡

103
00:08:20,560 --> 00:08:21,420
‫演员｡

104
00:08:21,910 --> 00:08:22,690
‫圆括号｡

105
00:08:22,690 --> 00:08:22,900
‫喜欢｡

106
00:08:22,900 --> 00:08:34,030
‫然后我们要写一个u log, 我们要写hit actor冒号, percent, sx, 我们可以写hit actor,

107
00:08:34,060 --> 00:08:44,860
‫因为这里是一个指针, 我们可以写hit actor, arrow, 得到actor的名字或者标签, 然后是一些括号｡

108
00:08:44,860 --> 00:08:55,210
‫而且因为这是一个字符串, 我们必须在整个shebang的前面放一颗星星, 这样它才能在我们的Yui日志中正确地显示它｡

109
00:08:55,240 --> 00:08:58,660
‫好的, 我们现在需要继续编译｡

110
00:08:58,660 --> 00:09:04,150
‫然后, 一旦我们进入场景, 让我们打开输出日志, 并将其停靠到布局, 以便我们可以在播放时看到它,

111
00:09:04,150 --> 00:09:06,640
‫并点击播放按钮｡

112
00:09:07,390 --> 00:09:11,050
‫马上你就能看到我们撞上了那个石像鬼雕像｡

113
00:09:11,080 --> 00:09:16,360
‫如果我转过身去看你能看到的其他东西, 嗯, 不太清楚我是没有击中任何东西,

114
00:09:16,360 --> 00:09:19,150
‫还是它什么也没有显示｡

115
00:09:19,150 --> 00:09:24,970
‫我要做的就是在if语句中加入一个else, 再加上一些括号, 然后我再做一个U

116
00:09:24,970 --> 00:09:27,640
‫log｡

117
00:09:27,640 --> 00:09:34,450
‫这一次我们会说, 没有演员, 让我们重新编译, 然后在编辑器中播放｡

118
00:09:34,450 --> 00:09:35,230
‫你现在可以看到了｡

119
00:09:35,230 --> 00:09:41,230
‫这是说没有演员击中所有的时间, 直到我去开始看石像鬼｡

120
00:09:41,230 --> 00:09:43,900
‫现在它说石像鬼是被击中的东西｡

121
00:09:43,900 --> 00:09:50,740
‫如果我向后移动太远, 超出了我的范围, 你可以看到我看到它在说没有演员再被击中.

122
00:09:50,770 --> 00:09:51,280
‫好东西｡

123
00:09:51,280 --> 00:09:58,090
‫我们现在已经用一个球形对象进行了几何扫描, 我们可以看到它确实只对我们特定的“轨迹”通道中的参与者做出反应,

124
00:09:58,270 --> 00:10:04,420
‫例如石像鬼是我们目前设置的唯一一个｡

125
00:10:04,420 --> 00:10:06,880
‫所以这是它唯一找到的｡

126
00:10:06,880 --> 00:10:08,770
‫我们下节课再见｡

