﻿1
00:00:04,770 --> 00:00:05,940
‫你好, 欢迎｡

2
00:00:05,940 --> 00:00:11,610
‫在这节课上, 我们会得到A. 一､  在我们的位置之间来回巡逻｡

3
00:00:11,610 --> 00:00:18,600
‫所以会走到我原来开始的位置, 然后我会走回自己开始的位置, 稍微等一下, 然后再走｡

4
00:00:18,600 --> 00:00:21,570
‫我们将通过行为树来实现这一点｡

5
00:00:21,570 --> 00:00:23,760
‫所以让我们来看看它是如何完成的｡

6
00:00:24,720 --> 00:00:27,750
‫所以现在我们还没有充分利用行为树｡

7
00:00:27,750 --> 00:00:28,890
‫让我们来解决这个问题｡

8
00:00:28,890 --> 00:00:36,570
‫我们将创建一个行为, 允许我们从开始的位置转到玩家的位置,

9
00:00:36,570 --> 00:00:42,570
‫然后返回到最初的开始位置｡

10
00:00:42,930 --> 00:00:46,140
‫现在, 我们要用下面的方法来做｡

11
00:00:46,140 --> 00:00:53,190
‫所以在行为树中, 任务和复合节点是有区别的, 在这个例子中,

12
00:00:53,190 --> 00:00:57,120
‫复合节点的例子是一个序列.

13
00:00:57,120 --> 00:01:01,320
‫让我们来理解一下顺序和任务｡

14
00:01:01,530 --> 00:01:03,330
‫任务是你做的事情｡

15
00:01:03,450 --> 00:01:09,030
‫序列是这样的任务的序列, 并且它将按顺序运行所有任务｡

16
00:01:09,660 --> 00:01:16,320
‫因此, 如果我们右键单击并展开此处的任务, 您可以看到可用作任务的示例｡

17
00:01:16,470 --> 00:01:21,630
‫例如, 我们可以让move two, 它会移动到一个位置, 而这个位置也是直接移动到的｡

18
00:01:21,630 --> 00:01:23,700
‫我不太确定我们要用什么区别｡

19
00:01:23,700 --> 00:01:24,390
‫动两下｡

20
00:01:24,420 --> 00:01:27,660
‫你可以让它播放一个动画, 比如挠鼻子动画｡

21
00:01:27,660 --> 00:01:30,990
‫你可以让他们播放这样的声音, 嘿, 你, 这类的东西｡

22
00:01:30,990 --> 00:01:34,770
‫如果你想的话, 你可以让它运行另一个动物行为｡

23
00:01:35,130 --> 00:01:39,690
‫这里还有一个权重, 它对于在你的行为中加入一些停顿非常有用｡

24
00:01:39,930 --> 00:01:46,080
‫这些任务的有趣之处在于, 它们可以运行多个帧, 多个刻度｡

25
00:01:46,080 --> 00:01:54,540
‫因此, Move 2将在您移动到某个位置的整个过程中运行, 它只会在您到达该位置时结束｡

26
00:01:54,930 --> 00:02:03,690
‫所以如果我们也移动了一步, 我们可以把它放到一个序列里, 从序列节点向下拖.

27
00:02:03,930 --> 00:02:08,880
‫然后你会得到, 首先, 它会尝试移动到目的地｡

28
00:02:09,000 --> 00:02:16,530
‫然后我们可以添加第二个任务节点, 告诉它等待, 然后我们可以添加第三个任务节点.

29
00:02:16,530 --> 00:02:23,340
‫请注意, 我正在从序列中下拉并释放, 这允许我在该序列节点下快速添加任务｡

30
00:02:23,340 --> 00:02:24,060
‫然后我就能说出来了｡

31
00:02:24,060 --> 00:02:26,580
‫我想搬到另一个地方, 然后我可以告诉它｡

32
00:02:26,580 --> 00:02:29,880
‫我想再等一段时间｡

33
00:02:29,880 --> 00:02:35,850
‫现在, 这是移动到播放器, 然后移动回我们开始的地方的基础｡

34
00:02:35,850 --> 00:02:38,460
‫您可以在这里看到序列节点是如何工作的｡

35
00:02:38,460 --> 00:02:40,080
‫现在还有一个路由节点｡

36
00:02:40,080 --> 00:02:44,460
‫路由节点只能有一个子节点, 因此不要尝试在该子节点下添加更多内容｡

37
00:02:44,460 --> 00:02:49,800
‫这里有一个序列节点是路由, 基本上就是说,

38
00:02:49,800 --> 00:02:56,310
‫我将按顺序运行所有这些任务, 直到其中一个失败, 然后在完成后, 我们可以再次启动该流程｡

39
00:02:57,090 --> 00:03:02,010
‫这里要注意的另一件事是, 如果您单击其中的任何一个节点,

40
00:03:02,010 --> 00:03:05,580
‫这里的详细信息给予该节点的工作方式产生一些影响｡

41
00:03:05,700 --> 00:03:13,440
‫例如, 我们的移动也是当前在其自激活的细节窗格的黑板部分中使用黑板键,

42
00:03:13,440 --> 00:03:17,340
‫但我们可以将其更改为玩家位置｡

43
00:03:17,340 --> 00:03:22,380
‫所以这基本上就是说, 移动到节点, 现在将移动到我们的球员位置｡

44
00:03:22,380 --> 00:03:27,480
‫默认情况下, 我们会等待5秒,

45
00:03:27,480 --> 00:03:36,450
‫但我们可以再次更改, 我们可能希望等待2秒, 您可能希望有1/2的随机偏差, 因此基本上它将等待1/2到3秒之间的某个时间｡

46
00:03:36,690 --> 00:03:41,610
‫然后, 我们要移动到另一个位置, 这是一个我们当前没有的位置,

47
00:03:41,610 --> 00:03:43,290
‫也就是我们的起始位置｡

48
00:03:43,380 --> 00:03:44,760
‫所以我们可以继续添加｡

49
00:03:44,760 --> 00:03:51,780
‫让我们回到黑板上, 添加一个新的键, 添加一个向量, 并将其作为我们的起始位置｡

50
00:03:52,110 --> 00:03:56,820
‫然后, 我们可以返回到行为树, 看到我们移动到的节点,

51
00:03:56,820 --> 00:04:03,030
‫如果您转到详细信息窗格, 现在将开始位置作为一个选项, 然后我们可以说我们希望等待5秒钟, 然后该过程将再次开始,

52
00:04:03,030 --> 00:04:07,320
‫因为我们将成功完成序列节点｡

53
00:04:07,320 --> 00:04:08,430
‫这就是它的工作原理｡

54
00:04:08,430 --> 00:04:13,560
‫你进入序列节点, 序列节点会说, 好吧, 我在哪里？

55
00:04:13,560 --> 00:04:15,570
‫我想从头说起｡

56
00:04:15,570 --> 00:04:16,860
‫你可以看到这个数字｡

57
00:04:16,860 --> 00:04:22,650
‫这里的东西告诉我们执行顺序, 我们从0开始, 这是序列节点, 1是移动到的, 2是权重,

58
00:04:22,650 --> 00:04:30,780
‫3是移动到的, 等等｡ 所以我们一步一步地做每一项任务, 直到完成或失败｡

59
00:04:30,780 --> 00:04:34,050
‫如果我们失败了, 那么序列节点将作为一个整体失败｡

60
00:04:34,050 --> 00:04:40,020
‫然而, 这些都不可能失败, 所以我们将检查整个过程, 然后序列节点将完成,

61
00:04:40,020 --> 00:04:42,660
‫路由将再次开始｡

62
00:04:42,660 --> 00:04:47,430
‫我们将循环进行, 进入玩家位置权重, 返回起始位置,

63
00:04:47,430 --> 00:04:49,860
‫等待更长时间.

64
00:04:49,980 --> 00:04:54,000
‫这就是行为树的力量, 你可以开始把它们嵌套得更深｡

65
00:04:54,000 --> 00:04:58,920
‫你可以在这里选择, 你可以有装饰, 所有的东西, 我们会在接下来的课程中看到｡

66
00:04:58,920 --> 00:05:00,810
‫但这是它的基础｡

67
00:05:00,810 --> 00:05:07,530
‫你的人工智能可以运行的一系列指令, 它们可能需要一个以上的帧来完成｡

68
00:05:07,530 --> 00:05:13,380
‫现在我们要做的是把这个起始位置设置成一个有意义的位置｡

69
00:05:13,620 --> 00:05:16,650
‫这应该很简单｡

70
00:05:16,650 --> 00:05:23,460
‫我唯一想告诉你们的是, 我们该如何控制我们所控制的东西？

71
00:05:23,460 --> 00:05:24,060
‫所以才这样｡

72
00:05:24,140 --> 00:05:32,960
‫提醒一下, 如果我们看一下控制器h, 我们可以找到get方法,

73
00:05:32,960 --> 00:05:41,240
‫对于玩家控制器和空中控制器, get方法都可以让我们得到被控制的对象.

74
00:05:41,240 --> 00:05:51,700
‫所以你可以用它来控制它, 并在开始播放时得到它的位置, 以便设置我们的开始位置｡

75
00:05:51,710 --> 00:05:53,240
‫所以这是对你的挑战｡

76
00:05:53,240 --> 00:05:59,060
‫设定起始位置, 得到, 的位置, 就像我们刚才讲的,

77
00:05:59,060 --> 00:06:04,250
‫设定正确的黑板键, 使用我们已经用过的, 作为模板的玩家位置.

78
00:06:04,610 --> 00:06:09,680
‫按照我在课堂上讲的方法建立行为树, 并进行测试｡

79
00:06:09,680 --> 00:06:19,910
‫看看这个行为是否能让玩家或敌人移动到玩家的位置, 然后回到原来的起始位置｡

80
00:06:19,910 --> 00:06:21,860
‫暂停视频, 开始体验｡

81
00:06:23,000 --> 00:06:23,270
‫好吧, 我会的

82
00:06:23,270 --> 00:06:23,900
‫欢迎回来｡

83
00:06:23,900 --> 00:06:25,310
‫所以希望你能成功｡

84
00:06:25,310 --> 00:06:27,050
‫我们来试试吧｡

85
00:06:27,050 --> 00:06:31,190
‫我将复制播放器位置的行｡

86
00:06:31,250 --> 00:06:36,290
‫而不是设置播放器的位置, 我们去黑板, 看看我们的开始位置｡

87
00:06:36,290 --> 00:06:39,770
‫我们将把键值复制到这里｡

88
00:06:40,100 --> 00:06:45,530
‫然后不是获取播放器的位置,

89
00:06:45,530 --> 00:06:52,640
‫而是获取演员的位置, 这将获取我们当前控制的演员的位置,

90
00:06:52,640 --> 00:06:58,370
‫并获取其在世界上的位置, 这样我们就可以返回到编辑器并编译它｡

91
00:06:58,370 --> 00:07:03,170
‫完成后, 点击播放, 看看我们的——｡

92
00:07:03,170 --> 00:07:05,390
‫他走过来, 朝我们走过来｡

93
00:07:05,390 --> 00:07:10,780
‫它等待3秒或2秒或1/2秒, 然后回到他原来的开始位置｡

94
00:07:10,830 --> 00:07:16,880
‫然后他等了5秒钟, 然后他回到了玩家的原始位置——｡

95
00:07:16,880 --> 00:07:18,530
‫所以他不是每一帧都更新｡

96
00:07:18,560 --> 00:07:19,040
‫没关系, 我会的

97
00:07:19,070 --> 00:07:20,960
‫这就是我们目前的设计｡

98
00:07:20,960 --> 00:07:23,360
‫但你可以看到这种行为的发生｡

99
00:07:23,360 --> 00:07:25,520
‫他在来回巡逻｡

100
00:07:25,520 --> 00:07:29,240
‫让我们来看看这一切的实际情况｡

101
00:07:29,240 --> 00:07:30,680
‫看一下我们的行为树｡

102
00:07:30,860 --> 00:07:34,940
‫如果我们在行为树中选择I, 你就能看到他的位置｡

103
00:07:34,970 --> 00:07:37,610
‫他在移动他等了很久｡

104
00:07:37,610 --> 00:07:39,470
‫然后他就回到了起点｡

105
00:07:39,470 --> 00:07:47,000
‫他又在等, 这样我们就可以取消对接, 在游戏中看到这两种情况同时发生｡

106
00:07:47,000 --> 00:07:49,040
‫你可以看到他正在向那个位置移动｡

107
00:07:49,040 --> 00:07:52,880
‫他在等待, 现在他又回到了将其移动到起始位置的过程中｡

108
00:07:52,880 --> 00:07:59,690
‫所以这对我们调试非常方便, 尤其是当这些行为变得更复杂的时候｡

109
00:07:59,690 --> 00:08:09,530
‫它还让你感觉到计算行为树是多么的不真实, 以及执行流是如何在我们的行为树中工作的｡

110
00:08:09,710 --> 00:08:10,340
‫好东西｡

111
00:08:10,340 --> 00:08:15,050
‫在下一节课中,

112
00:08:15,050 --> 00:08:21,620
‫我们会把这些行为变得更加复杂, 并加入一些决定因素来决定我们是选择跟随某个参与者, 还是选择原地不动.

113
00:08:21,770 --> 00:08:23,330
‫我们讲座上见｡

