﻿1
00:00:04,390 --> 00:00:05,440
‫你好, 欢迎｡

2
00:00:05,440 --> 00:00:10,000
‫在这节课中, 我们将为BP播放器添加一个新组件, 物理手柄｡

3
00:00:10,000 --> 00:00:16,060
‫我们将学习如何在抓取器组件中获得指向它的指针｡

4
00:00:16,060 --> 00:00:20,800
‫我们还将学习如何保护自己, 避免意外损坏引擎.

5
00:00:20,800 --> 00:00:23,380
‫让我们深入了解一下｡

6
00:00:24,280 --> 00:00:29,380
‫现在, 为了抓住一个物体, 我们需要与物理系统互动｡

7
00:00:29,380 --> 00:00:37,090
‫实际上有一个组件我们可以使用, 叫做物理句柄,

8
00:00:37,090 --> 00:00:45,760
‫它允许我们抓取物理对象, 告诉它们我们想在世界上的位置, 但是这样做的方式是它承认物理约束, 所以它不会穿过墙壁｡

9
00:00:46,180 --> 00:00:54,880
‫它看起来像是物体在弹簧上而不是严格地跟随我们告诉它去的特定点｡

10
00:00:55,030 --> 00:00:57,910
‫所以我们要用这个物理学来处理组件｡

11
00:00:57,910 --> 00:01:02,230
‫我们将把它和抓取器沿着添加到播放器BP中｡

12
00:01:02,230 --> 00:01:09,790
‫现在, 让我们转到组件窗格下的添加按钮, 查找物理句柄并将其添加进去｡

13
00:01:09,790 --> 00:01:14,290
‫你可以看到它是一个演员组件, 而不是场景组件, 因为它在下面的部分向下,

14
00:01:14,290 --> 00:01:18,460
‫所以它实际上没有自己的物理变换｡

15
00:01:18,460 --> 00:01:26,170
‫我们对物理句柄所做的就是告诉它要抓取的对象, 然后告诉它要把我们抓取的对象放在哪里｡

16
00:01:26,290 --> 00:01:32,050
‫如果您查看文档, 您可以在可用的函数中看到这一点｡

17
00:01:32,060 --> 00:01:41,320
‫如果您向下滚动到函数部分, 可以看到在location function处有一个release组件和一个grab组件｡

18
00:01:41,320 --> 00:01:45,940
‫还有一个设定的目标位置和旋转｡

19
00:01:45,940 --> 00:01:51,160
‫这是它想要尝试和放置对象的地方,

20
00:01:51,160 --> 00:01:56,440
‫但显然它会尊重这样做的任何物理约束, 它会以一种平滑的方式做, 就像它在弹簧上一样｡

21
00:01:56,440 --> 00:02:02,440
‫现在, 我们还不打算使用这些函数, 但我们确实需要找到一种方法,

22
00:02:02,440 --> 00:02:05,470
‫在我们的抓取器组件中获取该组件｡

23
00:02:05,590 --> 00:02:07,780
‫那我们该怎么做呢？

24
00:02:07,780 --> 00:02:15,310
‫好吧, 让我们去我们的抓一个CP, 并有一个在开始播放看看, 并试图得到它｡

25
00:02:15,310 --> 00:02:23,980
‫现在有一个功能可以让我们根据类型找到组件｡

26
00:02:23,980 --> 00:02:27,190
‫但是物理句柄的类型是什么呢？

27
00:02:27,190 --> 00:02:31,180
‫嗯, 这是一个物理学处理组件｡

28
00:02:31,180 --> 00:02:36,670
‫现在, 为了掌握这个类型, 我们需要使用一个include,

29
00:02:36,670 --> 00:02:40,180
‫你可以在文档中看到这个include是物理引擎正斜杠物理句柄组件｡

30
00:02:40,180 --> 00:02:46,420
‫让我们将其复制到“抓取CP”, 并将其添加到“添加绘制调试助手”下｡

31
00:02:46,870 --> 00:02:53,470
‫然后我们要做的是, 用一个get

32
00:02:53,590 --> 00:03:00,370
‫ONA来获取我们的所有指针, 然后用一个箭头, 按类查找组件.

33
00:03:00,370 --> 00:03:07,540
‫这个函数是一种特殊的函数, 在C++中叫做模板函数, 这意味着你可以给它传递一些参数,

34
00:03:07,540 --> 00:03:14,410
‫当你编译的时候, 这些参数会被赋值.

35
00:03:14,410 --> 00:03:19,090
‫你可以用尖括号来表示｡

36
00:03:19,090 --> 00:03:25,330
‫所以你在函数后面加了一个尖括号, 然后给予它你想要的类型, 在我们的例子中就是物理句柄组件,

37
00:03:25,330 --> 00:03:30,910
‫像这样.

38
00:03:30,970 --> 00:03:33,250
‫然后关闭尖括号｡

39
00:03:33,250 --> 00:03:37,660
‫但是因为它是一个函数, 所以你也需要使用正则括号来调用它｡

40
00:03:37,660 --> 00:03:41,680
‫然后你把第二组括号放在这后面｡

41
00:03:41,680 --> 00:03:52,330
‫所以你可以看到这些编译时参数是用尖括号传入的, 然后运行时参数是用圆括号传入的｡

42
00:03:52,630 --> 00:04:01,390
‫就像一个常规函数一样, 它会有一个返回值这里的返回值是我们传入的任何类型.

43
00:04:01,390 --> 00:04:08,680
‫但是作为一个指针, 我们可以取一个物理句柄, 组件指针, 并为它创建一个变量, 我们称之为物理句柄,

44
00:04:08,680 --> 00:04:16,390
‫并将其设置为, get owner find component by class.

45
00:04:16,390 --> 00:04:26,110
‫现在让我们记住在这一行的末尾有一个分号, 这是我们获取同一演员的另一个组件所需要的一切｡

46
00:04:26,110 --> 00:04:34,720
‫现在请记住, 我告诉过你指针可能是危险的, 因为有时它们可能是空的, 这可能会导致崩溃｡

47
00:04:34,720 --> 00:04:42,100
‫想象一下, 我们忘记在演员身上放一个物理句柄组件, 或者我们在一个新演员身上放了一个抓取器,

48
00:04:42,100 --> 00:04:46,180
‫但我们还没有把它和物理句柄组件连接起来｡

49
00:04:46,180 --> 00:04:52,510
‫如果是这种情况, 则物理句柄指针将是空指针｡

50
00:04:52,510 --> 00:04:59,020
‫如果我们试图在指针上使用箭头操作符或取消引用操作符, 它会使引擎崩溃,

51
00:04:59,020 --> 00:05:03,340
‫有时候很难看到崩溃的样子｡

52
00:05:03,340 --> 00:05:10,000
‫所以我会继续, 实际上造成这个崩溃, 只是为了向你们展示,

53
00:05:10,000 --> 00:05:18,010
‫你们也许能够识别出来, 如果将来发生在你们身上, 我会重新分配物理句柄指针, 使其等于空指针｡

54
00:05:19,060 --> 00:05:20,320
‫特殊关键字｡

55
00:05:20,320 --> 00:05:21,630
‫都是空的｡

56
00:05:21,640 --> 00:05:24,550
‫在C++中, 空指针就是这样拼写的｡

57
00:05:24,550 --> 00:05:28,030
‫然后你在最后加一个分号,

58
00:05:28,030 --> 00:05:32,410
‫然后我们要做的是物理, 处理箭头, 这样得到名字｡

59
00:05:32,620 --> 00:05:38,200
‫如果我们继续使用实时编码进行编译, 当编译完成时,

60
00:05:38,200 --> 00:05:43,790
‫我们将继续确保, 首先, 我们保存存在重放中正在进行的任何内容,

61
00:05:43,840 --> 00:05:50,140
‫因为我将使引擎崩溃, 如果我继续点击播放, 这将导致崩溃｡

62
00:05:50,140 --> 00:05:55,390
‫当你看到这个的时候, 你可能会想, 虚幻出了什么问题,

63
00:05:55,390 --> 00:05:58,440
‫但实际上是你的代码出了问题｡

64
00:05:58,450 --> 00:06:06,220
‫您可以看到, 在这个崩溃报告中, 第一行表示问题来自于您抓取冒号, 冒号,

65
00:06:06,250 --> 00:06:08,230
‫开始播放｡

66
00:06:08,230 --> 00:06:11,760
‫实际上, 它还提供了行号, 即第28行｡

67
00:06:11,770 --> 00:06:18,490
‫所以你可以看到在第28行, 当我们引用这个指针,

68
00:06:18,490 --> 00:06:26,800
‫为了调用一个函数, 我们犯了一个严重的错误, 没有首先检查这个指针是否为空｡

69
00:06:26,860 --> 00:06:28,330
‫所以这就是我们要做的｡

70
00:06:28,330 --> 00:06:29,710
‫我们用if语句来实现｡

71
00:06:29,710 --> 00:06:41,440
‫我们基本上可以说, 如果物理句柄不等于空指针, 那么我们可以继续调用物理句柄上的内容, 这样我们就可以将物理句柄, get

72
00:06:41,440 --> 00:06:46,900
‫name放在if语句中,

73
00:06:46,900 --> 00:06:53,380
‫这样就可以保护我们, 因为在指针为空的情况下, D引用代码将不会执行｡

74
00:06:53,380 --> 00:06:58,330
‫所以我现在要删除第27行, 在那里我们将它设置为空指针｡

75
00:06:58,330 --> 00:07:02,710
‫我将挑战你们自己打印组件名称｡

76
00:07:02,710 --> 00:07:10,930
‫因此, 只有当我们有实际的组件时才打印, 基本上我们没有空指针,

77
00:07:10,930 --> 00:07:19,180
‫如果我们没有设法获得该组件, 则使用else来警告, 并尝试删除要检查的组件, 暂停视频, 然后开始｡

78
00:07:22,290 --> 00:07:22,770
‫好吧, 我会的

79
00:07:22,770 --> 00:07:23,690
‫欢迎回来｡

80
00:07:23,700 --> 00:07:33,600
‫我们要在这里创建一个新的日志消息, 我们要说得到了物理句柄, 冒号, percent, sx,

81
00:07:33,600 --> 00:07:43,260
‫我们得到了这个物理句柄的名称, 我只需要将它剪切并粘贴到U日志中, 作为第二个参数或第四个参数｡

82
00:07:43,320 --> 00:07:46,950
‫我会放一个星星因为它是一个字符串｡

83
00:07:46,950 --> 00:07:50,250
‫现在, 让我们在if语句下面添加一个else语句｡

84
00:07:50,250 --> 00:07:55,500
‫在这里, 我们将放置另一个U日志, 这一次将代替显示,

85
00:07:55,500 --> 00:08:02,340
‫我们将放置一个警告类型的消息, 它将以黄色显示, 我们将说“未找到物理句柄”,

86
00:08:02,640 --> 00:08:07,350
‫感叹号｡

87
00:08:07,350 --> 00:08:12,960
‫现在我还没有打开编辑器, 所以我将执行Control Shift B以在Visual

88
00:08:12,960 --> 00:08:17,820
‫Studio代码中进行构建, 当构建成功时关闭终端, 然后从新项目重新启动｡

89
00:08:17,820 --> 00:08:25,440
‫启动后, 让我们继续单击“播放”, 打开输出日志, 我们应该会看到日志消息｡

90
00:08:25,440 --> 00:08:28,440
‫得到了物理句柄的名称｡

91
00:08:28,440 --> 00:08:29,790
‫有趣的是, 物理处理｡

92
00:08:29,970 --> 00:08:41,160
‫现在, 如果我们转到哔哔声播放器, 删除物理句柄, 然后继续播放.

93
00:08:41,160 --> 00:08:48,840
‫现在看一下我们的输出日志, 他们说, 我们有一个黄色警告, 没有物理句柄被发现｡

94
00:08:48,840 --> 00:08:50,040
‫所以让我们停止玩｡

95
00:08:50,070 --> 00:08:55,860
‫让我们继续添加物理句柄, 因为我们将需要它, 我们保存播放器｡

96
00:08:55,860 --> 00:08:57,090
‫哔, 很棒的东西｡

97
00:08:57,090 --> 00:09:03,570
‫所以我们已经知道了如何从一个组件中获取其他组件, 我们也知道了如何处理空指针,

98
00:09:03,570 --> 00:09:08,820
‫以及为什么我们需要小心｡

99
00:09:08,850 --> 00:09:10,500
‫我们下节课再见｡

