﻿1
00:00:04,200 --> 00:00:05,670
‫欢迎回来

2
00:00:05,700 --> 00:00:12,630
‫在上一个视频中, 我们学习了一些新的属性说明符,

3
00:00:12,630 --> 00:00:16,110
‫这些说明符允许我们以某些方式将C++变量公开到蓝图中的详细信息面板｡

4
00:00:16,110 --> 00:00:23,430
‫在本视频中, 我们将学习更多的说明符, 这些说明符使我们能够更好地控制对这些变量的访问｡

5
00:00:23,430 --> 00:00:33,330
‫在详细信息面板中, 我们还将讨论如何在实际事件图中允许对特定C++变量进行读或写访问｡

6
00:00:33,330 --> 00:00:34,860
‫所以让我们开始吧｡

7
00:00:35,310 --> 00:00:35,820
‫好吧, 我会的

8
00:00:35,820 --> 00:00:41,640
‫我回到了VS代码中, 这是我们在上一个视频中创建的变量｡

9
00:00:41,670 --> 00:00:44,130
‫这是我的速度变量

10
00:00:44,130 --> 00:00:45,900
‫这是为了挑战｡

11
00:00:45,900 --> 00:00:51,510
‫您可能创建了一个不同的变量, 这是完全可以的, 所以请将该变量保留在那里｡

12
00:00:51,510 --> 00:00:53,880
‫在这段视频中我们将用它做更多的事情｡

13
00:00:53,880 --> 00:00:59,760
‫现在, 我们已经了解到, 我们可以使变量在任何地方可见, 当我们说任何地方时,

14
00:00:59,760 --> 00:01:04,110
‫我们指的是在细节面板上, 在实例上或在默认蓝图上｡

15
00:01:04,140 --> 00:01:12,600
‫我们还可以让它在任何地方编辑, 当我们使用visible instance only时, 它只在一个实例上可见｡

16
00:01:12,600 --> 00:01:17,820
‫您甚至无法在默认蓝图上看到它, 而且在任何情况下, 您都无法编辑它, 因为它是灰色的｡

17
00:01:17,820 --> 00:01:21,330
‫因此, 这允许我们使变量仅在实例上可见｡

18
00:01:21,330 --> 00:01:25,080
‫但是如果我们希望它只在默认蓝图中可见, 该怎么办？

19
00:01:25,080 --> 00:01:27,360
‫好吧, 这也有一个说明符｡

20
00:01:27,390 --> 00:01:34,560
‫让我们在32中再做一个, 我们称之为visible defaults only int｡

21
00:01:35,210 --> 00:01:37,520
‫我们可以将它初始化为一个值｡

22
00:01:37,520 --> 00:01:41,930
‫我给予它5, 我们也给它一个U属性｡

23
00:01:41,930 --> 00:01:45,640
‫和specify用于使其仅在默认值上可见｡

24
00:01:45,650 --> 00:01:47,780
‫你大概能猜到是什么｡

25
00:01:47,780 --> 00:01:50,810
‫它仅在默认情况下可见｡

26
00:01:50,810 --> 00:01:56,960
‫我将编译这个, 然后回到编辑器中, 再次打开BP Pond Tank.

27
00:01:56,960 --> 00:02:03,170
‫BP Pond Tank是自选的, 所有变量都在顶部, 所以我不打算搜索它｡

28
00:02:03,170 --> 00:02:09,620
‫但是这里是我们的可见的默认值, int, 它的值是5, 当然它现在是灰色的, 顾名思义,

29
00:02:09,620 --> 00:02:12,500
‫它只在默认值下可见｡

30
00:02:12,500 --> 00:02:19,370
‫如果我在这个世界上选择一个BP池的实例, 没有可见的默认值, 只有int, 它在实例上是不可见的,

31
00:02:19,370 --> 00:02:23,540
‫只有在默认值上｡

32
00:02:23,540 --> 00:02:25,100
‫所以现在说得通了｡

33
00:02:25,100 --> 00:02:30,860
‫让我们回到VS代码, 我们还有一些说明符需要学习｡

34
00:02:30,890 --> 00:02:36,680
‫现在, 我们已经看到, 我们可以在任何地方编辑, 并且使用我们的可见说明符,

35
00:02:36,680 --> 00:02:38,360
‫我们可以选择仅实例或仅默认｡

36
00:02:38,360 --> 00:02:45,710
‫因此, 正如您可能已经猜到的, 我们可以只对实例进行编辑, 也可以只对默认值进行编辑（如果我们选择的话）｡

37
00:02:45,710 --> 00:02:48,140
‫所以让我们在30秒内再做几个｡

38
00:02:48,140 --> 00:02:55,310
‫我将创建一个名为edit defaults only的int, 并将其初始化为一个值, 比如9, 然后创建另一个名为edit

39
00:02:55,310 --> 00:03:00,020
‫instance only的int, 32｡

40
00:03:00,020 --> 00:03:02,600
‫我给予它赋值14｡

41
00:03:02,600 --> 00:03:09,740
‫所以我们希望edit defaults only int只能在默认值上编辑, edit instance

42
00:03:09,740 --> 00:03:11,900
‫only只能在实例上编辑.

43
00:03:11,900 --> 00:03:20,360
‫现在, 这些说明符的名称是非常一致的, 所以我想让你猜一下这两个访问级别的说明符是什么｡

44
00:03:20,390 --> 00:03:23,150
‫来吧, 做一个小小的挑战｡

45
00:03:23,150 --> 00:03:26,330
‫暂停视频, 把这些填进去, 看看你是不是对的｡

46
00:03:29,030 --> 00:03:32,570
‫好的, 这些将是您的属性和编辑默认值｡

47
00:03:32,600 --> 00:03:35,600
‫只不过下场是要挨你大概猜对了｡

48
00:03:35,600 --> 00:03:46,400
‫只编辑默认值, 对于只编辑实例, 我将给予它一个u属性宏, 这将是只编辑实例｡

49
00:03:46,400 --> 00:03:47,810
‫所以这很直观｡

50
00:03:47,840 --> 00:03:54,530
‫让我们继续编译这些, 然后回到编辑器中, 使用BP--tank open, 这是我们的编辑默认值,

51
00:03:54,530 --> 00:04:01,100
‫只有int, 我们看不到edit instance only, 我们没有想到它会被设置为9,

52
00:04:01,100 --> 00:04:08,090
‫我们可以修改它, 如果我们选择了一个实例, 我们可以看到edit instance only, int,

53
00:04:08,090 --> 00:04:10,790
‫当然它也是可编辑的｡

54
00:04:10,970 --> 00:04:14,840
‫现在我们在图中添加了三个新的说明符｡

55
00:04:14,840 --> 00:04:21,020
‫我们只有可见的默认值, 它只在默认列和只读行中｡

56
00:04:21,050 --> 00:04:26,450
‫然后, 我们在各自的行中只编辑默认值和只编辑实例｡

57
00:04:26,600 --> 00:04:31,880
‫我们很快就填满了这个图, 但您会注意到,

58
00:04:31,880 --> 00:04:35,840
‫在右侧和事件图列中有几个空白｡

59
00:04:35,840 --> 00:04:38,300
‫现在让我们来谈谈这些｡

60
00:04:38,300 --> 00:04:45,230
‫我现在在BP Pond Tank中, 我们有所有这些变量, 我们已经公开了这些变量的细节, 面板,

61
00:04:45,410 --> 00:04:47,030
‫取决于它们的说明符｡

62
00:04:47,060 --> 00:04:49,370
‫您可以在此处或实例上看到它们｡

63
00:04:49,370 --> 00:04:52,010
‫但是如果我在事件图中右键单击这里会怎样呢？

64
00:04:52,040 --> 00:04:57,440
‫事件图是另一个我们可以访问变量并可能更改它们的地方｡

65
00:04:57,440 --> 00:05:02,150
‫因此, 如果我在任何地方键入edit, 我在任何地方都看不到编辑｡

66
00:05:02,150 --> 00:05:05,090
‫INT, 它不会暴露给事件图｡

67
00:05:05,090 --> 00:05:06,860
‫我们没有权限｡

68
00:05:06,860 --> 00:05:13,460
‫还有另一个说明符, 它允许我们在事件图中公开这里的内容,

69
00:05:13,460 --> 00:05:18,800
‫并且可以与控制详细信息面板可访问性的说明符一起工作｡

70
00:05:18,800 --> 00:05:23,150
‫我想把其中一个变量暴露给事件图｡

71
00:05:23,150 --> 00:05:26,870
‫现在, 我可以选择其中的任何一个, 但是我选择这个在任何地方都可见｡

72
00:05:26,870 --> 00:05:27,830
‫现在美国｡

73
00:05:27,830 --> 00:05:32,630
‫属性宏可以接受多个输入, 所以我们在任何地方都有可见的｡

74
00:05:32,630 --> 00:05:34,010
‫我们还可以继续｡

75
00:05:34,010 --> 00:05:42,680
‫我将放置一个逗号, 并将另一个指定的添加到, 这将给予此可见的任何位置结束事件图的暴露｡

76
00:05:42,680 --> 00:05:48,650
‫我将使用蓝图读取, 写入, 蓝图读取｡

77
00:05:48,650 --> 00:05:51,230
‫写与事件图有关｡

78
00:05:51,350 --> 00:05:54,500
‫它与控制详细信息面板无关｡

79
00:05:54,500 --> 00:05:57,140
‫这就是随处可见的原因｡

80
00:05:57,140 --> 00:06:02,570
‫因此, 正如名称所示, 蓝图重写具有读访问权限和写访问权限｡

81
00:06:02,570 --> 00:06:04,240
‫让我们看看结果如何｡

82
00:06:04,250 --> 00:06:11,960
‫让我们编译它, 如果右键单击并在任意位置键入visible, 我将返回到事件图的编辑器中｡

83
00:06:12,660 --> 00:06:18,630
‫我们将看到两个不同的选项get visible anywhere int和set visible anywhere｡

84
00:06:18,630 --> 00:06:21,330
‫INT如果选择, 则可在任何位置显示｡

85
00:06:21,330 --> 00:06:27,690
‫INT我们得到一个节点, 这和其他的蓝图节点一样, 它代表C++变量, 如果我们把它拖开,

86
00:06:27,690 --> 00:06:32,430
‫我们就可以访问那个值, 对它做一些事情｡

87
00:06:32,430 --> 00:06:38,400
‫现在, 我将向外滚动, 您将看到这些灰色节点, 即actor begin､ overlap和event

88
00:06:38,400 --> 00:06:43,500
‫tick, 如您所知, Begin Play在游戏开始时被调用｡

89
00:06:43,500 --> 00:06:45,120
‫所以我们可以在这里做点什么｡

90
00:06:45,120 --> 00:06:51,750
‫我想使用一个打印字符串节点, 如果我拖动并键入打印字符串, 那么它就在这里了｡

91
00:06:51,750 --> 00:06:57,750
‫这是一个蓝图函数节点, 它接受一个以字符串形式调用的输入｡

92
00:06:57,750 --> 00:07:02,250
‫现在如果我把鼠标悬停在上面, 它会显示字符串, 然后在字符串的正下方显示字符串｡

93
00:07:02,250 --> 00:07:05,940
‫这是此节点接受作为输入参数的类型｡

94
00:07:05,940 --> 00:07:10,260
‫我们知道我们的visible anywhere int是一个int 32, 而不是一个字符串｡

95
00:07:10,260 --> 00:07:17,400
‫但是如果你在这个笔记的输出中点击, 然后把它拖到输入中, 然后松开鼠标左键, 你会看到一个弹出窗口,

96
00:07:17,400 --> 00:07:23,370
‫上面写着, 把整数转换成字符串, 如果你松开鼠标左键,

97
00:07:23,370 --> 00:07:29,850
‫你会得到这个方便的转换节点, 它可以把整数转换成字符串类型, 这对我们来说非常方便,

98
00:07:29,850 --> 00:07:34,650
‫因为我们不需要知道如何把整数转换成字符串｡

99
00:07:34,650 --> 00:07:36,480
‫对我们来说这是自然而然的｡

100
00:07:36,510 --> 00:07:42,540
‫现在, 如果我点击播放, 我们会看到值12打印了三次, 它只持续了几秒钟｡

101
00:07:42,540 --> 00:07:44,430
‫这就是print字符串的行为｡

102
00:07:44,430 --> 00:07:51,330
‫现在, 我们看到它三次的原因是因为我在世界上有三个不同的BP池塘水箱实例｡

103
00:07:51,330 --> 00:07:54,900
‫你会看到多少取决于你拖到这个世界上来的人｡

104
00:07:54,900 --> 00:08:00,630
‫因为对于每一个单独的实例来说, 开始play都是在游戏开始时调用的｡

105
00:08:00,630 --> 00:08:06,180
‫为了避免混淆, 我将删除另外两个, 只留下一个Beep Pond

106
00:08:06,180 --> 00:08:08,220
‫Tank的实例.

107
00:08:08,220 --> 00:08:15,270
‫所以我只有一个, 如果我再去点击播放, 那么我只会看到12打印到屏幕上一次｡

108
00:08:15,270 --> 00:08:21,840
‫这是对visible anywhere int的读访问权限, 但我们看到我们也有写访问权限｡

109
00:08:21,840 --> 00:08:24,960
‫这意味着我们可以在事件图中从这里设置它的值｡

110
00:08:24,960 --> 00:08:32,220
‫如果我右键单击并再次输入visible anywhere int, 那么我可以选择set visible

111
00:08:32,220 --> 00:08:38,850
‫anywhere int, 我有一个setter节点, 它接受一个输入, 我们可以从其他节点传入值,

112
00:08:38,850 --> 00:08:42,900
‫或者我们可以接受这个小文本框和硬编码值, 比如说66｡

113
00:08:42,900 --> 00:08:48,660
‫现在, 一旦从开始播放开始的执行流到达这个节点,

114
00:08:48,660 --> 00:08:54,480
‫那么setter节点将写入visible anywhere, 并将它的值设置为66｡

115
00:08:54,480 --> 00:08:56,610
‫当然, 我们可以再打印一次｡

116
00:08:56,610 --> 00:08:58,590
‫所以我将使用print字符串｡

117
00:09:00,070 --> 00:09:05,700
‫对于传递给print string的值, 我想要visible anywhere int的值｡

118
00:09:05,710 --> 00:09:07,720
‫现在我有两种方法｡

119
00:09:07,720 --> 00:09:13,990
‫setter有一个返回节点, 所以在它设置了值之后, 它会返回那个值,

120
00:09:13,990 --> 00:09:16,990
‫我们可以直接用它来打印字符串.

121
00:09:16,990 --> 00:09:23,770
‫另一种方法是右键单击并在任意位置显示int, 使用get节点, 我们可以将该节点的值直接挂接到print

122
00:09:23,770 --> 00:09:29,470
‫string中, 这将完成完全相同的操作｡

123
00:09:29,470 --> 00:09:30,700
‫所以我不需要那个｡

124
00:09:30,700 --> 00:09:31,960
‫我将删除该节点｡

125
00:09:31,960 --> 00:09:38,680
‫现在我在玩这个游戏的时候会看到, 首先输出visible anywhere

126
00:09:38,680 --> 00:09:47,320
‫int的值, 它从12开始, 然后把它的值设为66, 我会看到66的值输出到屏幕上.

127
00:09:47,320 --> 00:09:50,560
‫现在我们按播放键, 看到12和66｡

128
00:09:50,560 --> 00:09:52,540
‫现在它们看起来像是颠倒了顺序｡

129
00:09:52,540 --> 00:09:56,170
‫这是因为print字符串会将较新的消息添加到顶部｡

130
00:09:56,170 --> 00:09:58,270
‫所以这是正常的行为｡

131
00:09:58,270 --> 00:09:59,110
‫好吧, 太好了｡

132
00:09:59,110 --> 00:10:02,800
‫我们已经看到我们可以让一个可变的蓝图立即被读取｡

133
00:10:02,800 --> 00:10:07,210
‫我们还可以控制是否可以从事件图中进行设置｡

134
00:10:07,210 --> 00:10:13,450
‫所以让我们公开另一个变量, 这样我们就可以从蓝图中获取它, 但不要在任何地方设置它｡

135
00:10:13,450 --> 00:10:20,080
‫我将添加一个逗号, 并添加一个指定的到, 以便在事件图中访问它,

136
00:10:20,080 --> 00:10:22,930
‫但不能设置它或写入它｡

137
00:10:22,930 --> 00:10:30,520
‫指定的小时为蓝图只读, 因此edit anywhere int现在为蓝图只读｡

138
00:10:30,520 --> 00:10:38,470
‫它在细节面板中仍然是可编辑的, 在默认和实例中都是如此, 但是在事件图中它是只读的｡

139
00:10:38,470 --> 00:10:44,080
‫让我们继续编译它, 然后回到编辑器中, 在事件图中右键单击, 在任意位置键入edit,

140
00:10:44,080 --> 00:10:47,080
‫然后将其选中｡

141
00:10:47,080 --> 00:10:53,050
‫我们有get edit anywhere end, 但我们没有set edit anywhere int,

142
00:10:53,050 --> 00:10:55,240
‫因为它是蓝图只读, 我们不能写入它｡

143
00:10:55,240 --> 00:10:56,650
‫所以我要选择它｡

144
00:10:56,650 --> 00:10:57,910
‫这里是任何地方的编辑｡

145
00:10:57,910 --> 00:11:03,250
‫如果我想的话, 我可以用一个打印字符串节点来查看它的值｡

146
00:11:03,280 --> 00:11:04,360
‫没必要这样做｡

147
00:11:04,360 --> 00:11:05,680
‫我们已经知道该怎么做了｡

148
00:11:05,680 --> 00:11:09,760
‫我只是在证明我们不能写这个变量｡

149
00:11:09,790 --> 00:11:13,630
‫好的, 我将突出显示这些节点并将其删除｡

150
00:11:13,630 --> 00:11:15,880
‫现在我们的图表已经填好了｡

151
00:11:15,880 --> 00:11:24,550
‫我们已经了解到, 我们可以使变量只在默认值上可见, 并且我们可以使它们只在默认值上或只在实例上可编辑｡

152
00:11:24,550 --> 00:11:27,820
‫所以我们真的可以从C++端进行完全控制｡

153
00:11:27,850 --> 00:11:34,240
‫现在, 我们还看到, 我们可以将这些变量公开给事件图,

154
00:11:34,240 --> 00:11:38,650
‫并使用这些蓝图只读､ 蓝图读写说明符将它们设置为只读或只读｡

155
00:11:38,650 --> 00:11:40,180
‫所以现在你有个挑战｡

156
00:11:40,180 --> 00:11:43,330
‫在上节课中我们创造了一个变量｡

157
00:11:43,330 --> 00:11:45,310
‫我做了一个花车, 称之为速度｡

158
00:11:45,340 --> 00:11:46,960
‫现在你要取这个变量｡

159
00:11:46,960 --> 00:11:52,180
‫您可以在最后一节中创建它, 并在事件图中控制它的访问｡

160
00:11:52,180 --> 00:11:57,700
‫因此, 使用您学到的新说明符之一将其公开给事件图,

161
00:11:57,700 --> 00:12:00,520
‫然后您将测试其读写访问权限｡

162
00:12:00,520 --> 00:12:07,000
‫使用打印字符串节点, 这样就可以看到它的值, 如果更改了它, 就可以向自己证明您已经更改了它｡

163
00:12:07,000 --> 00:12:12,520
‫因此, 如果您使变量bluepire正确读取, 请尝试使用set节点更改它, 然后使用print

164
00:12:12,520 --> 00:12:15,880
‫string节点, 通过event开始play查看其值｡

165
00:12:15,880 --> 00:12:22,120
‫如果您将其设为bluepread only, 那么您只需获取该值并使用print string打印其值｡

166
00:12:22,120 --> 00:12:29,590
‫因此, 将正确的specify添加到自定义变量中, 并使用print string在事件图中测试访问｡

167
00:12:29,590 --> 00:12:31,780
‫暂停视频, 给予｡

168
00:12:34,570 --> 00:12:34,990
‫好吧, 我会的

169
00:12:34,990 --> 00:12:41,620
‫我将向下滚动到速度变量, 速度变量可在任意位置编辑, 我希望它可以被蓝图读取｡

170
00:12:41,620 --> 00:12:44,530
‫好的, 这样我就可以在事件图中更改它｡

171
00:12:44,530 --> 00:12:49,110
‫所以我将添加蓝图, 读取, 写入并简单地编译｡

172
00:12:49,120 --> 00:12:55,990
‫所以回到BP的池塘, 如果我现在输入速度, 我会看到这个的获取器和设置器｡

173
00:12:56,110 --> 00:12:58,180
‫所以我要用设定速度｡

174
00:12:58,330 --> 00:13:00,940
‫我将从开始播放”设置其值｡

175
00:13:00,940 --> 00:13:01,930
‫我们把它连接起来吧｡

176
00:13:01,930 --> 00:13:09,640
‫对于值, 我将输入900, 如果我拖动, 我可以从设置的音符中输入print string｡

177
00:13:09,640 --> 00:13:13,780
‫现在我将单击并拖动输出节点, 将其连接到string｡

178
00:13:13,780 --> 00:13:18,370
‫如果我点击播放键, 这里有900, 注意它写的是900｡  0.

179
00:13:18,370 --> 00:13:19,960
‫那是因为这是一个彩车｡

180
00:13:19,960 --> 00:13:24,190
‫所以它给了我显示第一个小数点的礼貌｡

181
00:13:24,190 --> 00:13:26,680
‫这是一个不错的内置功能｡

182
00:13:26,680 --> 00:13:31,630
‫它显示了速度变量小数点右边的一位数｡

183
00:13:31,630 --> 00:13:36,550
‫总之, 我们学习了新属性宏的更多说明符｡

184
00:13:36,580 --> 00:13:41,650
‫我们学习了仅可见默认值､ 仅编辑默认值和仅编辑实例｡

185
00:13:41,650 --> 00:13:48,550
‫我们还学习了如何使用Blueprint､ read､ write和Blueprint Read控制事件图中的读写访问｡

186
00:13:48,550 --> 00:14:01,060
‫只有C++程序员才能很好地控制蓝图中公开的内容和可以更改的内容, 以及我们在本节课程中使用这些内容的位置｡

187
00:14:01,210 --> 00:14:05,620
‫作为一名虚幻引擎开发人员, 您将在整个职业生涯中继续使用它们｡

188
00:14:06,130 --> 00:14:07,510
‫我们下节课再见｡

