﻿1
00:00:04,340 --> 00:00:05,240
‫你好, 欢迎｡

2
00:00:05,240 --> 00:00:12,830
‫在这节课中, 我们将重构代码, 使grab函数更小, 更易读｡

3
00:00:12,830 --> 00:00:15,290
‫我们将再次使用参数｡

4
00:00:15,290 --> 00:00:18,860
‫这一次, 我们实际上要创建一个函数, 它把它作为一个参数｡

5
00:00:18,860 --> 00:00:21,380
‫让我们深入了解一下, 看看如何做到这一点｡

6
00:00:22,130 --> 00:00:29,090
‫因此, 通常最好的做法是将函数放在一个屏幕上｡

7
00:00:29,090 --> 00:00:34,070
‫现在, 在我的情况下, 我的屏幕非常大, 但我们还在学习, 所以它实际上是有意义的,

8
00:00:34,070 --> 00:00:37,490
‫有更小的功能, 使事情可以理解｡

9
00:00:38,030 --> 00:00:46,070
‫我认为这个抓取函数太长了, 所以我认为我们可以把它分成两个功能相当的单元｡

10
00:00:46,070 --> 00:00:52,250
‫第一个是执行扫描的位, 完成所有起始和结束向量的计算,

11
00:00:52,250 --> 00:00:59,480
‫输出命中结果, 以及是否命中, 布尔值表示是否命中.

12
00:00:59,480 --> 00:01:05,900
‫第二位在if语句中, 我们可以把它作为抓取的工作, 因为它实际上是和抓取有关的,

13
00:01:05,900 --> 00:01:08,930
‫对吧？

14
00:01:08,930 --> 00:01:10,790
‫我们必须唤醒僵硬的身体｡

15
00:01:10,790 --> 00:01:16,430
‫我们必须抓取一个有意义的组件, 它位于一个名为grab的函数中调用的方法中｡

16
00:01:16,430 --> 00:01:20,210
‫但其他的东西有点离题｡

17
00:01:20,210 --> 00:01:23,720
‫它更像是一种我们需要利用的工具｡

18
00:01:23,720 --> 00:01:28,580
‫所以我想挑战你们创造这种实用工具, 让它触手可及｡

19
00:01:28,580 --> 00:01:29,870
‫我觉得应该叫这个名字｡

20
00:01:29,870 --> 00:01:33,290
‫我认为这描述了那一堆代码的作用｡

21
00:01:33,290 --> 00:01:37,220
‫因此, 将所有扫描代码提取到一个新私有函数中｡

22
00:01:37,220 --> 00:01:41,600
‫考虑一下它的参数和返回值应该是什么｡

23
00:01:41,600 --> 00:01:43,670
‫请记住, 您有两个输出｡

24
00:01:43,670 --> 00:01:46,760
‫所以我们得到了一个又一个结果｡

25
00:01:46,760 --> 00:01:51,890
‫因此, 您需要考虑尝试使用out参数来使其工作｡

26
00:01:52,040 --> 00:01:58,970
‫现在, 如果你需要一点提示, 我马上会告诉你我将在头文件中放入什么｡

27
00:01:58,970 --> 00:02:01,520
‫如果你不知道, 你可以现在就去暂停视频｡

28
00:02:01,820 --> 00:02:04,340
‫否则, 我会给予你提示｡

29
00:02:04,730 --> 00:02:12,740
‫我们要进入grab H, 在这里我们有物理句柄, 我们有一个布尔返回类型来告诉我们,

30
00:02:12,740 --> 00:02:18,860
‫是否有东西, 我们可以得到, 抓一个球,

31
00:02:18,910 --> 00:02:23,180
‫让我们抓一个够得着的球｡

32
00:02:23,180 --> 00:02:27,650
‫然后我们需要给予它一个out参数.

33
00:02:27,650 --> 00:02:34,040
‫所以它将是一个非常量的引用, 指向F命中结果｡

34
00:02:34,040 --> 00:02:35,630
‫放一个引用｡

35
00:02:36,590 --> 00:02:41,450
‫然后我们称之为alt点击结果｡

36
00:02:41,450 --> 00:02:49,340
‫我认为这不会改变我们的功能, 所以我们可以让它的成本｡

37
00:02:49,340 --> 00:02:52,280
‫如果你已经想到了这一点, 那就有点加分了｡

38
00:02:52,490 --> 00:02:57,860
‫所以继续, 暂停视频, 尝试在C++文件中填写该函数｡

39
00:03:01,090 --> 00:03:01,420
‫好吧, 我会的

40
00:03:01,420 --> 00:03:02,190
‫欢迎回来｡

41
00:03:02,200 --> 00:03:03,010
‫所以我要复制它｡

42
00:03:03,010 --> 00:03:04,960
‫转到C++｡

43
00:03:04,960 --> 00:03:11,800
‫我将把它放在GetPhysicsHandle组件下面, 以匹配头文件中的顺序｡

44
00:03:11,980 --> 00:03:16,930
‫我将在前面添加U形抓取器｡

45
00:03:17,110 --> 00:03:18,520
‫我会把它正确地缩进｡

46
00:03:18,520 --> 00:03:26,890
‫我会用大括号代替分号, 然后移动我们在grab中得到的代码｡

47
00:03:26,890 --> 00:03:36,220
‫从第53行到第65行, 我会把它们全部去掉, 我们马上用其他的东西来代替｡

48
00:03:36,370 --> 00:03:44,710
‫我将把它粘贴进去, 以便在伸手可及的地方抓住一个球, 我们就得到了我们创造的这个击球结果｡

49
00:03:44,710 --> 00:03:53,530
‫我们能做的就是把输出命中结果设置为等于我们这里得到的命中结果｡

50
00:03:53,620 --> 00:03:56,740
‫我们可能只想这样做, 如果我们已经击中｡

51
00:03:56,740 --> 00:04:05,440
‫所以我们可以把if语句hit像这样, 然后把这个赋值, out hit, 包装到if语句里面的hit结果,

52
00:04:05,530 --> 00:04:11,500
‫然后我们可以继续, 在函数的结尾, return

53
00:04:11,500 --> 00:04:18,280
‫hit像这样, 现在这里可以做一个优化或者改进, 因为我们通过引用传递到sweep通道, 然后传递到reach中的grab

54
00:04:18,280 --> 00:04:23,260
‫ball｡

55
00:04:23,260 --> 00:04:28,960
‫我们实际上不需要在这里创建一个新的点击结果, 然后将其复制到点击结果中｡

56
00:04:28,960 --> 00:04:30,250
‫那只是在浪费记忆｡

57
00:04:30,820 --> 00:04:36,490
‫我们能做的是移除我们在内部创建的命中结果,

58
00:04:36,490 --> 00:04:44,980
‫在可及范围内抓取一个球, 取而代之的是, 我们可以使用已经传入的引用直接传入到逐个通道的扫描｡

59
00:04:44,980 --> 00:04:50,440
‫因此, 它实际上是将对函数的引用向下传递到sweep single by channel中,

60
00:04:50,440 --> 00:04:55,840
‫在那里, 它将被填充, 这就不需要if语句, 从而使此函数更快､

61
00:04:55,840 --> 00:04:57,880
‫更易于阅读｡

62
00:04:57,880 --> 00:05:01,510
‫事实上, 我认为我们甚至不需要一个变量来存储命中｡

63
00:05:01,510 --> 00:05:03,790
‫我们可以直接回去｡

64
00:05:03,790 --> 00:05:09,730
‫返回get world sweep通道的结果会更干净｡

65
00:05:09,730 --> 00:05:17,050
‫所以我们只是把结果传递到后面的get grab able in reach或调用它的任何人｡

66
00:05:17,050 --> 00:05:21,970
‫所以说到谁在叫它, 我们现在需要进入我们的抓取｡

67
00:05:21,970 --> 00:05:24,670
‫我们需要在某个地方创造我们的热门结果｡

68
00:05:24,670 --> 00:05:25,690
‫我们必须在这里创造它｡

69
00:05:25,690 --> 00:05:28,150
‫点击结果, 这是我们要填充的结果｡

70
00:05:28,330 --> 00:05:38,320
‫我们将创建一个布尔变量, 它将是hashtkind, 等于在reach中可以抓取的集合｡

71
00:05:38,320 --> 00:05:43,240
‫我们将通过引用传入要填充的命中结果｡

72
00:05:43,240 --> 00:05:49,270
‫如果我们命中了, 我们就继续执行抓取代码｡

73
00:05:49,270 --> 00:05:50,320
‫很棒的东西｡

74
00:05:50,320 --> 00:05:56,590
‫我们已经将一些东西移到了一个函数中, 以使这个抓取函数适合单个屏幕｡

75
00:05:56,590 --> 00:06:05,200
‫我们再次使用了out参数, 这一次为我们自己创建了一个真正使用它们的函数｡

76
00:06:05,200 --> 00:06:07,270
‫下一个视频里见｡

