﻿1
00:00:04,490 --> 00:00:05,690
‫你好, 欢迎｡

2
00:00:05,690 --> 00:00:11,630
‫在这节课中, 我们将学习一些功能, 这些功能并不存在于关卡蓝图中,

3
00:00:11,630 --> 00:00:14,300
‫而是存在于一个特定的蓝图类中｡

4
00:00:14,300 --> 00:00:20,120
‫这些被称为成员函数, 对于面向对象的编程是绝对重要的｡

5
00:00:20,120 --> 00:00:22,700
‫让我们深入了解一下它们是如何工作的｡

6
00:00:23,150 --> 00:00:31,430
‫所以在我们的spawn projectile函数中, 在关卡蓝图中, 我们这里有一堆节点,

7
00:00:31,430 --> 00:00:36,830
‫这些节点与添加冲量､ 获取冲量的方向以及获取静态网格组件有关｡

8
00:00:36,920 --> 00:00:43,610
‫所有这些节点都在深度上使用BP投射实例｡

9
00:00:43,610 --> 00:00:50,690
‫如果我们能把所有这些代码移到BP发射体中, 这样处理这些数据的代码就可以和数据本身一起存在,

10
00:00:50,690 --> 00:00:55,130
‫那不是很好吗？

11
00:00:55,280 --> 00:00:59,300
‫这就是面向对象编程的全部意义｡

12
00:00:59,300 --> 00:01:07,040
‫因此, 我们可以将面向对象编程定义为与它们所操作的数据共存的函数｡

13
00:01:07,400 --> 00:01:09,080
‫那么这是如何工作的呢？

14
00:01:09,080 --> 00:01:13,520
‫我们如何在事物的特定实例上构造函数？

15
00:01:13,940 --> 00:01:20,420
‫一种方法是打开BP项目类, 确保单击“open

16
00:01:20,420 --> 00:01:27,020
‫full bluepage editor”（打开完整蓝图编辑器）, 您可以看到,

17
00:01:27,020 --> 00:01:35,810
‫在此完整蓝图编辑器中有一个“my bluepage”（我的蓝图）窗格和一个函数部分, 因此, 我们可以单击此处的加号箭头, 在BP项目类上创建新函数｡

18
00:01:35,810 --> 00:01:41,960
‫我要给这个函数命名, 打印你的名字, 这个打印你的名字｡

19
00:01:41,960 --> 00:01:44,150
‫函数应该做到这一点｡

20
00:01:44,570 --> 00:01:49,910
‫你可以看到我们有一个节点开始执行这个函数, 所以我们可以拔出它的执行引脚, 然后输入print

21
00:01:49,910 --> 00:01:52,460
‫string｡

22
00:01:52,460 --> 00:01:53,810
‫这将被打印出来｡

23
00:01:53,810 --> 00:01:54,380
‫你好, 我是

24
00:01:54,380 --> 00:01:57,200
‫不完全是这个函数的名字, 是吗？

25
00:01:57,200 --> 00:01:59,390
‫但我们马上就能解决｡

26
00:01:59,690 --> 00:02:04,130
‫这里我们得到的是一个成员函数｡

27
00:02:04,130 --> 00:02:12,020
‫成员函数是类上的函数, 它总是在类的特定实例上被调用｡

28
00:02:12,020 --> 00:02:18,320
‫所以你不说, 我就要打电话把你的名字印在所有的BP炮弹上｡

29
00:02:18,320 --> 00:02:26,720
‫你必须说, 我想打电话, 把你的名字印在一号BP炮弹上, 或者印在刚刚产生的BP炮弹上｡

30
00:02:26,720 --> 00:02:38,780
‫所以如果我们去我们的水平蓝图, 你要做的是采取的参考, 从产卵BP炮弹出来｡

31
00:02:39,020 --> 00:02:51,920
‫从这个引用中, 你可以调用print你的名字, 你可以看到它自动连接到一个名为Target的特殊输入节点｡

32
00:02:51,920 --> 00:02:54,410
‫显然你还得把你的执行别针挂起来｡

33
00:02:54,410 --> 00:02:58,580
‫我会把它安排在广告冲动之后｡

34
00:02:58,580 --> 00:03:08,750
‫但这个特殊的目标输入节点的有趣之处在于, 如果你转到BP投射体, 你会看到这个打印｡

35
00:03:08,750 --> 00:03:12,830
‫您的名称没有这样的输入节点｡

36
00:03:12,830 --> 00:03:14,750
‫这是怎么回事？

37
00:03:14,990 --> 00:03:24,230
‫任何成员函数都有一个参数, 这个参数就是它的当前目标或当前实例｡

38
00:03:24,560 --> 00:03:32,030
‫您可以通过右键单击蓝图事件图并键入self来获取此信息｡

39
00:03:32,390 --> 00:03:38,540
‫你可以看到有一个名为get a reference to self的节点, 它创建了一个self节点, 就像这样｡

40
00:03:38,540 --> 00:03:46,370
‫然后你可以使用这个self对象引用来获取这个特定对象的任何属性｡

41
00:03:46,370 --> 00:03:53,270
‫所以如果我们想得到我们的BP投射体的名字, 你可以退出self引用, 然后输入get display

42
00:03:53,270 --> 00:03:57,110
‫name, 我们之前已经做过了｡

43
00:03:57,110 --> 00:04:01,250
‫然后, 您可以将显示名称连接到打印字符串中｡

44
00:04:01,250 --> 00:04:09,890
‫当我们发射一个新的投射物时, 你可以看到它打印了投射物的名字,

45
00:04:10,310 --> 00:04:17,210
‫你可以看到我创建的每一个新的投射物, 名字都是不同的,

46
00:04:17,210 --> 00:04:23,750
‫因为成员函数引用的self是一个不同的self｡

47
00:04:23,750 --> 00:04:35,270
‫我们已经知道self是成员函数中的一个可用节点, 它总是指向我们正在使用的特定当前实例｡

48
00:04:35,270 --> 00:04:40,190
‫首先, 我们之所以要研究成员函数,

49
00:04:40,190 --> 00:04:45,680
‫是因为层级蓝图中的这些节点, 我们在其中获得静态网格, 获得前向向量,

50
00:04:45,680 --> 00:04:48,260
‫然后向这些节点添加脉冲｡

51
00:04:48,560 --> 00:04:51,860
‫这些感觉就像他们应该生活在英国石油公司的炮弹｡

52
00:04:51,860 --> 00:04:55,310
‫所以这就是我想挑战你们去做的｡

53
00:04:55,310 --> 00:04:58,730
‫所以这是一个进化的挑战, 但我们即将接近本节的结尾｡

54
00:04:58,730 --> 00:05:01,730
‫所以我会带你一步一步地走完｡

55
00:05:02,120 --> 00:05:03,950
‫所以我们要做一个发射函数｡

56
00:05:04,060 --> 00:05:05,800
‫胫骨上的BP炮弹｡

57
00:05:05,800 --> 00:05:07,810
‫那就在BP导弹上造一个｡

58
00:05:07,810 --> 00:05:08,890
‫去那个加号按钮｡

59
00:05:08,890 --> 00:05:11,080
‫添加一个新的, 命名它, 启动｡

60
00:05:11,440 --> 00:05:22,090
‫然后将节点从关卡蓝图中剪切并粘贴到这个新创建的函数中, 并确保连接好执行引脚等｡

61
00:05:22,510 --> 00:05:28,000
‫现在你要试着编译这个,

62
00:05:28,000 --> 00:05:36,850
‫我们在蓝图中不经常这样做, 但是编译只允许你检查你的代码, 确保没有蓝图编译器可以预见的任何错误｡

63
00:05:36,850 --> 00:05:43,660
‫这样做的方法是, 您转到左上方的按钮, 然后单击编译, 如果有任何错误,

64
00:05:43,660 --> 00:05:48,580
‫它们将显示在底部的小窗格中, 称为编译器结果｡

65
00:05:48,580 --> 00:05:53,530
‫你可以看到我已经编译成功了, 但是任何错误都会在这里显示出来,

66
00:05:53,530 --> 00:05:57,250
‫有时你会在节点上看到一点红色来指示错误的位置｡

67
00:05:57,790 --> 00:06:07,480
‫我想看看你们能不能理解这个错误的意思, 然后用我们学过的新的self节点来修正这个错误｡

68
00:06:07,930 --> 00:06:18,130
‫然后, 您需要继续从级别蓝图中调用该函数, 方法是拖动实例, 就像我们在打印时所做的那样｡

69
00:06:18,130 --> 00:06:25,960
‫你的self节点从spawn节点创建的新投射物的实例中拖出, 并调用launch函数｡

70
00:06:26,200 --> 00:06:28,360
‫暂停视频, 开始体验｡

71
00:06:31,400 --> 00:06:32,000
‫好吧, 我会的

72
00:06:32,000 --> 00:06:32,890
‫欢迎回来｡

73
00:06:32,900 --> 00:06:39,320
‫现在, 我将转到我们的BP projector,

74
00:06:39,320 --> 00:06:47,090
‫单击my bluepire窗格中函数旁边的加号按钮, 然后键入launch以命名函数, 让我们返回到我们的关卡蓝图, 剪切节点,

75
00:06:47,090 --> 00:06:51,740
‫然后进入BP projector并将其粘贴进去｡

76
00:06:52,010 --> 00:06:58,550
‫现在, 我必须将执行从启动连接到添加脉冲, 然后单击, 进行编译,

77
00:06:58,550 --> 00:07:04,850
‫您会看到, 我在静态网格上收到错误, 或者获得静态网格节点｡

78
00:07:05,060 --> 00:07:10,550
‫如果你查看编译器的结果, 它说它使用了一个无效的目标｡

79
00:07:10,700 --> 00:07:15,290
‫所以这里输入的目标不正确｡

80
00:07:15,290 --> 00:07:25,040
‫现在, 正如我建议您做的那样, 您可以右键单击并键入self, 以获得对self的引用,

81
00:07:25,520 --> 00:07:28,460
‫然后将该self带入目标｡

82
00:07:28,730 --> 00:07:34,490
‫现在,

83
00:07:34,490 --> 00:07:46,010
‫如果您再次点击compile, 您可以看到错误已经消失, 并且编译成功, 因为它现在能够从调用此启动函数的当前投射物中获取静态网格组件｡

84
00:07:46,490 --> 00:07:56,060
‫如果我们现在返回到关卡蓝图, 我们可以从spawn actor获取输出引脚,

85
00:07:56,060 --> 00:07:59,930
‫然后键入launch来调用launch函数｡

86
00:07:59,930 --> 00:08:06,080
‫您可以看到, 执行引脚已自动为我连接, 然后在启动函数后断开,

87
00:08:06,080 --> 00:08:12,500
‫如果需要, 我们可以连接打印您的姓名函数, 尽管这只是出于调试和演示目的,

88
00:08:12,500 --> 00:08:18,560
‫如果您进行测试, 您可以看到它仍能成功启动｡

89
00:08:18,590 --> 00:08:24,620
‫除了现在处理发射的代码存在于炮弹本身｡

90
00:08:24,620 --> 00:08:25,250
‫好东西｡

91
00:08:25,250 --> 00:08:30,980
‫在这节课中, 我们已经学习了面向对象编程的核心概念之一成员函数｡

92
00:08:30,980 --> 00:08:32,780
‫我们下一场见｡

