﻿1
00:00:04,470 --> 00:00:05,430
‫你好, 欢迎｡

2
00:00:05,430 --> 00:00:15,330
‫在这节课中, 我们要设置好抓钩这样我们就能抓住石像鬼雕像并把它带到我们面前.

3
00:00:15,330 --> 00:00:17,670
‫让我们一起来看看我们是如何做到的｡

4
00:00:18,090 --> 00:00:24,540
‫所以现在我们开始调用这个抓取组件, 在位置旋转.

5
00:00:24,540 --> 00:00:26,790
‫就像我之前说的, 这实际上有两个部分｡

6
00:00:26,790 --> 00:00:36,180
‫我们需要抓取组件, 然后需要设置其目标位置和旋转, 以便它可以四处移动｡

7
00:00:36,180 --> 00:00:44,580
‫所以首先在我们的grab函数中, 我们需要得到一个指向物理句柄的指针｡

8
00:00:44,580 --> 00:00:51,690
‫我将从“开始播放”中复制这行代码, 然后转到抓取器, 将其放在这里.

9
00:00:51,690 --> 00:00:55,920
‫为了保护我们自己不受这种无效性的影响｡

10
00:00:55,920 --> 00:00:57,510
‫那么, 应该发生什么呢？

11
00:00:57,510 --> 00:01:00,330
‫事实上, 我们也不想做什么.

12
00:01:00,330 --> 00:01:03,060
‫如果我们没有一个物理句柄, 我们就不能抓住任何东西｡

13
00:01:03,150 --> 00:01:10,200
‫所以我们可以把这个grab函数的整个主体放到if语句中, 但是这样看起来会有点混乱｡

14
00:01:10,200 --> 00:01:13,800
‫所以我们能做的就是提前回归｡

15
00:01:13,830 --> 00:01:18,720
‫本质上, 我们只是说如果物理学处理｡

16
00:01:19,490 --> 00:01:21,720
‫等于等于空指针｡

17
00:01:21,740 --> 00:01:23,810
‫你得在这里加两个等号｡

18
00:01:23,810 --> 00:01:25,460
‫否则就是任务｡

19
00:01:25,760 --> 00:01:32,500
‫然后我们可以下去做一些牙套, 我们可以在这里放一个回车｡

20
00:01:32,510 --> 00:01:38,240
‫如果物理句柄有一个空指针,

21
00:01:38,240 --> 00:01:46,910
‫它会直接返回, 不执行函数的其余部分, 这样就可以安全地在函数的其余部分使用物理句柄.

22
00:01:47,330 --> 00:01:49,010
‫所以我们要这么做｡

23
00:01:49,010 --> 00:01:52,010
‫我们要去找到目标的地方｡

24
00:01:52,010 --> 00:01:54,380
‫我想我们不再需要这些日志消息了｡

25
00:01:54,380 --> 00:01:56,140
‫所以我将删除alt语句｡

26
00:01:56,150 --> 00:02:03,950
‫我将删除if语句体中的所有内容, 然后使用我们的抓取器｡

27
00:02:03,950 --> 00:02:13,040
‫所以我们要做一个物理处理, 箭头抓取组件, 在位置旋转｡

28
00:02:13,040 --> 00:02:17,010
‫然后我们要给它提供一个我们想抓住的组件｡

29
00:02:17,030 --> 00:02:22,250
‫如果你看一下, 它所期待的是一个原始的组件｡

30
00:02:22,250 --> 00:02:27,280
‫让我们看看在我们的命中结果中是否有类似的东西｡

31
00:02:27,290 --> 00:02:33,650
‫我将跳转到它的文档页面, 查找原始组件, 您可以看到,

32
00:02:33,650 --> 00:02:39,290
‫get组件将返回完全命中的原始组件｡

33
00:02:39,290 --> 00:02:40,310
‫这正是我们需要的｡

34
00:02:40,310 --> 00:02:47,150
‫所以我们要查找hit result, 点get组件,

35
00:02:47,150 --> 00:02:49,670
‫这将为我们提供第一个参数所需的内容｡

36
00:02:50,060 --> 00:02:54,020
‫接下来是骨头的F名｡

37
00:02:54,020 --> 00:02:57,440
‫现在我们并不想抓住某根骨头｡

38
00:02:57,440 --> 00:03:01,640
‫如果我们有一个骨架网格, 情况就会是这样, 但我们没有｡

39
00:03:01,640 --> 00:03:06,680
‫我们有一个静态网格, 所以我们只使用name, 下划线none｡

40
00:03:06,770 --> 00:03:11,180
‫一般来说, 对于F类的名字, 当我们谈论骨头的时候, 这个问题会出现很多｡

41
00:03:11,180 --> 00:03:15,350
‫如果你不想输入任何内容, 你可以使用name, 下划线none｡

42
00:03:15,350 --> 00:03:18,380
‫现在我们要知道我们要去的地方｡

43
00:03:18,380 --> 00:03:20,270
‫我们已经说了我们已经调查过了｡

44
00:03:20,270 --> 00:03:29,300
‫这是命中结果点的撞击点, 然后是旋转, 嗯, 该组件的当前旋转将做或演员的当前旋转,

45
00:03:29,300 --> 00:03:33,140
‫无论你喜欢｡

46
00:03:33,170 --> 00:03:35,390
‫所以命中结果得到组件｡

47
00:03:35,390 --> 00:03:45,830
‫我们将获取hit结果, 获取组件点箭头, 因为它是一个指针, 用于获取组件旋转, 如｡

48
00:03:45,830 --> 00:03:52,280
‫现在我们可以把右括号放在一个单独的行上, 我会在那里放分号来结束这个语句,

49
00:03:52,280 --> 00:03:56,840
‫这样应该可以有效地获取我们的组件｡

50
00:03:56,870 --> 00:04:04,130
‫现在, 谜题的下一部分是在tick组件中, 我们希望再次使用物理句柄｡

51
00:04:04,130 --> 00:04:10,160
‫我现在要复制代码, 知道复制代码到三个地方有点太多了, 我们可能要考虑把它拉到一个函数中,

52
00:04:10,160 --> 00:04:15,410
‫这样我们就可以重用它了｡

53
00:04:15,410 --> 00:04:22,310
‫但是进气组件, 我们将使用物理句柄, 如果我们不能获得物理句柄, 我们将提前返回｡

54
00:04:22,430 --> 00:04:26,270
‫然后我们要做的是尝试设定目标位置｡

55
00:04:26,270 --> 00:04:35,330
‫所以我们要做物理, 处理箭头设定目标位置和旋转｡

56
00:04:35,330 --> 00:04:37,340
‫让我们想一想｡

57
00:04:37,340 --> 00:04:42,290
‫我们可能会对设定什么样的目标位置感兴趣？

58
00:04:42,290 --> 00:04:46,130
‫基本上, 这和我们对端点所做的一样｡

59
00:04:46,130 --> 00:04:53,060
‫我们将获取当前位置, 然后将其向前移动一定距离｡

60
00:04:53,060 --> 00:04:54,590
‫这是可以配置的｡

61
00:04:54,590 --> 00:05:00,230
‫你可以使用最大抓取距离, 但我发现在实践中感觉太远了｡

62
00:05:00,230 --> 00:05:06,500
‫如果我们抓取一个H, 我们将创建一个新的使用属性, 称为编辑任意位置, 它将是一个浮点数,

63
00:05:06,500 --> 00:05:10,220
‫称为保持距离｡

64
00:05:10,220 --> 00:05:12,530
‫我把它设为200｡

65
00:05:12,530 --> 00:05:15,260
‫所以它会更接近玩家｡

66
00:05:15,260 --> 00:05:21,410
‫现在, 如果我们进入CP的抓取, 我们可以进入我们的tick函数, 并尝试创建这个目标位置｡

67
00:05:21,410 --> 00:05:26,240
‫所以这是一个F矢量, 叫做目标位置｡

68
00:05:26,780 --> 00:05:40,040
‫我们将其设置为等于获取组件位置加上获取前进向量乘以保持距离｡

69
00:05:40,280 --> 00:05:42,350
‫所以我们可以把它作为目标位置｡

70
00:05:42,350 --> 00:05:47,870
‫这将是我们的第一个论点, 然后我们需要目标轮换｡

71
00:05:47,870 --> 00:05:54,860
‫为此, 我将使用当前组件的旋转,

72
00:05:54,860 --> 00:06:03,350
‫这样当我们环顾四周时, 我们将随视图旋转对象, 这样我们就可以执行“获取组件旋转”,

73
00:06:03,350 --> 00:06:07,370
‫以获取当前抓取器场景组件的旋转｡

74
00:06:07,370 --> 00:06:13,040
‫现在让我们在这一行的末尾加上一个分号, 然后重新编译, 看看它是如何工作的｡

75
00:06:13,040 --> 00:06:18,900
‫现在, 在我们成功编译之后, 让我们选择石像鬼, 并确保我们从START更改了它的移动性｡

76
00:06:19,070 --> 00:06:26,300
‫坚持使用可移动的, 因为我们确实需要它能够响应物理而移动, 让我们确保它模拟物理｡

77
00:06:26,300 --> 00:06:31,880
‫让我们转到物理类别, 并检查模拟物理按钮｡

78
00:06:31,880 --> 00:06:34,910
‫让我们按播放键, 试着把它捡起来｡

79
00:06:34,910 --> 00:06:40,010
‫所以我认为它正在发生的时刻, 但它似乎是卡在地板内, 所以这是不理想的｡

80
00:06:40,010 --> 00:06:43,760
‫让我们试着把它抬起来一点这样它就不会卡在地板里了｡

81
00:06:44,030 --> 00:06:47,840
‫让它像那样掉在地上, 现在试着把它捡起来｡

82
00:06:47,840 --> 00:06:52,790
‫现在它似乎又卡在地板里了, 所以我们再试一次.

83
00:06:52,820 --> 00:06:53,150
‫好吧, 我会的

84
00:06:53,150 --> 00:06:59,660
‫所以它有点不可靠, 有时候如果你直接抓住它, 它就能很好地抓住滴水嘴,

85
00:06:59,660 --> 00:07:03,410
‫你就能像这样抓住它｡

86
00:07:03,410 --> 00:07:11,510
‫我注意到旋转是不正确的, 这是因为我在抓取物理组件时使用了错误的东西｡

87
00:07:11,510 --> 00:07:15,800
‫我得到了旋转的滴水嘴, 现在我们试图保持旋转｡

88
00:07:15,800 --> 00:07:23,390
‫我实际上需要用到的是旋转, 我们在拾取抓取器的旋转时用到的旋转｡

89
00:07:23,390 --> 00:07:29,270
‫所以让我们继续, 改变它, 重新编译, 然后我们再次点击播放, 尝试抓取它｡

90
00:07:29,270 --> 00:07:29,960
‫你去那里｡

91
00:07:29,990 --> 00:07:35,390
‫这一次我抓住了它, 我得到了正确的旋转, 确切的旋转, 它有｡

92
00:07:35,390 --> 00:07:39,350
‫你可以看到它看起来确实像是被弹簧抓住的｡

93
00:07:39,350 --> 00:07:44,660
‫如果我试着把它推过一堵墙, 它会尽量不穿过墙｡

94
00:07:44,660 --> 00:07:52,100
‫它最终确实会从墙上弹出来, 但当我移动它时, 它正试图观察物理｡

95
00:07:52,100 --> 00:07:56,870
‫所以我想挑战你们, 现在拿出一个新的函数, 叫做get physics handle｡

96
00:07:56,870 --> 00:07:58,040
‫这是私人的｡

97
00:07:58,070 --> 00:07:59,300
‫它应返回U｡

98
00:07:59,300 --> 00:08:06,080
‫物理句柄组件, 它应该删除需要获得所有者的重复代码, 并通过类找到组件｡

99
00:08:06,080 --> 00:08:11,420
‫你也可以让它潜在的const看看你是否可以, 并使其日志｡

100
00:08:11,420 --> 00:08:18,080
‫如果我们没有物理句柄组件, 则给予一个警告日志, 以便它显示出来, 我们知道我们做错了什么｡

101
00:08:18,110 --> 00:08:20,180
‫暂停视频, 开始体验｡

102
00:08:23,950 --> 00:08:24,250
‫好吧, 我会的

103
00:08:24,250 --> 00:08:24,750
‫欢迎回来｡

104
00:08:24,760 --> 00:08:29,410
‫首先, 我们转到文件头,

105
00:08:29,410 --> 00:08:38,290
‫我们将把它放在private部分, 但在Q属性下面, 我将让它返回一个U物理句柄组件, 并在这里加上一个星号.

106
00:08:38,320 --> 00:08:47,710
‫现在, 因为我们在头中使用了这个类型, 我们需要实际获取include并将其从抓取器中删除｡

107
00:08:47,710 --> 00:08:52,960
‫因此, 它们包括物理句柄, 我们需要把它放在抓取器h中,

108
00:08:52,960 --> 00:08:55,150
‫我们要把它放在生成的上面｡

109
00:08:55,400 --> 00:08:58,630
‫这是我们头文件中最后一项内容｡

110
00:08:58,630 --> 00:09:01,810
‫为什么我们不需要在CP中也有它呢？

111
00:09:01,810 --> 00:09:04,840
‫好吧, 因为我们包括了抓钩h｡

112
00:09:04,840 --> 00:09:11,890
‫所以我们在grab, a, H中输入的任何东西都会自动地在C, p中, 所以我们可以把include, 放在那里｡

113
00:09:12,370 --> 00:09:21,790
‫现在我们可以继续定义这个函数, 并称之为get physics句柄, 像这样的一对括号｡

114
00:09:21,790 --> 00:09:29,380
‫我认为这应该是const, 它不应该改变我们的抓取器中的任何东西来调用这个函数｡

115
00:09:29,470 --> 00:09:37,120
‫现在让我们转到CP, 在底部粘贴定义,

116
00:09:37,120 --> 00:09:46,270
‫我将在前面粘贴一个U型冒号, 然后删除分号, 添加一对大括号.

117
00:09:46,270 --> 00:09:57,040
‫我们要做的是把这个, 得到的线去掉, 用物理学来代替｡

118
00:09:58,140 --> 00:10:00,330
‫像这样处理｡

119
00:10:00,330 --> 00:10:07,500
‫然后在get physics句柄中, 我们可以简单地通过类返回get owner find组件, 等等｡

120
00:10:07,500 --> 00:10:13,800
‫现在我们也可以用tick组件来替换它, 我们得到了物理句柄｡

121
00:10:13,830 --> 00:10:18,930
‫让我们用get physics handle替换这一小段代码｡

122
00:10:18,930 --> 00:10:22,920
‫这是一段很小的代码,

123
00:10:22,920 --> 00:10:27,840
‫几乎不值得这么做, 但对于此时的练习和我们现在可能添加一些日志消息并开始播放的事实来说, 这绝对是值得的｡

124
00:10:27,840 --> 00:10:33,030
‫我们实际上根本不需要物理学来处理, 所以我只需要删除那里的代码｡

125
00:10:33,030 --> 00:10:37,350
‫但我要做的是添加一条日志消息｡

126
00:10:37,350 --> 00:10:46,020
‫所以我们要创建一个变量来存储我们的结果, 因为如果我们返回, 然后尝试打印日志消息, 这将不起作用｡

127
00:10:46,020 --> 00:10:53,520
‫我们将有一个新的物理句柄组件, 叫做result, 因为这就是我们要返回的结果｡

128
00:10:53,850 --> 00:11:06,390
‫我们会说如果结果等于空指针, 那么我们需要你记录一个警告, 或者实际上, 一个错误｡

129
00:11:06,390 --> 00:11:14,730
‫我们会说grab a需要一个物理句柄, 然后在if语句之后｡

130
00:11:14,730 --> 00:11:15,840
‫所以这会发生｡

131
00:11:15,840 --> 00:11:21,300
‫无论它是否为null, 我们都将返回结果｡

132
00:11:21,300 --> 00:11:23,880
‫让我们继续编译并检查它是否正常工作｡

133
00:11:23,930 --> 00:11:30,990
‫似乎已经成功了, 我可以看到它一定是工作,

134
00:11:30,990 --> 00:11:38,820
‫因为当我在场景中左点击, 我得到了蓝色或调试球体被绘制, 他们不会被绘制, 如果我们没有得到物理处理组件｡

135
00:11:38,820 --> 00:11:39,390
‫好东西｡

136
00:11:39,390 --> 00:11:48,150
‫所以在这节课上, 我们已经能够用我们的抓取器来抓取我们的石像鬼雕像, 尽管有时它可能有点不可靠｡

137
00:11:48,150 --> 00:11:50,850
‫我们会在接下来的课上解决这个问题｡

138
00:11:50,850 --> 00:11:52,350
‫我们在那里见｡

