﻿1
00:00:04,470 --> 00:00:05,770
‫欢迎回来

2
00:00:05,790 --> 00:00:12,240
‫在本视频中, 我们将在屏幕上显示文本, 让我们知道游戏开始了｡

3
00:00:12,240 --> 00:00:21,140
‫而这是显示倒计时计时器的第一步, 让玩家知道游戏还没有完全开始, 但很快就会开始｡

4
00:00:21,150 --> 00:00:24,900
‫现在, 这将涉及蓝图可实现事件｡

5
00:00:24,930 --> 00:00:35,070
‫蓝图可实现事件是一个C++函数, 我们可以从C++调用它, 但我们实际上是在蓝图端实现功能｡

6
00:00:35,070 --> 00:00:41,910
‫所以我们可以有C++类, 比如游戏模式, 我们可以有一个标记为蓝图的函数,

7
00:00:41,910 --> 00:00:47,310
‫可实现的事件, 然后我们可以在蓝图中实现这个行为｡

8
00:00:47,310 --> 00:00:55,920
‫因此, 当我们调用标记为蓝图可实现事件的C++函数时, 蓝图中的事件将被触发｡

9
00:00:55,920 --> 00:01:01,890
‫我们在蓝图中连接到该事件的任何蓝图逻辑都将被调用｡

10
00:01:02,160 --> 00:01:08,640
‫所以我将在tune tank中创建一个blueprint implementable event函数, 游戏模式和blueprint

11
00:01:08,640 --> 00:01:11,310
‫implementable event不能是私有的.

12
00:01:11,310 --> 00:01:14,220
‫所以我将把它添加到受保护的部分｡

13
00:01:14,220 --> 00:01:19,080
‫现在我把它设成一个void函数, 我把它叫做start game.

14
00:01:19,080 --> 00:01:26,160
‫现在, 为了使这成为一个蓝图可实现的事件, 我必须给予它一个U函数宏｡

15
00:01:26,160 --> 00:01:30,570
‫指定蓝图可实施事件｡

16
00:01:30,690 --> 00:01:37,800
‫现在, 一旦我们将这个蓝图标记为可实现事件, 我们甚至不需要在C++中给予它一个函数体｡

17
00:01:37,800 --> 00:01:43,680
‫Unreal Engine希望我们在蓝图中实现这个功能, 但我们可以从C++调用它, 这正是我们在Handle

18
00:01:43,680 --> 00:01:49,110
‫Game Start中要做的｡

19
00:01:49,110 --> 00:01:57,840
‫在我们设置了坦克和玩家控制器变量之后, 我将调用start game, 现在我们可以编译它了.

20
00:01:57,840 --> 00:02:05,700
‫回到编辑器中, 我将打开BP tune tank游戏模式, 这里是我们可以实现该功能的地方｡

21
00:02:05,700 --> 00:02:13,380
‫如果我们右键单击并输入start game, 那么这里是我们声明函数并为它提供带有蓝图可实现事件的函数宏时创建的start

22
00:02:13,380 --> 00:02:19,980
‫game事件｡

23
00:02:19,980 --> 00:02:26,580
‫所以在C++端, 我们调用它, 在蓝图中, 这个事件对它做出响应｡

24
00:02:26,610 --> 00:02:33,390
‫我们可以用一个简单的print字符串节点来测试它, 对于字符串, 我们可以说Start game｡

25
00:02:33,600 --> 00:02:37,650
‫现在如果我们点击播放, 我会在左上方看到开始游戏｡

26
00:02:37,650 --> 00:02:41,370
‫因此, 我们知道我们的蓝图可实现事件正在工作｡

27
00:02:41,370 --> 00:02:49,530
‫现在, 我们希望该事件显示一个小部件, 其中包含通知玩家游戏即将开始的文本,

28
00:02:49,530 --> 00:02:53,880
‫这意味着我们需要创建一个小部件来显示｡

29
00:02:53,880 --> 00:03:02,370
‫我将在Blueprints文件夹中创建一个新文件夹, 并将其命名为widget, 然后双击widget｡

30
00:03:02,370 --> 00:03:05,730
‫在这里, 我将创建一个新的小部件蓝图｡

31
00:03:05,940 --> 00:03:11,010
‫现在, 如果我右键单击并转到用户界面, 这是Widget Blueprint｡

32
00:03:11,040 --> 00:03:17,520
‫现在, 如果我单击该按钮, 我将创建一个新的小部件蓝图, 并将其命名为W BP,

33
00:03:17,520 --> 00:03:21,540
‫即“Widget Blueprint”, 下划线表示开始游戏小部件｡

34
00:03:21,960 --> 00:03:27,240
‫如果我双击它, 我将打开Widget Blueprint编辑器,

35
00:03:27,240 --> 00:03:31,560
‫您将看到它与我们通常看到的Blueprint编辑器有很大的不同｡

36
00:03:31,560 --> 00:03:33,840
‫这是因为这是一个小部件｡

37
00:03:33,840 --> 00:03:37,860
‫小部件非常适合在屏幕上显示文本等内容｡

38
00:03:37,890 --> 00:03:43,590
‫这里有很多内容, 我们只制作一个非常基本的小部件, 它可以显示文本｡

39
00:03:43,620 --> 00:03:50,310
‫我们可以将许多不同类型的元素添加到小部件蓝图中, 例如边框､ 按钮､ 复选框､

40
00:03:50,310 --> 00:03:53,580
‫图像等｡

41
00:03:53,580 --> 00:03:58,140
‫但我们感兴趣的是这个, 上面写着文本.

42
00:03:58,140 --> 00:04:06,180
‫现在, 在层次结构面板中向下看, 您会看到顶部有一个整体WB start game小部件｡

43
00:04:06,180 --> 00:04:10,500
‫如果我们单击它, 就可以更改此小部件的属性｡

44
00:04:10,530 --> 00:04:14,040
‫现在, 我们可以将小部件元素拖到这个层次结构中｡

45
00:04:14,040 --> 00:04:20,070
‫因此, 我将在调色板中搜索画布面板, 并将其向下拖动到层次结构中｡

46
00:04:21,590 --> 00:04:28,880
‫现在, 画布面板允许我们放置小部件元素, 并将它们设置在屏幕上的所需位置,

47
00:04:28,880 --> 00:04:33,020
‫这样我们就可以将文本元素直接拖到图形上｡

48
00:04:33,020 --> 00:04:37,910
‫您将在层次结构中的画布面板下看到这个新项目｡

49
00:04:37,910 --> 00:04:39,360
‫上面写着, 短信｡

50
00:04:39,360 --> 00:04:40,310
‫文本块｡

51
00:04:40,310 --> 00:04:47,450
‫现在, 这个用引号括起来的文本块是为这个文本小部件自动设置的文本｡

52
00:04:47,450 --> 00:04:54,740
‫在详细信息面板中, 选中了content下的文本小部件, 我们可以看到一个text属性, 它被设置为text

53
00:04:54,740 --> 00:04:57,170
‫block｡

54
00:04:57,170 --> 00:05:00,860
‫但是我们可以将其设置为任何我们想要的文本, 比如get ready｡

55
00:05:01,250 --> 00:05:06,620
‫现在, 在设置为准备就绪后, 您会看到屏幕上的文本显示“准备就绪”｡

56
00:05:06,710 --> 00:05:13,940
‫Widget Blueprint编辑器允许我们自定义屏幕左上方的Widget通知,

57
00:05:13,940 --> 00:05:17,810
‫这个圆形标记称为锚点｡

58
00:05:17,840 --> 00:05:22,100
‫我们的文本小部件放置在屏幕上相对于锚的位置｡

59
00:05:22,100 --> 00:05:27,560
‫因此, 如果屏幕大小发生变化, 与锚点的距离将保持不变｡

60
00:05:27,560 --> 00:05:29,990
‫如果我们愿意, 我们可以改变锚｡

61
00:05:30,020 --> 00:05:35,690
‫例如, 我们可以设置文本小部件相对于屏幕中间的锚, 方法是转到详细信息面板,

62
00:05:35,690 --> 00:05:39,470
‫在slot下面我们可以看到锚点｡

63
00:05:39,470 --> 00:05:45,500
‫如果我单击下拉菜单, 我可以选择这个中间有一个正方形的图标｡

64
00:05:45,500 --> 00:05:51,080
‫如果我现在选择该选项,

65
00:05:51,080 --> 00:05:58,430
‫锚点将位于屏幕的中心, 如果我希望小工具完全居中, 我可以在插槽类别下更改其位置X和Y,

66
00:05:58,430 --> 00:06:08,510
‫这样我就可以将位置X和位置Y分别设置为0, 然后滚动鼠标滚轮进行放大, 您会看到它位于屏幕的左上角, 就像位于屏幕的中间一样｡

67
00:06:08,510 --> 00:06:17,180
‫现在这个对齐字段可以让我们通过选择值0来完美地将其居中｡  54X和0. 54

68
00:06:17,180 --> 00:06:21,350
‫Y, 现在它完全位于屏幕中央｡

69
00:06:21,440 --> 00:06:28,250
‫现在, 对于一个开始游戏的小部件, 它可能会适当地把这个文本稍微高一点｡

70
00:06:28,250 --> 00:06:35,840
‫因此, 对于位置Y, 我可以单击并向左拖动, 这将使该位置Y值在小部件蓝图编辑器中为负值,

71
00:06:35,840 --> 00:06:40,250
‫y轴指向下方｡

72
00:06:40,250 --> 00:06:46,250
‫所以如果我们想提升文本窗口, 我们要把位置y设为一个较低的值｡

73
00:06:46,250 --> 00:06:49,130
‫我把它放在这里大约-300｡

74
00:06:49,130 --> 00:06:55,460
‫现在, 在外观类别中, 我可以更改此文本的许多属性｡

75
00:06:55,460 --> 00:07:01,730
‫如果我单击字体下拉菜单, 我可以将字体大小更改为42｡

76
00:07:01,730 --> 00:07:04,070
‫现在换成字体而不是粗体｡

77
00:07:04,070 --> 00:07:06,140
‫我喜欢普通的字体｡

78
00:07:06,140 --> 00:07:07,970
‫我觉得现在看起来好一点了｡

79
00:07:07,970 --> 00:07:15,230
‫请注意, 我们的文本小部件文本比这里的绿色矩形大, 但是我们可以调整这个绿色矩形的大小｡

80
00:07:15,230 --> 00:07:22,880
‫当我更改矩形时, 您会在详细信息面板中看到大小X和大小y正在更改｡

81
00:07:22,880 --> 00:07:26,270
‫现在, 请注意位置X在我更改后移动了一点｡

82
00:07:26,270 --> 00:07:32,180
‫我可以把它归零, 因为x的对齐是0｡  5, 它是完美的中心｡

83
00:07:32,180 --> 00:07:35,540
‫现在我有了一个小部件, 上面写着“准备好”｡

84
00:07:35,570 --> 00:07:40,400
‫剩下要做的唯一事情就是将其添加到视口中, 以便我们可以在屏幕上看到它｡

85
00:07:40,400 --> 00:07:46,370
‫你会注意到, 如果我点击播放并开始玩游戏, 我没有看到屏幕上的小部件｡

86
00:07:46,370 --> 00:07:51,530
‫这是因为我们必须主动地将其添加到屏幕上,

87
00:07:51,530 --> 00:07:56,960
‫这就是为什么我们在游戏模式下创建了这个蓝图可实现事件, 以便我们可以将此小部件添加到屏幕上｡

88
00:07:56,960 --> 00:07:59,090
‫那么让我们来谈谈如何做到这一点｡

89
00:07:59,420 --> 00:07:59,840
‫现在就去

90
00:07:59,840 --> 00:08:05,930
‫从蓝图创建小部件的方法是使用创建小部件节点｡

91
00:08:05,960 --> 00:08:13,760
‫您可以右键单击任何蓝图的事件图, 开始键入节点的名称, 然后选择该特定节点｡

92
00:08:13,790 --> 00:08:16,040
‫我们需要的节点是create widget｡

93
00:08:16,040 --> 00:08:20,990
‫现在, 您将看到它显示为Create Coolness Widget（创建酷控件）｡

94
00:08:20,990 --> 00:08:27,020
‫这是因为我一添加Create Widget节点, 就在类下拉列表中选择了Widget

95
00:08:27,020 --> 00:08:29,150
‫Blueprint类｡

96
00:08:29,150 --> 00:08:34,340
‫这是必要的, 这样Unreal Engine才知道要创建哪个小部件类｡

97
00:08:34,370 --> 00:08:40,880
‫现在, 在使用了一个创建小部件节点之后, 我们使用一个添加到视口节点来将这个小部件实际添加到视口中,

98
00:08:40,880 --> 00:08:45,290
‫然后我们就可以在游戏的屏幕上看到它了｡

99
00:08:45,320 --> 00:08:52,700
‫请注意, 执行连接已连接, 并且create widget节点返回此蓝色输出, 并且此输出应连接到add

100
00:08:52,700 --> 00:08:59,300
‫to viewport中的目标输入, 因为add

101
00:08:59,300 --> 00:09:06,290
‫to viewport需要知道要添加到viewport的小部件, 并且create widget节点返回该小部件的值｡

102
00:09:06,290 --> 00:09:11,570
‫现在, 您已经了解了如何在蓝图中创建小部件, 接下来将进入BP tune

103
00:09:11,570 --> 00:09:14,960
‫tank游戏模式类, 并使用创建小部件节点｡

104
00:09:14,990 --> 00:09:20,390
‫您将从我们的蓝图可实现事件执行连接中将其连接起来｡

105
00:09:20,500 --> 00:09:21,910
‫我们称之为开始游戏｡

106
00:09:21,910 --> 00:09:29,800
‫现在, 在“Create Widget”节点中, 我们需要选择要创建的小部件类, 因此选择WB

107
00:09:29,800 --> 00:09:36,700
‫start game小部件, 即我们刚刚创建的新小部件蓝图, 然后使用“add to

108
00:09:36,700 --> 00:09:40,960
‫viewport”节点将此新小部件实际添加到视口中, 并连接执行连线｡

109
00:09:40,960 --> 00:09:47,560
‫不要忘记将create小部件的返回值连接到add to viewport中的目标输入｡

110
00:09:47,560 --> 00:09:52,900
‫所以暂停视频, 现在把这些节点添加到调音台的游戏模式蓝图中｡

111
00:09:56,670 --> 00:10:05,700
‫我现在在调坦克游戏模式蓝图, 我将右键单击并键入创建部件, 然后选择创建部件节点｡

112
00:10:05,730 --> 00:10:07,830
‫现在请注意, 它显示为“无构造”｡

113
00:10:07,830 --> 00:10:13,600
‫这是因为在我们在类下拉列表中选择适当的小部件类之前, 它会一直这样说｡

114
00:10:13,620 --> 00:10:18,210
‫但在此之前, 我将从事件启动游戏中连接执行线｡

115
00:10:18,210 --> 00:10:26,700
‫因此, 只要从C++中调用蓝图可实现事件启动游戏, 我们就可以执行此功能｡

116
00:10:26,970 --> 00:10:34,830
‫现在, 对于类下拉菜单, 我将选择WP开始游戏小部件,

117
00:10:34,830 --> 00:10:38,700
‫现在节点的标题更改为创建WP开始游戏小部件｡

118
00:10:38,820 --> 00:10:41,880
‫现在我们可以看到这是一个创建小部件节点｡

119
00:10:41,910 --> 00:10:48,660
‫现在, 我将单击执行线并向外拖动, 然后键入add to viewport｡

120
00:10:48,660 --> 00:10:54,720
‫然后, 如果我选择add to

121
00:10:54,720 --> 00:11:01,410
‫viewport, 则会自动为我连接执行连接, 但它不会将create小部件的返回值连接到add to viewport的目标输入｡

122
00:11:01,410 --> 00:11:04,070
‫所以我需要自己点击并拖动它｡

123
00:11:04,080 --> 00:11:10,920
‫因此, 现在当从C++和游戏模式类调用Start Game时,

124
00:11:10,920 --> 00:11:19,500
‫我们将执行此蓝图逻辑, 这将导致基于WP Start Game小部件创建一个新的小部件, 然后我们将其添加到视口中｡

125
00:11:19,500 --> 00:11:23,220
‫我将单击“Play”（播放）, 这是“Get Ready”（就绪）小部件｡

126
00:11:23,400 --> 00:11:29,550
‫我们之前提到过, 它将显示一个倒计时器, 但我们尚未实现该功能,

127
00:11:29,550 --> 00:11:32,220
‫因此很快就会实现｡

128
00:11:32,490 --> 00:11:39,930
‫总之, 我们创建了Start Game Widget Blueprint, 现在它上面只有文字“Get Ready”（准备好）｡

129
00:11:40,260 --> 00:11:46,740
‫我们还使用了一个create widget节点和一个add to viewport节点来将这个widget添加到viewport中,

130
00:11:46,740 --> 00:11:48,990
‫这样我们就可以在游戏一开始就看到它｡

131
00:11:48,990 --> 00:11:55,620
‫我们使用蓝图可实现事件启动了此功能, 该事件是在游戏模式C++类中创建的,

132
00:11:55,620 --> 00:12:02,460
‫称为“开始游戏”｡ 在接下来的视频中,

133
00:12:02,460 --> 00:12:09,270
‫我们将在运行时更改此小部件中的文本, 以便显示开始游戏计时器的剩余时间,

134
00:12:09,270 --> 00:12:13,140
‫这样玩家就可以知道在开始玩游戏之前需要等待多长时间｡

135
00:12:13,860 --> 00:12:14,850
‫我很快就会见到你的｡

