﻿1
00:00:03,980 --> 00:00:05,210
‫你好, 欢迎｡

2
00:00:05,210 --> 00:00:11,840
‫在这节课中, 我们将把一堆蓝图, 整齐地组织成函数,

3
00:00:11,840 --> 00:00:17,870
‫这样我们就能很容易地阅读和理解蓝图事件图中发生的事情｡

4
00:00:17,870 --> 00:00:19,850
‫让我们深入了解一下, 看看如何做到这一点｡

5
00:00:20,600 --> 00:00:26,030
‫现在, 如果我们缩小事件图, 我们可以看到它开始变得非常嘈杂｡

6
00:00:26,030 --> 00:00:28,610
‫我还可以看到几个没有连接到任何东西的节点｡

7
00:00:28,610 --> 00:00:34,340
‫这里有一个get节点, 我将删除它, 还有一个asset, M0节点, 但你可以看到它变得非常嘈杂｡

8
00:00:34,340 --> 00:00:36,860
‫现在很难理解这里发生了什么｡

9
00:00:36,860 --> 00:00:46,010
‫现在, 人们通常会说, 这一组节点都是为了产生抛射体｡

10
00:00:46,010 --> 00:00:47,300
‫所以我可以选择这些｡

11
00:00:47,300 --> 00:00:54,080
‫我可以按C键, 它会在这周围放一个块, 叫做注释块｡

12
00:00:54,080 --> 00:01:02,360
‫然后我可以输入spawn projectiles, 这样我就知道那块代码在做什么了｡

13
00:01:02,360 --> 00:01:05,410
‫这当然是组织代码的一种方法｡

14
00:01:05,420 --> 00:01:12,680
‫然而, 在我看来, 这不是最好的方法, 我们有更好的工具来做这个所谓的函数｡

15
00:01:12,680 --> 00:01:14,420
‫那么什么是函数呢？

16
00:01:14,780 --> 00:01:20,510
‫函数执行蓝图的块, 并使我们的游戏做事情｡

17
00:01:20,510 --> 00:01:25,310
‫Unreal Real提供的许多节点实际上已经是函数了｡

18
00:01:25,310 --> 00:01:27,380
‫所以我们遇到了这些｡

19
00:01:27,380 --> 00:01:33,170
‫当你放大我们的spawn actor projectile节点时, 这是一个函数｡

20
00:01:33,170 --> 00:01:39,410
‫当我们看add impulse时, 它实际上是每个节点的函数, 即使是像get

21
00:01:39,410 --> 00:01:44,090
‫forward active

22
00:01:44,090 --> 00:01:52,370
‫vector这样没有执行引脚也不是蓝色的函数, 你也可以知道, 因为它在左上角有一个小f符号, 代表函数, 但我们并不局限于Unreal提供的函数｡

23
00:01:52,370 --> 00:01:56,150
‫我们也可以创建自己的函数, 这真的很容易｡

24
00:01:56,150 --> 00:01:57,050
‫在蓝图中｡

25
00:01:57,050 --> 00:02:02,630
‫它们使我们能够保持组织性, 并使我们能够重用代码块｡

26
00:02:02,630 --> 00:02:06,500
‫所以这比评论好, 因为评论你必须复制和粘贴｡

27
00:02:06,500 --> 00:02:12,620
‫而一个函数允许我们在多个使用位置之间共享一个代码块｡

28
00:02:12,620 --> 00:02:19,280
‫让我们看看如何将这样的东西转化为一段代码｡

29
00:02:19,610 --> 00:02:24,620
‫首先, 我们可以删除评论区, 因为我认为没有必要｡

30
00:02:24,620 --> 00:02:31,340
‫相反, 我将从get播放器中选择所有节点——一直到添加impulse, 右键单击它们并选择collapse to

31
00:02:31,340 --> 00:02:35,180
‫function｡

32
00:02:35,360 --> 00:02:42,920
‫这会产生一个新的区块, 并取代所有之前的节点｡

33
00:02:42,920 --> 00:02:46,520
‫现在我要给这个函数取一个名字, 您可以在左手窗格中看到｡

34
00:02:46,520 --> 00:02:53,870
‫它在我的蓝图窗格中的函数部分下创建了一个新函数, 并为我选择了它以自动重命名,

35
00:02:53,870 --> 00:03:02,120
‫因为我们绝对应该重命名这些函数, 我将称之为spawn projectile｡

36
00:03:02,120 --> 00:03:09,530
‫好的命名在程序中是绝对重要的, 因为代码本质上都是关于通信的｡

37
00:03:09,530 --> 00:03:14,750
‫我们试着和自己交流, 这样我们就能理解我们所写的东西｡

38
00:03:14,750 --> 00:03:17,210
‫我们试图在未来与自己沟通｡

39
00:03:17,210 --> 00:03:21,050
‫当我们回到这个项目时, 已经忘记了为什么我们要以某种方式编写它｡

40
00:03:21,050 --> 00:03:25,310
‫当你在团队中工作时, 你也在努力与团队中的其他人沟通｡

41
00:03:25,340 --> 00:03:31,130
‫有些人说, 衡量代码质量的一个很好的指标是每分钟的工作量｡

42
00:03:31,130 --> 00:03:36,500
‫所以如果你阅读一段代码, 你会说, 见鬼, 一分钟50次, 这是很糟糕的代码,

43
00:03:36,500 --> 00:03:41,060
‫如果你读它, 一分钟只说, 见鬼, 一分钟一两次,

44
00:03:41,060 --> 00:03:44,930
‫那么这可能是很好的代码, 你总是会得到一些十六进制｡

45
00:03:44,930 --> 00:03:49,220
‫所以我们只是想减少它们功能数量

46
00:03:49,220 --> 00:03:51,650
‫最重要的是, 我们倾向于将函数命名为动词｡

47
00:03:51,650 --> 00:03:59,270
‫这条规则也有一些例外, 我们稍后会讲到, 但大多数函数都是有作用的东西.

48
00:03:59,270 --> 00:04:06,230
‫所以我们使用doing这个词, 如果你不确定如何命名这个功能, 那么如果你在一个团队中工作,

49
00:04:06,230 --> 00:04:11,420
‫你可以和其他人谈谈, 问他们你应该给它起什么名字,

50
00:04:11,420 --> 00:04:14,060
‫什么样的东西对他们有意义｡

51
00:04:14,060 --> 00:04:19,760
‫你经常发现自己对一个问题的看法根深蒂固, 以至于你想不出该如何谈论它｡

52
00:04:19,760 --> 00:04:27,170
‫所以你可能会问自己, 当我创建这个spawn projectile函数的时候, 我所有的代码都去哪里了？

53
00:04:27,320 --> 00:04:34,610
‫您可以通过在事件图中双击该函数, 或在“My Blueprints”选项卡中单击该函数, 或在“My

54
00:04:34,610 --> 00:04:41,840
‫Blueprints”选项卡中双击该函数, 返回到该函数实际实现方式的详细信息｡

55
00:04:41,840 --> 00:04:48,950
‫您可以看到, 我们的所有节点现在仍然驻留在这里, 它们位于一个单独的选项卡中,

56
00:04:48,950 --> 00:04:57,980
‫因此您可以返回到事件图选项卡, 也可以深入到“Spawn projectile”选项卡, 该选项卡只显示了一个功能｡

57
00:04:58,610 --> 00:05:05,480
‫你可以看到这里有一个新的节点, 这个紫色的小节点, 它是我们函数的入口点｡

58
00:05:05,480 --> 00:05:09,800
‫这表示这是函数启动时应该执行的操作｡

59
00:05:09,800 --> 00:05:11,180
‫这只是一个切入点｡

60
00:05:11,180 --> 00:05:17,690
‫无论何时调用它, 这个节点都会不断地触发函数中的其他节点｡

61
00:05:17,690 --> 00:05:19,820
‫回到事件图和｡

62
00:05:19,960 --> 00:05:23,190
‫缩小, 也许把我们的节点集中一点｡

63
00:05:23,200 --> 00:05:26,850
‫现在, 我们已经使我们的节点图小得多, 更容易阅读｡

64
00:05:26,860 --> 00:05:33,760
‫我认为这里还有几个候选人可以让我们提取功能和替换东西｡

65
00:05:33,940 --> 00:05:38,380
‫其中一个就是我们打印弹药的地方｡

66
00:05:38,380 --> 00:05:43,780
‫所以在这个例子中, 我们在两个地方打印弹药｡

67
00:05:43,780 --> 00:05:47,800
‫我们在游戏开始这样做, 我们在产卵时这样做｡

68
00:05:48,190 --> 00:05:54,190
‫然后另一个地方,

69
00:05:54,190 --> 00:06:01,200
‫另一件事, 我们可以提取到一个函数中的一个功能是我们减少弹药的地方, 它可以放在一个减少弹药的函数中｡

70
00:06:01,210 --> 00:06:09,640
‫所以在我给你们设置挑战之前, 我想在spawn projectile之后删除转换节点和打印字符串节点,

71
00:06:09,640 --> 00:06:15,280
‫因为这会使事情复杂化｡

72
00:06:15,280 --> 00:06:21,370
‫我想从上面复制功能, 使它们看起来完全相同｡

73
00:06:21,370 --> 00:06:29,200
‫如果我们从开始播放”中复制三个节点, 并将它们粘贴到下面, 然后连接执行引脚, 那么您可以看到,

74
00:06:29,200 --> 00:06:35,050
‫我们在这里得到了完全相同的一组节点, 两者之间具有相同的功能, 当我们将其提取到函数中时,

75
00:06:35,050 --> 00:06:39,970
‫不会出现混淆｡

76
00:06:39,970 --> 00:06:43,240
‫所以我想挑战你多做一些功能｡

77
00:06:43,240 --> 00:06:47,140
‫第一个我会建议做的是减少弹药｡

78
00:06:47,140 --> 00:06:52,720
‫所以取三个与减少弹药有关的节点, 把它们提取到一个函数中, 并给它们一个名字｡

79
00:06:52,960 --> 00:06:56,020
‫第二个是打印弹药｡

80
00:06:56,020 --> 00:07:05,740
‫所以你要把获取, 转换和打印弹药的功能提取到一个单独的函数中.

81
00:07:05,740 --> 00:07:11,500
‫因为我们有两个站点在打印弹药, 你可能想删除其中一个, 并引入功能,

82
00:07:11,500 --> 00:07:17,020
‫你可以从我的蓝图窗格拖动｡

83
00:07:17,260 --> 00:07:22,750
‫最后, 我们得到了一些欢迎消息, 欢迎消息节点的输出｡

84
00:07:22,750 --> 00:07:24,820
‫你可以把它们提取出来打印出来｡

85
00:07:24,820 --> 00:07:27,070
‫欢迎消息也起作用｡

86
00:07:27,100 --> 00:07:29,170
‫暂停视频, 开始体验｡

87
00:07:32,230 --> 00:07:32,740
‫好吧, 我会的

88
00:07:32,740 --> 00:07:33,570
‫欢迎回来｡

89
00:07:33,580 --> 00:07:37,450
‫所以我们要先取出减弹弹｡

90
00:07:37,450 --> 00:07:39,640
‫这里面涉及到三个节点｡

91
00:07:39,640 --> 00:07:47,740
‫我们右键单击折叠该功能, 然后我们将其命名为Decrease Ammo, 这相当简单.

92
00:07:47,740 --> 00:07:51,940
‫所以生产炮弹, 减少弹药, 然后我们打印弹药｡

93
00:07:51,940 --> 00:07:58,210
‫我们来看看这三个节点, get, convert, 和print字符串, 然后右键单击collapse,

94
00:07:58,210 --> 00:08:02,020
‫调用这个函数, 并调用print ammo.

95
00:08:02,470 --> 00:08:08,590
‫正如我所说的, 我们在两个地方重复了这个功能,

96
00:08:08,590 --> 00:08:16,180
‫所以我们将在开始播放时删除它执行此操作的位置, 并从函数列表中拖动print ammo, 然后连接执行引脚,

97
00:08:16,180 --> 00:08:19,840
‫以便它在print字符串之后运行｡

98
00:08:20,200 --> 00:08:25,630
‫这就引出了我想创建的最后一个函数, 我们称之为打印欢迎消息｡

99
00:08:25,630 --> 00:08:34,390
‫所以我打算选中要打印的字符串后, 在播放collapse to函数并调用它打印欢迎信息｡

100
00:08:34,390 --> 00:08:43,200
‫这个节点, 我们现在可以重新排列所有的节点, 这样在一个完整的屏幕上阅读这些内容就容易多了｡

101
00:08:43,210 --> 00:08:49,960
‫你可以看到, 现在理解我们游戏的功能要容易得多, 因为它都适合在一个屏幕上,

102
00:08:49,960 --> 00:08:56,380
‫并很好地达到了类似的抽象和理解水平｡

103
00:08:56,380 --> 00:09:04,900
‫这就是我们所说的自文档化代码, 因为它是不需要注释或文档来解释它的功能的代码｡

104
00:09:04,900 --> 00:09:07,150
‫只是读起来像英语｡

105
00:09:07,270 --> 00:09:08,110
‫好东西｡

106
00:09:08,110 --> 00:09:10,120
‫我们下节课再见｡

