﻿1
00:00:04,370 --> 00:00:05,390
‫你好, 欢迎｡

2
00:00:05,390 --> 00:00:12,170
‫在这节课中, 我们将使用一种叫做依赖注入的技术, 在推动器和触发器之间建立链接,

3
00:00:12,170 --> 00:00:20,810
‫这样在课结束时, 如果我们把石像鬼插进去, 门就会向下移动, 或者至少部分向下移动｡

4
00:00:20,810 --> 00:00:24,260
‫让我们深入了解一下它是如何工作的｡

5
00:00:25,080 --> 00:00:26,460
‫我拿了一个杯子｡

6
00:00:26,490 --> 00:00:33,030
‫我们已经看到了一个依赖关系, 我们称之为物理句柄的依赖关系｡

7
00:00:33,030 --> 00:00:42,960
‫这个抓取器不能做它的工作, 除非你有一个物理处理组件在周围的某个地方, 现在它只是碰巧触发组件是相同的｡

8
00:00:42,960 --> 00:00:50,100
‫触发器组件为了正常工作, 需要能够访问移动器组件｡

9
00:00:50,460 --> 00:00:57,360
‫然而, 在这个例子中有点棘手, 因为当然,

10
00:00:57,360 --> 00:01:02,400
‫在我们的秘密门的例子中, 触发器和移动的物体在同一个演员体内｡

11
00:01:02,730 --> 00:01:08,220
‫因此, 您可以通过查找参与者上类型的a组件来获取对象｡

12
00:01:08,220 --> 00:01:14,490
‫但是如果在我的剧本中有这样的情况呢, 我想让我的触发器在房间的另一个地方,

13
00:01:14,490 --> 00:01:20,760
‫而演员移动得很好, 以允许这种灵活性｡

14
00:01:20,760 --> 00:01:26,940
‫我们希望触发器不必去寻找它自己的依赖项｡

15
00:01:26,940 --> 00:01:30,330
‫实际上, 这种程序概念有一个名称｡

16
00:01:30,330 --> 00:01:32,640
‫这叫做依赖注入｡

17
00:01:32,640 --> 00:01:37,680
‫基本上, 就是这样一种情况, 我们得到了一个东西, 我需要另一个对象,

18
00:01:37,680 --> 00:01:40,230
‫但是我自己找不到, 或者我不想自己找到｡

19
00:01:40,290 --> 00:01:47,940
‫通常明智的做法是, 不要把它留给正在做自己工作的对象, 让它有另一项工作,

20
00:01:47,940 --> 00:01:50,850
‫试图抓住一个对象｡

21
00:01:51,300 --> 00:02:02,730
‫因此, 我们可以这样做, 创建一个机制, 蓝图告诉触发器组件在哪里找到一个移动器｡

22
00:02:02,910 --> 00:02:09,330
‫我们要做的就是在我们的触发器组件上创建一个蓝图可调用函数｡

23
00:02:09,810 --> 00:02:11,220
‫所以这将是公开的｡

24
00:02:11,220 --> 00:02:16,980
‫我们将把它放在tick组件下面的public部分, 它将是一个U函数, 这样它就可以放在括号中,

25
00:02:16,980 --> 00:02:22,710
‫蓝图可调用｡

26
00:02:23,280 --> 00:02:26,130
‫这个函数并不需要太多的东西｡

27
00:02:26,130 --> 00:02:33,330
‫它将是void的, 因为它不需要返回一个东西,

28
00:02:33,330 --> 00:02:43,620
‫但是它将被设置为mover, 所以它将设置一个到mover的链接, 为了设置一个到mover的链接, 它需要接收一个指向mover组件的指针.

29
00:02:43,620 --> 00:02:52,440
‫这就是你的mover, 星星, 我们可以把它叫做mover, 就像这样, 在行尾放上分号.

30
00:02:52,830 --> 00:02:55,350
‫我们得把它藏起来｡

31
00:02:55,350 --> 00:02:57,300
‫所以我们要创建一个新的私有变量｡

32
00:02:57,300 --> 00:03:04,530
‫它不是一个新的属性, 它只是一个U移动指针, 我们也称之为移动指针.

33
00:03:04,560 --> 00:03:15,660
‫就像这样, 我们要做的是在CPP中实现这个集合移动器, 这样它就把这个移动设置为一个指针, 默认情况下这个指针是空的.

34
00:03:16,050 --> 00:03:17,790
‫我们还得做一件事｡

35
00:03:17,790 --> 00:03:20,640
‫我们必须包含mover的头文件｡

36
00:03:21,150 --> 00:03:26,370
‫在本例中, 由于头文件与触发器组件位于同一个文件夹中,

37
00:03:26,370 --> 00:03:38,100
‫因此我们所要做的就是散列include quote mover H, 这将确保触发器组件能够识别mover类型｡

38
00:03:38,280 --> 00:03:40,230
‫现在我们来看看触发器组件｡

39
00:03:40,230 --> 00:03:46,530
‫我将把它放在tick组件下面, 我们将实现集合移动器｡

40
00:03:46,530 --> 00:03:52,500
‫我们将把触发组件的类放在前面并缩进它｡

41
00:03:53,400 --> 00:03:55,590
‫删除分号并添加大括号｡

42
00:03:55,590 --> 00:04:00,150
‫基本上我们要做的就是, 在C++文件中改变名字.

43
00:04:00,150 --> 00:04:06,060
‫实际上, 参数的名称在头文件和C++之间是否匹配并不重要｡

44
00:04:06,060 --> 00:04:12,540
‫所以我们可以在这里改变它, 说新的动子是集合动子的输入｡

45
00:04:12,630 --> 00:04:20,010
‫所以我们可以设置本地变量, 类变量mover等于新的mover｡

46
00:04:20,010 --> 00:04:27,030
‫所以现在,

47
00:04:27,030 --> 00:04:34,170
‫不要跳过重命名这一步是非常重要的, 因为如果输入参数和类中的变量同名, 那么unreal默认会将其设置为错误.

48
00:04:34,170 --> 00:04:39,720
‫这就是所谓的阴影,

49
00:04:39,720 --> 00:04:46,260
‫Unreal不希望你这样做, 所以你现在需要确保你的参数名称与变量不同, 因为这些新函数并不总是与实时代码更改一起出现｡

50
00:04:46,260 --> 00:04:52,920
‫我将关闭编辑器, 从Visual Studio代码重新编译, 然后从新项目重新启动｡

51
00:04:52,950 --> 00:04:58,950
‫现在, 让我们转到内容抽屉,

52
00:04:58,950 --> 00:05:06,080
‫打开秘密墙蓝图, 然后从事件图中的“开始播放”节点开始, 让我们从这里开始搜索集合移动器｡

53
00:05:06,090 --> 00:05:08,190
‫注意这里有两个选项｡

54
00:05:08,190 --> 00:05:15,750
‫一个是设置组件, 也称为移动器, 另一个是触发器组件上的函数｡

55
00:05:15,750 --> 00:05:18,840
‫因此, 我们要选择触发器组件上的函数｡

56
00:05:19,050 --> 00:05:28,110
‫然后我们要做的是把我们的mover组件作为其他参数拖到这个函数中, 这样就可以了｡

57
00:05:28,110 --> 00:05:31,350
‫它把移动器设置在开始播放｡

58
00:05:31,350 --> 00:05:37,800
‫所以现在我们要做的是, 我们的触发器组件应该在这里设置和设置should

59
00:05:37,800 --> 00:05:41,400
‫move布尔值｡

60
00:05:41,400 --> 00:05:46,110
‫所以这就是我对你们的挑战, 在mover和mover中创建一些公共函数｡

61
00:05:46,110 --> 00:05:51,780
‫CP它应该被设置, 应该移动, 应该更新你的属性变量｡

62
00:05:51,780 --> 00:05:56,970
‫事实上, 您可以不再将它设置为新属性, 因为我们现在将通过代码设置它,

63
00:05:56,970 --> 00:05:59,760
‫然后您可以将它放在public部分｡

64
00:05:59,760 --> 00:06:04,740
‫它必须是公共的, 因为我们将尝试从触发器组件访问它｡

65
00:06:04,740 --> 00:06:11,850
‫你可以在移动指针上调用它, 我们在tick组件设置的触发器组件中得到了这个指针, 相应的布尔值,

66
00:06:11,850 --> 00:06:18,960
‫不管我们想让它解锁还是再次锁定, 暂停视频, 然后开始｡

67
00:06:22,250 --> 00:06:23,690
‫好的欢迎回来

68
00:06:23,690 --> 00:06:29,410
‫我将删除should move的属性,

69
00:06:29,420 --> 00:06:39,800
‫我将转到TTIC组件下的public部分, 我将创建一个void集should move, 取一个布尔值, 我们将这样调用should

70
00:06:39,800 --> 00:06:43,010
‫move｡

71
00:06:43,280 --> 00:06:51,560
‫然后我们将把它移到移动CP并实现它, 替换分号,

72
00:06:51,560 --> 00:07:00,920
‫添加你移动冒号, 冒号类, 基本上我们可以称之为新的应该移动,

73
00:07:00,920 --> 00:07:08,030
‫我们可以说应该移动等于新的应该移动｡

74
00:07:08,030 --> 00:07:14,660
‫现在你可能想知道, 为什么我们不把变量本身设为可公开访问的, 这样我们就可以直接设置它们了？

75
00:07:14,780 --> 00:07:24,620
‫在C++中, 这通常不是一个好的做法, 因为如果你让别人更改你的变量, 你永远不知道他们会发生什么｡

76
00:07:24,620 --> 00:07:32,090
‫如果你有一个方法来帮你做这件事,

77
00:07:32,090 --> 00:07:39,920
‫它允许你以后改变你构造内部变量的方式, 而不必改变你的公共函数, 这意味着你需要对不同的类做更少的更新｡

78
00:07:39,920 --> 00:07:46,850
‫所以一般来说, 如果我们需要访问其他类中的变量, 我们总是使用setter和getter｡

79
00:07:46,850 --> 00:07:53,570
‫现在, 我们已经创建了新函数, 让我们转到trig组件CP, 我们当前在该组件中获得了日志消息｡

80
00:07:53,570 --> 00:08:01,670
‫我们要做的是访问我们的移动指针, 所以我们要做的是移动箭头集应该移动｡

81
00:08:01,670 --> 00:08:06,140
‫在我们有一个可以接受的演员的情况下, 这应该是真的｡

82
00:08:06,140 --> 00:08:08,600
‫我们应该把行尾的分号移一下｡

83
00:08:08,690 --> 00:08:12,200
‫在其他情况下, 我们可能不应该｡

84
00:08:12,200 --> 00:08:20,510
‫所以我们要移动箭头集合, 应该移动, 在括号里, 加上false,

85
00:08:20,510 --> 00:08:26,780
‫去掉我在方法末尾的多余的R, 现在我们重新编译, 因为我只在C++中添加了这个函数,

86
00:08:26,780 --> 00:08:30,020
‫它不是蓝图可调用的｡

87
00:08:30,020 --> 00:08:34,940
‫我不认为我需要真正重新启动编辑器的这个功能的工作, 关闭我们的输出日志, 走向我们的石像鬼,

88
00:08:34,940 --> 00:08:39,530
‫并开始发挥和拿起他｡

89
00:08:39,770 --> 00:08:49,400
‫我们从笼子里出来, 把它放到壁龛里, 然后他们说, 它在向下移动,

90
00:08:49,400 --> 00:08:56,600
‫但滴水嘴福尔斯出来它就停了, 这并不理想, 因为滴水嘴并没有固定到位,

91
00:08:56,600 --> 00:08:59,060
‫墙也没有完全放下.

92
00:08:59,150 --> 00:09:03,020
‫因为它是模拟物理学的, 所以它会从那个凹室里弹出来, 是吗？

93
00:09:03,020 --> 00:09:11,780
‫所以我们需要做的是确保一旦我们把它放进触发区域, 它就固定在那里, 不动了｡

94
00:09:11,780 --> 00:09:14,210
‫所以这将是下一节课的主题｡

95
00:09:14,210 --> 00:09:15,200
‫我会看到你在那里｡

