﻿1
00:00:04,400 --> 00:00:05,210
‫你好, 欢迎｡

2
00:00:05,210 --> 00:00:10,100
‫在这节课中, 我们将学习一个特殊的函数, 叫做构造函数,

3
00:00:10,100 --> 00:00:13,790
‫它允许我们给类中的属性给予默认值｡

4
00:00:13,790 --> 00:00:16,820
‫我们将看到它何时被调用到编辑器中｡

5
00:00:16,820 --> 00:00:18,890
‫让我们深入了解一下｡

6
00:00:19,430 --> 00:00:25,430
‫现在, 对于这个触发器组件, 我想在这里添加一个tick组件函数,

7
00:00:25,430 --> 00:00:32,450
‫这样我们就可以检查哪些组件､ 哪些其他参与者当前与这个触发器组件重叠, 如果它是正确的参与者,

8
00:00:32,450 --> 00:00:37,010
‫我们就可以激活它｡

9
00:00:37,550 --> 00:00:39,890
‫问题是, 好吧, 我们会看到问题是什么｡

10
00:00:39,890 --> 00:00:41,870
‫让我们尝试实现一个tick函数｡

11
00:00:41,870 --> 00:00:50,690
‫如果我们转到grab H来查看tick组件函数的声明应该是什么样子的, 它需要在public部分｡

12
00:00:50,690 --> 00:00:53,450
‫这是一个虚拟的空白, 分笔成交点, 时间差｡

13
00:00:53,450 --> 00:00:56,000
‫有很多参数, 所以我们直接复制它｡

14
00:00:56,030 --> 00:01:04,430
‫转到分笔成交点组件标题, 将其添加到“开始播放”下面, 然后我们将复制该定义,

15
00:01:04,430 --> 00:01:08,570
‫并将其转移到触发器组件中｡

16
00:01:08,570 --> 00:01:13,280
‫有一点我们会注意到, 这里有几个关键词可以去掉｡

17
00:01:13,280 --> 00:01:15,140
‫我们可以删除virtual关键字｡

18
00:01:15,140 --> 00:01:17,030
‫这通常是我们可以遵循的规则｡

19
00:01:17,030 --> 00:01:19,430
‫我们还可以删除override关键字｡

20
00:01:19,430 --> 00:01:22,040
‫这些东西不需要在C++文件中｡

21
00:01:22,190 --> 00:01:24,770
‫我们需要添加类名｡

22
00:01:24,770 --> 00:01:26,330
‫所以您触发了冒号组件｡

23
00:01:26,330 --> 00:01:27,380
‫结肠｡

24
00:01:27,830 --> 00:01:35,870
‫然后, 我们用一些大括号替换分号, 并需要调用超级刻度组件｡

25
00:01:35,870 --> 00:01:43,460
‫因为这是一个相当长的调用, 所以我将从我们的抓取CP中复制它, 并将其粘贴到这个CP中｡

26
00:01:43,460 --> 00:01:49,040
‫它实际上是调用父级的tick组件函数｡

27
00:01:49,040 --> 00:01:52,880
‫所以在这个例子中父组件是box组件｡

28
00:01:52,880 --> 00:02:01,580
‫因此, 调用它是很重要的, 以防有任何功能需要使用和启用才能使该组件工作｡

29
00:02:01,580 --> 00:02:06,890
‫如果我们不这样做, 我们基本上绕过了任何功能, 事情可能会中断｡

30
00:02:06,890 --> 00:02:13,820
‫因此, 在实现开始､ play和tick组件时, 务必始终记住调用super｡

31
00:02:13,820 --> 00:02:17,750
‫现在, 让我们从开始Play复制日志消息, 并将其放在tick组件中｡

32
00:02:17,750 --> 00:02:25,040
‫我们不需要在这里说Tick组件日志记录, 也不需要说Tick组件在这里滴答作响, 我们将继续进行编译,

33
00:02:25,100 --> 00:02:30,740
‫并在编译器完成后查看该Tick是否真正工作, 让我们继续单击播放,

34
00:02:30,740 --> 00:02:34,160
‫打开输出日志｡

35
00:02:34,190 --> 00:02:37,400
‫嗯, 好吧, 现在好像什么都没发生｡

36
00:02:37,400 --> 00:02:45,530
‫其原因是优化明智, 他们自动和虚幻的大多数组件有他们的滴答关闭｡

37
00:02:45,530 --> 00:02:49,880
‫所以演员通常默认打开它, 但组件通常关闭它｡

38
00:02:49,880 --> 00:02:54,890
‫事实上, 如果我们看看其他的一些组件, 比如我们的移动,

39
00:02:54,890 --> 00:02:58,610
‫我们知道ticking确实起作用了, 你可以看到在文件的顶部有这样一个｡

40
00:02:58,610 --> 00:03:06,950
‫你移动一个函数, 它有一个主要的组件, 如果你没有在类上设置这个属性的话,

41
00:03:06,950 --> 00:03:09,740
‫点B可以等于真.

42
00:03:09,740 --> 00:03:15,320
‫这是类的一个属性, 作为经典的主成分tick的属性, 它是一个结构体,

43
00:03:15,320 --> 00:03:19,340
‫其中有一个B可以tick属性.

44
00:03:19,490 --> 00:03:28,490
‫我们在这里所做的就是在构造mover类时, 在它上面设置这个默认值｡

45
00:03:28,490 --> 00:03:29,660
‫这就是这个函数｡

46
00:03:29,660 --> 00:03:37,100
‫它被称为构造函数, 每当我们创建一个新的mover组件时, 就会调用它来自动设置默认值,

47
00:03:37,100 --> 00:03:44,750
‫我们可以在头文件中设置一些默认值, 就像我们在should move move time中所做的那样｡

48
00:03:44,750 --> 00:03:51,800
‫但是, 除了在头文件中重新执行之外, 我们还可以在构造函数中设置这些属性｡

49
00:03:51,800 --> 00:03:57,350
‫现在, 我想让您注意一下这里的语法, 我们将进入移动头文件｡

50
00:03:57,350 --> 00:04:03,320
‫您可以看到, 建构函式的名称与类别完全相同｡

51
00:04:03,320 --> 00:04:12,350
‫因此, you mover是我们的mover组件的类名, 它的构造函数也称为you mover notice｡

52
00:04:12,350 --> 00:04:14,630
‫它也没有返回类型｡

53
00:04:14,630 --> 00:04:19,490
‫返回任何内容都没有意义, 因为我们正在构造一个新对象｡

54
00:04:19,490 --> 00:04:22,820
‫我们只是想让这门课发生｡

55
00:04:22,820 --> 00:04:30,560
‫所以我们只需要访问这个类的属性, 并且注意它被设置为public｡

56
00:04:30,560 --> 00:04:35,180
‫所以它在类定义的public部分｡

57
00:04:35,180 --> 00:04:39,470
‫所以我想挑战你, 让你自己实现滴答声｡

58
00:04:39,470 --> 00:04:44,720
‫所以你要在头中创建一个构造函数, 记住我们在mover和grab a

59
00:04:44,720 --> 00:04:52,130
‫lot of H中看到的语法, 你要启用tick,

60
00:04:52,130 --> 00:04:54,620
‫就像我们在CP文件的其他组件中看到的一样｡

61
00:04:54,620 --> 00:04:57,140
‫所以你可以模仿一下｡

62
00:04:57,290 --> 00:05:02,450
‫您也可以从构造函数中记录日志, 以尝试查看何时调用它？

63
00:05:02,450 --> 00:05:03,610
‫难道是喜欢开始打？

64
00:05:03,780 --> 00:05:07,290
‫还是在开始游戏之前就被调用了？

65
00:05:07,320 --> 00:05:09,840
‫去暂停视频, 试试看｡

66
00:05:12,920 --> 00:05:13,310
‫凯｡

67
00:05:13,310 --> 00:05:14,100
‫欢迎回来｡

68
00:05:14,120 --> 00:05:21,320
‫我们将进入trig组件, 在这里创建一个新的public部分｡

69
00:05:22,070 --> 00:05:26,630
‫我们记住了结尾的冒号然后我们需要调用它和类完全一样.

70
00:05:26,630 --> 00:05:28,040
‫所以这不是触发元件｡

71
00:05:28,040 --> 00:05:33,320
‫这不是你触发的, 这是你触发的组件在充分｡

72
00:05:33,320 --> 00:05:41,600
‫然后我们没有任何参数给这个构造函数, 所以我们只放了一个空括号, 然后在行尾放了一个分号｡

73
00:05:41,600 --> 00:05:46,880
‫现在, 我们可以转到CPP文件, 并在此处进行实现｡

74
00:05:46,880 --> 00:05:48,290
‫同样, 我们不需要返回类型｡

75
00:05:48,290 --> 00:05:58,550
‫所以你只需要触发冒号, 冒号, 你触发的组件有点重复, 但这就是它的工作方式｡

76
00:05:58,550 --> 00:06:07,280
‫然后我们用花括号括起来, 在这里我们可以执行任何设置代码, 为类实例给予默认值｡

77
00:06:07,280 --> 00:06:12,530
‫如果我们去抓取CPP, 看看它是怎么做的,

78
00:06:12,530 --> 00:06:16,670
‫你可以看到它的主成分tick点B可以tick等于true｡

79
00:06:16,670 --> 00:06:17,840
‫让我们把它打出来｡

80
00:06:17,840 --> 00:06:23,540
‫主构件勾号B可以勾号｡

81
00:06:23,540 --> 00:06:31,520
‫B只是一个前缀, 我们经常使用, 当事物的布尔类型用小写的t设置为true时｡

82
00:06:31,670 --> 00:06:39,980
‫因此, 由于对构造函数的更改并不总是在实时编码中得到正确传播, 因此我将关闭编辑器｡

83
00:06:40,100 --> 00:06:47,000
‫我将在Visual Studio代码中重新生成, 然后从EU项目文件重新启动｡

84
00:06:47,000 --> 00:06:52,160
‫完成后, 我将点击“播放”, 查看输出日志,

85
00:06:52,160 --> 00:06:54,890
‫我们可以看到触发器组件正在计时｡

86
00:06:55,130 --> 00:07:00,230
‫我将删除该日志消息, 因为它很烦人, 并关闭Visual

87
00:07:00,230 --> 00:07:04,460
‫Studio代码中的输出日志, 删除tick组件中的该日志消息｡

88
00:07:04,460 --> 00:07:06,020
‫我们可以看到它现在正在工作｡

89
00:07:06,410 --> 00:07:10,910
‫我们要做的是在构造函数中做一个日志｡

90
00:07:11,720 --> 00:07:17,990
‫我们来做一个新的日志, 写上构造, 看看实时编码这次是否能找到它, 然后我们将直接转到输出日志,

91
00:07:17,990 --> 00:07:21,680
‫看一看｡

92
00:07:21,680 --> 00:07:23,750
‫这里什么都没有｡

93
00:07:24,170 --> 00:07:28,370
‫好吧, 如果我继续并点击播放, 我会看到我的输出日志｡

94
00:07:28,370 --> 00:07:33,980
‫我可以看到触发器组件在此之前很久就处于活动状态的日志消息｡

95
00:07:33,980 --> 00:07:39,020
‫事实上, 你可以看到它在创造世界的时候, 它正在建设｡

96
00:07:39,020 --> 00:07:46,400
‫它开始建设非常早之前, 显然开始发挥, 因为我们需要让整个世界准备好之前, 我们开始发挥｡

97
00:07:46,400 --> 00:07:51,440
‫所以当我们点击播放时会发生这种情况, 但实际上它也会发生在编辑器中｡

98
00:07:51,440 --> 00:07:59,300
‫因此, 如果我在这里选择某个参与者, 然后向其添加一个组件并添加触发器, 那么请查看我的输出日志｡

99
00:07:59,300 --> 00:08:03,050
‫然后您可以看到构造消息实际上已打印出来｡

100
00:08:03,050 --> 00:08:10,490
‫所以我们需要小心我们在构造函数中所做的事情, 因为它们实际上是在我们编辑的时候被调用的,

101
00:08:10,490 --> 00:08:14,540
‫C++代码是在我们玩游戏的时候被调用的｡

102
00:08:14,540 --> 00:08:20,000
‫这些对象正在被创建, 因此需要调用它们的构造函数｡

103
00:08:20,090 --> 00:08:30,170
‫我将再次删除触发器, 并通过删除构建日志消息和开始播放日志消息来稍微清理一下｡

104
00:08:30,170 --> 00:08:30,800
‫好东西｡

105
00:08:30,800 --> 00:08:37,430
‫在这节课中,

106
00:08:37,430 --> 00:08:47,720
‫我们已经看到了如何设置我们自己的组件, 使它们与在场景组件和ACT组件模板中创建的组件几乎完全相同, 我们已经看到了如何使用构造函数为类中的属性给予默认值｡

107
00:08:47,720 --> 00:08:49,610
‫我们下节课再见｡

