﻿1
00:00:04,130 --> 00:00:05,550
‫欢迎回来

2
00:00:05,570 --> 00:00:10,940
‫在这个视频中, 我们将创建一个倒计时器,

3
00:00:10,940 --> 00:00:16,250
‫这样玩家就可以知道他们需要等待多长时间才能开始移动坦克并炸毁东西｡

4
00:00:16,250 --> 00:00:22,280
‫我们将在倒计时器中显示游戏开始前的剩余时间｡

5
00:00:22,280 --> 00:00:25,580
‫让我们跳到编辑器中开始执行此操作｡

6
00:00:25,850 --> 00:00:34,160
‫现在我在我们的Widget Blueprint中, BP Start Game Widget, 这是我们看到的Widget编辑器｡

7
00:00:34,160 --> 00:00:39,560
‫但您可能已经注意到在右上角, 这里有两个选项卡, 一个写着设计师｡

8
00:00:39,560 --> 00:00:42,890
‫这就是我们现在所处的位置, 一个叫做图表的位置｡

9
00:00:42,890 --> 00:00:53,180
‫如果您单击图表, 它看起来更像是一个带有事件节点的蓝图事件图表, 以及一个带有多个部分的“我的蓝图”选项卡｡

10
00:00:53,180 --> 00:00:56,120
‫这是我们可以做蓝图逻辑地方

11
00:00:56,120 --> 00:00:57,920
‫现在我们有三个节点｡

12
00:00:57,920 --> 00:01:00,080
‫我们有事件预构造｡

13
00:01:00,080 --> 00:01:07,910
‫这类似于C++中的构造函数, 然后我们有类似于开始play的事件构造｡

14
00:01:07,910 --> 00:01:18,500
‫所以在游戏开始时做这些比较合适因为所有相关的类都是在这一点上构造的然后我们就有了事件节拍.

15
00:01:18,500 --> 00:01:24,020
‫就像C++中的tick函数一样, 我们可以在这里访问Delta时间｡

16
00:01:24,020 --> 00:01:30,650
‫现在我们不使用前两个节点, 所以我将突出显示它们并将其删除, 然后使用事件技术｡

17
00:01:30,650 --> 00:01:40,100
‫现在, 我们这个视频的目标是显示还有多少时间, 我们现在有一个三秒倒计时器在C++中｡

18
00:01:40,100 --> 00:01:45,260
‫我们创建了一个计时器句柄, 并使用世界计时器管理器来启动计时器｡

19
00:01:45,260 --> 00:01:49,010
‫我们在蓝图里做的一切都与此无关｡

20
00:01:49,040 --> 00:01:57,470
‫我们在这里创建了一个完全不同的逻辑系统, 它正好与我们在C++中设置的计时器一致｡

21
00:01:57,470 --> 00:02:02,090
‫因此, 这与C++方面完全不同, 并且是独立的｡

22
00:02:02,120 --> 00:02:10,850
‫现在在WB开始游戏小部件中, 我们可以添加变量, 就像我们可以在C++中添加变量一样｡

23
00:02:10,850 --> 00:02:19,340
‫在我的蓝图下, 我可以点击添加和选择变量, 现在我有一个名为新变量下划线零的变量｡

24
00:02:19,340 --> 00:02:26,870
‫在下面的详细信息面板中, 它位于左侧, 令人困惑, 现在我们有变量名和变量类型｡

25
00:02:26,870 --> 00:02:33,380
‫现在默认情况下它被突出显示了, 因为它只是希望你在创建变量后立即重命名它们｡

26
00:02:33,380 --> 00:02:35,690
‫因此, 我们不需要这个默认名称｡

27
00:02:35,690 --> 00:02:37,820
‫我们要用我们自己的名字来称呼它｡

28
00:02:37,820 --> 00:02:39,290
‫我打算叫它倒计时｡

29
00:02:39,290 --> 00:02:47,360
‫Countdown是一个浮点变量Y, 因为它用来记录我们还剩多少时间.

30
00:02:47,360 --> 00:02:55,400
‫我将从3秒开始, 每一帧我都要减去从上一帧开始的时间.

31
00:02:55,400 --> 00:02:59,750
‫所以我们从三开始倒计时｡

32
00:02:59,750 --> 00:03:01,880
‫现在, 我将单击“Compile（编译）”｡

33
00:03:01,910 --> 00:03:07,820
‫现在, 只要我单击compile, 我就可以通过向下滚动详细信息来为它给予一个默认值｡

34
00:03:07,820 --> 00:03:10,550
‫面板, 默认情况下设置为零｡

35
00:03:10,550 --> 00:03:16,100
‫我将默认设置为3, 因为我们有3秒的倒计时｡

36
00:03:16,100 --> 00:03:22,040
‫现在的时间是这样的, 这只是一个名为Countdown的浮点数, 值为3｡

37
00:03:22,040 --> 00:03:28,490
‫实际上我们并没有改变它, 但是游戏的每一帧, 我都想减去Delta时间,

38
00:03:28,490 --> 00:03:32,660
‫也就是从上一帧开始的时间.

39
00:03:32,660 --> 00:03:41,120
‫这样的话, Countdown会不断地更新增量时间, 这样我们就有了一个运行时间计数｡

40
00:03:41,150 --> 00:03:42,980
‫现在, 我们可以这样做｡

41
00:03:42,980 --> 00:03:50,870
‫我将从“My Blueprint”（我的蓝图）选项卡中获取倒计时, 单击并将其拖动到事件图中, 然后释放｡

42
00:03:50,870 --> 00:03:53,480
‫现在, 一旦我释放, 我有两个选择｡

43
00:03:53,480 --> 00:03:56,060
‫获取倒计时并设置倒计时｡

44
00:03:56,060 --> 00:04:02,090
‫如果我点击Get Countdown, 现在我有了一个倒计时音符, 如果我点击并拖出它的输出,

45
00:04:02,120 --> 00:04:05,240
‫我就可以访问Countdown的值｡

46
00:04:05,240 --> 00:04:12,310
‫现在, 我还可以单击“Countdown”, 拖动并单击“Set Countdown”, 这样就有了一个设置节点｡

47
00:04:12,320 --> 00:04:13,910
‫我们以前见过这两种情况｡

48
00:04:13,910 --> 00:04:23,210
‫在之前的视频中, 设置器的输入引脚允许我们插入浮点值, 然后将倒计时设置为该值｡

49
00:04:23,210 --> 00:04:30,260
‫那么, 我们如何从倒计时中减去Delta时间, 然后将其设置为倒计时值呢？

50
00:04:30,260 --> 00:04:37,820
‫我们可以把倒计时节点放在这里, 我可以点击并拖动它, 在键盘上输入减号,

51
00:04:37,850 --> 00:04:41,600
‫然后选择“减”节点｡

52
00:04:41,600 --> 00:04:47,660
‫如果我选择了它, 那么我现在就有了一个float减float或subtract节点｡

53
00:04:47,660 --> 00:04:50,960
‫您会看到它显示Target是Kismet数学库｡

54
00:04:50,960 --> 00:04:54,800
‫这告诉您Kismet数学库支持此节点｡

55
00:04:54,800 --> 00:04:58,100
‫所有节点的核心都有C++代码｡

56
00:04:58,310 --> 00:05:01,460
‫所以这个节点的作用是接受两个输入｡

57
00:05:01,490 --> 00:05:03,500
‫它接受浮点输入｡

58
00:05:03,560 --> 00:05:05,370
‫它需要第二个浮点输入｡

59
00:05:05,390 --> 00:05:09,560
‫它不会改变我们传递的任何变量｡

60
00:05:09,590 --> 00:05:16,700
‫它只是执行一个计算, 并返回减法的结果.

61
00:05:16,730 --> 00:05:24,140
‫现在,

62
00:05:24,140 --> 00:05:31,910
‫我想倒计时并从中减去Delta时间, 这样我就可以从事件节拍节点中取出Delta时间中称为的输出引脚, 并将其直接插入减法节点的第二个输入｡

63
00:05:31,970 --> 00:05:38,520
‫我现在要做的就是倒计时减去增量时间, 然后得到结果｡

64
00:05:38,540 --> 00:05:43,660
‫现在, 最初倒计时为3秒, 增量时间是一个非常小的值｡

65
00:05:43,670 --> 00:05:47,900
‫它是自上一帧以来经过的时间量（以秒为单位）｡

66
00:05:47,900 --> 00:05:50,000
‫所以这是一个很小的量｡

67
00:05:50,000 --> 00:05:56,490
‫所以第一次执行的结果是3减去一个很小的量｡

68
00:05:56,510 --> 00:06:01,880
‫我想做的是设置倒计时的值等于这个结果, 每一帧｡

69
00:06:01,880 --> 00:06:06,500
‫所以每一帧的倒计时都是一点一点地被减去的｡

70
00:06:06,500 --> 00:06:10,940
‫这样倒计时就会从3秒开始一直往下｡

71
00:06:10,940 --> 00:06:18,490
‫我将从这个减法节点获取返回结果, 并将其插入到设置倒计时节点的输入中｡

72
00:06:18,500 --> 00:06:25,070
‫现在, 如果不将执行线从事件､ 滴答执行引脚连接到设置倒计时的输入引脚,

73
00:06:25,070 --> 00:06:28,400
‫这将不会有任何作用｡

74
00:06:28,400 --> 00:06:37,850
‫所以现在它所做的就是每一帧从Countdown中减去Delta时间, 得到结果并将Countdown设置为新的值｡

75
00:06:37,880 --> 00:06:41,000
‫现在我们可以看到它在打印字符串节点中的行为｡

76
00:06:41,000 --> 00:06:47,210
‫所以我将从setter类型中拖出print字符串, 得到一个print字符串节点.

77
00:06:47,210 --> 00:06:53,390
‫然后我想打印出countdown的值, 这样我就可以从setter中得到返回值, setter会给予我们每一帧的新值,

78
00:06:53,390 --> 00:06:59,330
‫然后把它插入到in string节点中.

79
00:06:59,480 --> 00:07:05,750
‫注意我看到了一个将浮点数转换为字符串的转换节点, 如果我现在释放, 我会得到一个转换节点,

80
00:07:05,750 --> 00:07:10,400
‫它会把浮点数转换成字符串, 现在我们可以把它打印到屏幕上｡

81
00:07:10,400 --> 00:07:13,010
‫现在让我们看看如果我按播放会发生什么｡

82
00:07:13,490 --> 00:07:14,450
‫你看

83
00:07:14,450 --> 00:07:24,590
‫我们看到每一帧都记录了这个计数, 我们在屏幕上乱发了这个计数的值, 而且它越来越负｡

84
00:07:24,590 --> 00:07:29,080
‫这是让倒计时器工作的第一步｡

85
00:07:29,090 --> 00:07:30,800
‫我现在要把它关上｡

86
00:07:30,800 --> 00:07:34,940
‫我们看到我们正在打印一个浮点值, 它有一堆小数点｡

87
00:07:34,940 --> 00:07:40,400
‫一旦我们把值打印到屏幕上, 我们不需要小数点, 我们需要整数｡

88
00:07:40,400 --> 00:07:46,640
‫所以我想看看剩下的秒数没有小数点右边的尾随数字｡

89
00:07:46,640 --> 00:07:48,410
‫所以我需要一个整数｡

90
00:07:48,410 --> 00:07:53,930
‫我能做的就是删除这个转换节点, 然后取倒计时设置器的结果, 然后输入C,

91
00:07:53,930 --> 00:08:01,730
‫E, I, 'll, seal, 是seal的缩写｡

92
00:08:01,760 --> 00:08:08,750
‫密封操作将取一个浮点值, 并将其向上舍入为最接近的整数｡

93
00:08:08,750 --> 00:08:12,320
‫所以如果我们数到三, 就没必要四舍五入了｡

94
00:08:12,320 --> 00:08:15,680
‫它将返回一个值为3的整数｡

95
00:08:15,680 --> 00:08:22,430
‫但如果我们在2｡  9, 那么封印节点会将其四舍五入为3｡

96
00:08:22,430 --> 00:08:29,480
‫当这个值减小时, 它会继续返回3, 直到减到2｡

97
00:08:29,480 --> 00:08:31,970
‫所以我们总是得到一个整数｡

98
00:08:31,970 --> 00:08:37,640
‫现在我可以把它插入到打印字符串中, 你会看到它写着Convert integer to string.

99
00:08:37,640 --> 00:08:45,410
‫所以现在seal节点取一个浮点数, 将其四舍五入到最接近的整数, 然后返回该整数值｡

100
00:08:45,410 --> 00:08:51,530
‫现在如果我点击播放, 我们会看到3比1和0｡

101
00:08:51,530 --> 00:08:56,660
‫当然, 它会继续下降, 因为我们从来没有告诉它实际上停止｡

102
00:08:56,660 --> 00:09:02,120
‫但这是一个很好的开始, 因为现在我们可以访问剩余的秒数,

103
00:09:02,120 --> 00:09:05,060
‫我们可以在屏幕上打印一些东西作为响应｡

104
00:09:05,330 --> 00:09:09,560
‫那么, 我们如何将正确的消息打印到屏幕上呢？

105
00:09:09,590 --> 00:09:15,050
‫我想做的是, 当我们还剩3秒时, 我想让小部件说, 准备好｡

106
00:09:15,170 --> 00:09:18,980
‫当我们还剩2秒的时候, 我希望你展示一下数字2｡

107
00:09:18,980 --> 00:09:22,130
‫当我们还有一秒钟的时候, 我想展示一下一号｡

108
00:09:22,130 --> 00:09:27,140
‫当我们还剩0秒时, 我希望文本说Go｡

109
00:09:27,140 --> 00:09:35,360
‫我们可以用一个开关节点来实现, 开关节点可以在许多不同的类型上进行切换, 包括INT｡

110
00:09:35,390 --> 00:09:41,840
‫int节点上的开关的工作方式是它有很多种情况, 对应很多个值｡

111
00:09:41,840 --> 00:09:47,510
‫根据我们传递给该交换机节点的值, 它将执行以下操作之一｡

112
00:09:47,540 --> 00:09:54,410
‫例如, 如果我们传入整数值3, 则会得到3 case,

113
00:09:54,410 --> 00:09:56,600
‫这将导致执行第三件事｡

114
00:09:56,600 --> 00:10:03,230
‫因此, 终端节点上的交换机有多个执行行, 它将只执行其中一行｡

115
00:10:03,320 --> 00:10:04,250
‫的投入｡

116
00:10:04,280 --> 00:10:12,200
‫现在, 我们可以在int节点上使用开关, 并传入一个整数, 例如seal节点的结果｡

117
00:10:12,320 --> 00:10:18,410
‫我将删除print字符串, 然后拖动倒计时节点, 键入switch on INT, 选择switch

118
00:10:18,410 --> 00:10:21,980
‫on int｡

119
00:10:22,010 --> 00:10:25,360
‫现在请注意, 它接受一个integer类型的输入｡

120
00:10:25,370 --> 00:10:31,880
‫我将从seal节点传入返回值, 同时注意到我们有一个添加pin选项｡

121
00:10:31,880 --> 00:10:39,470
‫如果我们单击它, 您会看到除了输出为零之外, 还有一个默认引脚｡

122
00:10:39,650 --> 00:10:48,500
‫这意味着, 如果我们从零执行引脚连接一些蓝图逻辑, 则该逻辑将被执行｡

123
00:10:48,530 --> 00:10:56,170
‫如果传入的输入值为零, 并且如果它不正确, 则它将默认为该执行引脚｡

124
00:10:56,180 --> 00:11:00,470
‫现在, 我们可以再次单击添加引脚, 现在我们有0和1｡

125
00:11:00,470 --> 00:11:05,150
‫所以我们可以有两行执行, 一行为0, 一行为1｡

126
00:11:05,150 --> 00:11:11,760
‫如果输入不是0或1, 那么连接到默认值的任何东西都会被执行｡

127
00:11:11,780 --> 00:11:14,930
‫我将再按两次加号｡

128
00:11:14,930 --> 00:11:19,370
‫我们有案例0到案例3和默认案例｡

129
00:11:19,370 --> 00:11:26,540
‫现在, 我们需要拖动它, 并添加一些蓝图逻辑,

130
00:11:26,540 --> 00:11:30,680
‫我们希望基于从SEAL节点获得的传入值执行这些逻辑｡

131
00:11:31,220 --> 00:11:34,240
‫这就是我希望你们在挑战中做的｡

132
00:11:34,250 --> 00:11:41,240
‫我想让你为每种情况打印不同的消息, 使用一个打印字符串节点, 值为3,

133
00:11:41,240 --> 00:11:44,720
‫你可以使用一个打印字符串节点来打印｡

134
00:11:44,750 --> 00:11:50,420
‫对于两种情况, 你可以简单地打印值2对于一种情况, 你可以打印一,

135
00:11:50,420 --> 00:11:58,040
‫对于零种情况, 你可以打印go now对于默认情况, 简单地打印start game, 用我们的打印字符串节点｡

136
00:11:58,040 --> 00:12:03,320
‫暂停视频, 现在在事件图中添加一大堆打印字符串节点｡

137
00:12:07,230 --> 00:12:07,740
‫好吧, 我会的

138
00:12:07,740 --> 00:12:13,590
‫我将继续使用print string节点, 从底部开始, 输入print

139
00:12:13,590 --> 00:12:16,920
‫string, 作为默认情况.

140
00:12:17,820 --> 00:12:21,030
‫我想输出的字符串是start game｡

141
00:12:21,180 --> 00:12:22,440
‫这是一条捷径｡

142
00:12:22,440 --> 00:12:28,020
‫如果您不知道选择了打印字符串节点,

143
00:12:28,020 --> 00:12:33,720
‫我可以将鼠标悬停在事件图中的其他位置, 然后单击控件dx, 这样就会复制我选择的节点｡

144
00:12:33,720 --> 00:12:40,050
‫我将把这三个case连接到这个打印字符串节点上, 然后输入get ready.

145
00:12:40,200 --> 00:12:43,200
‫因此, 当开关的输入为3时, 我们会看到｡

146
00:12:43,200 --> 00:12:45,300
‫做好准备, 打印到屏幕上｡

147
00:12:45,300 --> 00:12:52,260
‫现在我将再次控制DX, 并将其连接到两个case上, 对于两个, 我将打印两个,

148
00:12:52,260 --> 00:12:58,050
‫现在我将复制打印字符串节点, 对于一个, 我将打印值一｡

149
00:12:58,050 --> 00:13:06,060
‫最后, 这里最后一个print字符串节点将被连接到零的情况下, 这里是go.

150
00:13:07,110 --> 00:13:07,590
‫好吧, 我会的

151
00:13:07,590 --> 00:13:14,940
‫现在我们开始编译, 然后我点击播放, 现在我看到准备, 二, 一, 开始.

152
00:13:14,940 --> 00:13:18,660
‫当然, 一旦我们用完了时间, 我们就会看到开始游戏｡

153
00:13:18,660 --> 00:13:24,900
‫所以我们知道这个值在减小, 而且越来越负, 但这是我们的开关的默认情况,

154
00:13:24,900 --> 00:13:29,220
‫也就是我们知道可以开始博弈的时候.

155
00:13:29,220 --> 00:13:34,020
‫这是在小工具中显示倒计时计时器的第一步｡

156
00:13:34,050 --> 00:13:40,080
‫我们还没有完全改变“准备好”的文本, 但我们很快就会这样做｡

157
00:13:40,320 --> 00:13:45,210
‫因此, 在本视频中, 我们创建了倒计时逻辑, 并将其添加到我们的小部件蓝图中｡

158
00:13:45,240 --> 00:13:50,160
‫我们使用print string来显示倒计时值并打印不同的消息｡

159
00:13:50,160 --> 00:13:52,110
‫根据我们的倒计时值｡

160
00:13:52,110 --> 00:13:56,640
‫我们仍然需要设置小部件中的文本, 我们将在下一个视频中进行此操作｡

161
00:13:57,000 --> 00:13:57,990
‫我很快就会见到你的｡

