﻿1
00:00:04,550 --> 00:00:05,810
‫你好, 欢迎｡

2
00:00:05,810 --> 00:00:11,330
‫在这节课中, 我们将开始在行为树中添加更多的功能,

3
00:00:11,330 --> 00:00:18,200
‫通过添加一个自定义任务, 这个清晰的黑板值, 我们将在C++中完全自定义｡

4
00:00:18,230 --> 00:00:20,240
‫让我们一起来看看怎么做吧｡

5
00:00:21,280 --> 00:00:21,490
‫好吧, 我会的

6
00:00:21,490 --> 00:00:28,780
‫所以我想展开这个行为树的行为, 这样我们就可以进行研究了｡

7
00:00:28,780 --> 00:00:33,040
‫一旦我们完成调查, 我们就回家｡

8
00:00:33,040 --> 00:00:40,240
‫所以我会在这里添加一个小的移动任务, 这只是返回到开始位置｡

9
00:00:40,630 --> 00:00:49,150
‫为了到达那里, 我们需要做的是知道我们是否已经访问了最后一个已知的游戏地点｡

10
00:00:49,210 --> 00:00:57,820
‫如果我们现在还没有办法的话, 我将通过设置最后一个已知玩家的位置来完成这个任务

11
00:00:57,820 --> 00:01:00,910
‫但首先, 让我们创建一个装饰器｡

12
00:01:00,910 --> 00:01:09,190
‫所以添加一个装饰器到调查黑板中, 并将其重命名为, 已经调查过了,

13
00:01:09,190 --> 00:01:16,630
‫这将检查是否设置了最后一个已知位置｡

14
00:01:16,750 --> 00:01:23,080
‫这就意味着我们需要有一个节点, 可以让我们取消黑板键｡

15
00:01:23,740 --> 00:01:25,300
‫现在这并不存在｡

16
00:01:25,300 --> 00:01:26,650
‫你只是觉得有, 其实没有｡

17
00:01:26,650 --> 00:01:31,360
‫因此, 这是我向您展示如何创建自定义任务的绝佳机会｡

18
00:01:31,360 --> 00:01:37,150
‫现在, 你可以用Blueprint很容易地完成它, 或者我将向你展示一个稍微困难的方法,

19
00:01:37,150 --> 00:01:41,050
‫但是这个方法会给你很大的力量, 它是通过C++完成的｡

20
00:01:41,440 --> 00:01:48,970
‫我们将转到主内容浏览器, 选择“添加新类”, 然后转到“新C++类”,

21
00:01:48,970 --> 00:01:51,640
‫我们将显示“所有类”复选框｡

22
00:01:51,640 --> 00:01:56,950
‫然后我们搜索Beat Task, 这里有很多选项｡

23
00:01:56,950 --> 00:02:04,900
‫你可以看到很多实际上是那些内置的任务, 如制造噪音或有一个移动到这里或等待｡

24
00:02:05,110 --> 00:02:08,950
‫现在你可以去看看C++, 看看它们是如何实现的｡

25
00:02:08,950 --> 00:02:13,720
‫这总是有用的, 但我们感兴趣的是我们应该继承什么？

26
00:02:13,720 --> 00:02:17,200
‫我们应该使用什么作为我们自己的节点的基础？

27
00:02:17,260 --> 00:02:19,030
‫现在有几个选择｡

28
00:02:19,030 --> 00:02:25,420
‫您可以选择将任务节点作为基础, 也可以使用黑板基础｡

29
00:02:25,420 --> 00:02:27,100
‫这两者有什么区别呢？

30
00:02:27,560 --> 00:02:28,630
‫让我们快速浏览一下｡

31
00:02:28,630 --> 00:02:31,930
‫所以移动到实际使用的黑板基地｡

32
00:02:31,930 --> 00:02:40,270
‫这意味着它有一个黑板键下拉菜单, 允许我们选择一个黑板键来使用｡

33
00:02:40,270 --> 00:02:45,940
‫这意味着我们不需要在任务中硬编码我们正在使用的黑板键, 这很棒,

34
00:02:45,940 --> 00:02:49,990
‫因为它允许我们在不同的情况下重用这些任务｡

35
00:02:49,990 --> 00:02:56,710
‫所以如果你需要一个黑板键, 那么黑板底座是一个很好的搭配, 否则你就用另一个｡

36
00:02:56,710 --> 00:03:02,370
‫我们来添加一个新的C++类, 显示所有类, 我们再次查找节拍任务,

37
00:03:02,500 --> 00:03:06,910
‫然后选择Blackboard Base｡

38
00:03:06,910 --> 00:03:15,850
‫现在我将它重命名为Beat Task, Underscore Clear Blackboard Value,

39
00:03:15,850 --> 00:03:18,400
‫我们将在这里创建该类.

40
00:03:18,760 --> 00:03:20,470
‫一开始, 这会失败｡

41
00:03:20,470 --> 00:03:23,440
‫因此, 让我们单击“是”, 看看这里的错误消息是什么｡

42
00:03:23,710 --> 00:03:30,070
‫它说的是关于Link的东西, 代表Link, 未解决的外部符号, 等等｡

43
00:03:30,100 --> 00:03:35,590
‫通常当你从链接器中得到这种错误时,

44
00:03:35,590 --> 00:03:44,860
‫这意味着你在头文件中得到了一些C++中没有的东西, 或者在这种情况下, 这意味着没有一个模块包含在我们所依赖的模块中｡

45
00:03:44,860 --> 00:03:52,750
‫根据它要寻找的符号类型, 我可以看到这里是AI游戏任务所有者界面｡

46
00:03:53,020 --> 00:03:58,930
‫它似乎在寻找一些与游戏性任务有关的东西, 而这实际上是一个模块｡

47
00:03:58,930 --> 00:04:07,300
‫如果我们转到Visual Studio代码并打开文件浏览器, 它将向上滚动到我的项目｡

48
00:04:07,300 --> 00:04:09,850
‫然后在源程序下简单的射击｡

49
00:04:09,850 --> 00:04:14,230
‫应该有一个简单的射手构建X或任何你的项目名称是, 建设｡

50
00:04:15,040 --> 00:04:21,190
‫在这里, 如果我给予我们多一点空间,

51
00:04:21,190 --> 00:04:29,740
‫你可以看到我们有这个公共依赖项, 模块名称, 我们要添加到这个列表的模块名称是游戏｡

52
00:04:30,890 --> 00:04:37,430
‫如果我们继续添加它, 然后返回编译, 不管什么原因,

53
00:04:37,430 --> 00:04:40,070
‫希望一切都能编译成功.

54
00:04:40,070 --> 00:04:44,680
‫当您为靴子任务覆盖时, 不会自动添加此选项｡

55
00:04:44,690 --> 00:04:48,740
‫完成后, 让我们来看看这里创建了什么｡

56
00:04:49,040 --> 00:04:59,210
‫我们应该有一个新的类, 这是我们的测试任务, 强调明确的黑板价值, 它是相当空的时刻｡

57
00:04:59,270 --> 00:05:06,320
‫现在我想做的是, 如果我们现在把它加到我们的行为树中, 它会有一个丑陋的名字｡

58
00:05:06,320 --> 00:05:10,160
‫因此, 我们需要为该任务取一个易于理解的名称｡

59
00:05:10,160 --> 00:05:14,720
‫我们要做的就是添加一个构造函数并设置一个属性.

60
00:05:14,720 --> 00:05:17,570
‫因此, 让我们在这里创建一个公共构造函数｡

61
00:05:17,900 --> 00:05:21,620
‫构造函数总是与类同名, 所以我们可以复制它｡

62
00:05:21,750 --> 00:05:28,190
‫不需要在结尾处使用分号作为任何参数, 然后让我们在C++中创建实现｡

63
00:05:28,520 --> 00:05:34,160
‫而实现只需要设置一个名为node name的变量｡

64
00:05:34,160 --> 00:05:40,820
‫所以如果你设置了节点名, 然后你使用了一个字符串, 那么我们设置的字符串就是节点名｡

65
00:05:40,820 --> 00:05:43,220
‫所以这将是一个干净黑板

66
00:05:44,210 --> 00:05:48,730
‫值只是与空格和正确的大写应该是很好的和容易的｡

67
00:05:48,740 --> 00:05:54,240
‫现在, 我在录制时忘记了一件事, 那就是用文本宏将其包围起来｡

68
00:05:54,260 --> 00:05:58,880
‫现在你应该在你的代码中这样做, 但是你会在我的代码中看到｡

69
00:05:58,880 --> 00:06:05,180
‫它会一直这样, 我们现在就可以编译它了.

70
00:06:06,680 --> 00:06:09,170
‫真棒, 编译成功｡

71
00:06:09,350 --> 00:06:12,170
‫因此, 我要求您添加这个新节点｡

72
00:06:12,170 --> 00:06:17,050
‫因此, 将其添加到调查行为的末尾, 并检查它是否完成｡

73
00:06:17,060 --> 00:06:21,470
‫基本上, 它应该自动完成, 而不做任何事情｡

74
00:06:21,470 --> 00:06:22,790
‫但请检查名称是否正确｡

75
00:06:22,790 --> 00:06:26,270
‫检查你是否能够添加它, 我们将在下节课中学习添加行为｡

76
00:06:26,270 --> 00:06:27,560
‫暂停视频, 开始体验吧｡

77
00:06:28,730 --> 00:06:29,120
‫好吧, 我会的

78
00:06:29,120 --> 00:06:29,680
‫欢迎回来｡

79
00:06:29,690 --> 00:06:35,660
‫那么让我们来看看我们的敌人A｡  一､  并在调查行为的末尾添加｡

80
00:06:35,660 --> 00:06:39,440
‫我们要加上黑板清洁的价值｡

81
00:06:39,440 --> 00:06:41,450
‫你可以看到它的名字很好听｡

82
00:06:41,450 --> 00:06:45,620
‫您还可以看到, 如果转到详细信息窗格, 您可以选择黑板键｡

83
00:06:45,620 --> 00:06:47,990
‫我们将选择最后一个已知玩家的位置｡

84
00:06:47,990 --> 00:06:53,240
‫尽管它还没有做任何事情, 但您可以看到我们具有该功能, 因为我们继承了Blackboard

85
00:06:53,240 --> 00:06:58,260
‫Base, 让我们检查一下它是否自动完成｡

86
00:06:58,260 --> 00:07:00,830
‫它应该这样做, 然后它应该继续前进｡

87
00:07:00,830 --> 00:07:08,000
‫接下来我们来看看重量任务, 这样我们就可以看到它是直接完成还是自动完成｡

88
00:07:08,090 --> 00:07:17,480
‫所以我要玩, 我要去躲在一个角落里, 尽我所能, 然后我要去看看调查它通过,

89
00:07:17,480 --> 00:07:23,090
‫实际上他看到了我｡

90
00:07:23,090 --> 00:07:25,190
‫所以我们再去躲一次吧｡

91
00:07:25,220 --> 00:07:27,170
‫如果可以的话, 我去躲在拐角处｡

92
00:07:28,610 --> 00:07:31,060
‫我会去的, 然后我打算去｡

93
00:07:31,070 --> 00:07:31,560
‫你去那里｡

94
00:07:31,580 --> 00:07:35,690
‫它直接穿过了黑板上的值, 这意味着它成功了,

95
00:07:35,690 --> 00:07:41,000
‫因为我们知道如果它是一个序列, 它失败了, 它一定会停下来, 而不是进入砝码｡

96
00:07:41,000 --> 00:07:42,950
‫这是正确的｡

97
00:07:42,950 --> 00:07:48,530
‫黑色世界的价值在于, 直接返回成功, 然后等待下一节课,

98
00:07:48,530 --> 00:07:51,920
‫我们将看看如何添加功能.

99
00:07:51,920 --> 00:07:52,760
‫我会看到你在那里｡

