﻿1
00:00:04,350 --> 00:00:05,040
‫你好, 欢迎｡

2
00:00:05,040 --> 00:00:11,340
‫在这节课上, 我们会和追随者们对视, 在世界各地导航, 避开障碍物,

3
00:00:11,340 --> 00:00:15,030
‫只是有点烦人.

4
00:00:15,030 --> 00:00:17,520
‫让我们深入探讨一下, 看看这是如何实现的｡

5
00:00:18,360 --> 00:00:27,460
‫所以下一个最明显, 最明显的问题是我们需要弄清楚的是让我们的眼睛朝我们移动｡

6
00:00:27,480 --> 00:00:29,100
‫他们光站在那里没有用｡

7
00:00:29,130 --> 00:00:31,770
‫他们也需要移动, 然后他们需要拍摄｡

8
00:00:31,770 --> 00:00:34,800
‫首先, 让我们弄清楚如何做动作｡

9
00:00:35,340 --> 00:00:41,550
‫现在, 当你移动的时候, 眼睛需要知道障碍物, 它需要做一些叫做寻路的事情, 因为, 比如说,

10
00:00:41,550 --> 00:00:45,210
‫我躲在这个走廊里, 它想找到我｡

11
00:00:45,240 --> 00:00:48,540
‫它需要知道它不能就这样穿过墙｡

12
00:00:48,540 --> 00:00:53,880
‫它需要计划好它的路线绕过障碍物向我走来｡

13
00:00:54,210 --> 00:01:01,260
‫现在, 在游戏中, 特别是在虚幻中,

14
00:01:01,260 --> 00:01:10,440
‫我们通常会生成一个网格, 告诉我们在一个关卡中哪里是可以行走的, 然后使用各种算法, 其中一种叫做星星路径查找｡

15
00:01:10,440 --> 00:01:18,190
‫你可以在这个网格上导航并创建一个路线计划, 然后AI使用这个路线计划沿着｡

16
00:01:18,210 --> 00:01:20,360
‫这就是这个过程的大概轮廓｡

17
00:01:20,370 --> 00:01:22,260
‫幸运的是, 很多事情都是为我们做的｡

18
00:01:22,260 --> 00:01:24,020
‫我们不需要从头开始编写代码｡

19
00:01:24,030 --> 00:01:28,290
‫所以我们需要做的是, 首先, 能够看到导航网格｡

20
00:01:28,290 --> 00:01:32,780
‫目前我们看不到足够的网格, 部分原因是因为没有网格｡

21
00:01:32,790 --> 00:01:40,260
‫所以我们要做的就是在这里的参与者窗口中寻找, 或者我们去窗口中寻找参与者｡

22
00:01:40,620 --> 00:01:47,190
‫我们需要搜索一个导航网格, 我们正在寻找导航网格边界体积｡

23
00:01:47,190 --> 00:01:54,090
‫这就创建了一个体积, 一个盒子, 盒子里的所有东西都将被检查, 看它的可导航性如何,

24
00:01:54,090 --> 00:01:58,380
‫基本上, 它是平坦的还是不太陡峭的｡

25
00:01:58,950 --> 00:02:04,010
‫基本上, 有墙的地方, 你不能穿墙, 你不能翻墙, 因为墙太陡了｡

26
00:02:04,020 --> 00:02:09,090
‫因此, 如果我们在导航网格边界体积中拖动,

27
00:02:09,090 --> 00:02:16,590
‫并将其带到这里, 稍微穿过地板, 这样地板就可以成为导航计算的一部分,

28
00:02:16,590 --> 00:02:21,120
‫然后我们要做的就是启用导航网格的可见性｡

29
00:02:21,120 --> 00:02:28,110
‫您可以通过单击视窗左上角的显示按钮, 然后单击导航或使用快捷方式来执行此操作｡

30
00:02:28,110 --> 00:02:29,880
‫P所以我要走捷径｡

31
00:02:29,880 --> 00:02:33,870
‫P和选择好, 你甚至不必选择边界体积｡

32
00:02:33,870 --> 00:02:40,800
‫你可以立即看到这个绿色网格出现在边界体积内, 这告诉我们这是一个适合步行的区域｡

33
00:02:40,800 --> 00:02:50,580
‫所以如果我们的敌人在这个区域内而他的目标也在这个区域内, 那么它就能沿着这个网格找到一条路径｡

34
00:02:50,760 --> 00:02:55,200
‫现在让我们看看如果我们把它移到有障碍物的地方会发生什么｡

35
00:02:55,200 --> 00:03:00,060
‫你可以看到网格在这个障碍物周围被切掉了｡

36
00:03:00,060 --> 00:03:07,680
‫所以我们实际上要做的是让这个体积包含整个层次, 你可以选择不这样做,

37
00:03:07,680 --> 00:03:15,780
‫或者只在某些部分这样做, 但最简单的方法就是增加这个体积的边界, 你可以做到｡

38
00:03:15,780 --> 00:03:20,310
‫如果您转到右侧的详细信息窗格, 您可以更改画笔的大小,

39
00:03:20,310 --> 00:03:28,770
‫如, 您可以看到, 我们可以将其放大, 也可以将其加宽, 并且在重新计算时, 它会变为红色｡

40
00:03:28,770 --> 00:03:33,300
‫你可以看到它正在构建导航网格, 它越大, 构建导航网格就越难,

41
00:03:33,300 --> 00:03:35,640
‫需要的时间就越长｡

42
00:03:35,640 --> 00:03:37,590
‫但你可以看到这是有效的｡

43
00:03:37,590 --> 00:03:39,210
‫它切断了走廊｡

44
00:03:39,210 --> 00:03:43,000
‫它是把我们无法绕过的障碍物切除｡

45
00:03:43,020 --> 00:03:52,170
‫这个谜题的第二部分是让我们的眼睛能够在这个网格上做它的生根算法｡

46
00:03:52,200 --> 00:03:57,930
‫现在, 让我们打开BP射手的眼控, 因为我想给你们看一些东西, 在这里｡

47
00:03:57,960 --> 00:04:02,370
‫我将在此处打开完整的蓝图编辑器, 并在此处查看｡

48
00:04:02,370 --> 00:04:06,180
‫有一个组件称为路径跟随组件｡

49
00:04:06,360 --> 00:04:16,230
‫该组件负责找到一个F网格, 然后基本上允许我们创建路径, 并沿着它们自动移动｡

50
00:04:16,230 --> 00:04:19,080
‫因此, 我们不必在中构建任何功能｡

51
00:04:19,080 --> 00:04:24,300
‫我们所要做的就是使用AI控制器上的一个函数｡

52
00:04:24,300 --> 00:04:35,490
‫如果你去搜索AI控制器H, 并寻找移动到功能, 那么让我们用一个开括号移动到｡

53
00:04:35,490 --> 00:04:37,200
‫这里有几个选择｡

54
00:04:37,200 --> 00:04:40,350
‫我们有一个一步棋的请求｡

55
00:04:40,470 --> 00:04:45,510
‫这里也有一些其他的选项, 但它们实际上是用不同的名称｡

56
00:04:45,510 --> 00:04:52,140
‫现在, 在《虚幻》的后期版本中, 我们有了演员和地点,

57
00:04:52,140 --> 00:04:55,350
‫它们和我们的场景焦点有着相同的区别｡

58
00:04:55,350 --> 00:05:00,630
‫您可以将焦点设置为像演员一样移动的对象, 或者您可以将焦点设置为特定的目的地,

59
00:05:00,630 --> 00:05:06,420
‫如巡逻路线中的路点, 例如, 可能是移动到某个位置｡

60
00:05:06,420 --> 00:05:10,680
‫所以我希望你们能尝试一下, 作为你们的挑战｡

61
00:05:10,680 --> 00:05:17,850
‫所以在你的场景中得到一个导航网格, 让它覆盖尽可能多的场景, 因为你需要你能够移动, 并有｡

62
00:05:17,910 --> 00:05:23,640
‫我在所有地点跟随你, 然后称之为移动, 要么移动到行动, 要么移动到一个地点｡

63
00:05:23,640 --> 00:05:29,300
‫你决定哪一个客栈开始玩让AI追我们｡

64
00:05:29,310 --> 00:05:31,110
‫所以暂停视频, 开始吧｡

65
00:05:32,330 --> 00:05:32,750
‫好吧, 我会的

66
00:05:32,750 --> 00:05:33,290
‫欢迎回来｡

67
00:05:33,350 --> 00:05:34,470
‫我们来试试吧｡

68
00:05:34,490 --> 00:05:35,870
‫所以先说正事｡

69
00:05:35,870 --> 00:05:44,660
‫我们将使用一个移动到演员的动作, 我们将设置目标演员｡

70
00:05:44,660 --> 00:05:51,920
‫我们来看看射击手, 控制器CP, 在那里开始播放, 我们可以移动到演员,

71
00:05:51,920 --> 00:05:57,590
‫演员已经是播放器了, 我们从上节课上学到的, 让我们来看看｡

72
00:05:57,590 --> 00:06:00,350
‫这里还有其他有用的属性吗？

73
00:06:00,350 --> 00:06:01,940
‫我们有一个接受半径｡

74
00:06:01,940 --> 00:06:04,010
‫目前它没有接受半径｡

75
00:06:04,010 --> 00:06:06,140
‫基本上, 它尽可能地接近｡

76
00:06:06,140 --> 00:06:08,870
‫我觉得这有点侵犯隐私｡

77
00:06:08,870 --> 00:06:14,750
‫我给予它一个两米的接受半径, 所以它会试图进入我们两米以内｡

78
00:06:15,110 --> 00:06:16,910
‫所以让我们继续构建它｡

79
00:06:17,690 --> 00:06:20,600
‫完成后, 进入发动机｡

80
00:06:20,600 --> 00:06:21,740
‫让我们来看看｡

81
00:06:21,740 --> 00:06:29,690
‫我在这里不打算展开反弹音量, 只是为了给予您了解为什么我们首先需要反弹音量｡

82
00:06:29,690 --> 00:06:32,120
‫我们先从alt p开始｡

83
00:06:32,780 --> 00:06:33,530
‫我们就在这里｡

84
00:06:33,530 --> 00:06:38,000
‫我们在导航网上, 这家伙自动向我们移动｡

85
00:06:38,000 --> 00:06:45,380
‫但如果我离开了导航网, 他就再也无法靠近我了, 因为他找不到路线｡

86
00:06:45,380 --> 00:06:48,980
‫他找不到接近我的方法｡

87
00:06:48,980 --> 00:06:55,100
‫所以我们要做的是, 事实上,

88
00:06:55,100 --> 00:07:01,550
‫我不确定这是不是真的发生了什么, 因为可能发生的是, 他正在进入我的接受半径, 他们不会再尝试｡

89
00:07:01,550 --> 00:07:12,620
‫检查的一个方法就是删除这个接受半径, 然后重新编译, 然后我们可以检查一下, 看看是不是这样｡

90
00:07:12,620 --> 00:07:16,340
‫所以, 是的, 如果我走开, 他就会过来｡

91
00:07:16,340 --> 00:07:19,130
‫好吧, 他基本上忘了那个命令｡

92
00:07:19,130 --> 00:07:26,720
‫所以我们要做的是在抽搐中这样做, 因为基本上一旦他找到我, 他就放弃了追逐我的想法｡

93
00:07:26,720 --> 00:07:28,940
‫所以我们把话题转移到tic｡

94
00:07:28,940 --> 00:07:31,580
‫这不是理想的方法, 但这就是我们要做的｡

95
00:07:31,580 --> 00:07:38,030
‫现在, 我将从演员H那里复制Tic的签名, 我知道它在公共部分,

96
00:07:38,030 --> 00:07:40,820
‫所以我将在顶部创建一个公共部分｡

97
00:07:42,770 --> 00:07:50,210
‫复制签名, 使其覆盖, 只是为了安全起见, 然后在C++中实现它,

98
00:07:50,210 --> 00:07:57,980
‫把我们的移动参与者移到tick中, 接受半径仍然是两米, 现在试试这个, 显然它在抱怨我们没有参与者,

99
00:07:57,980 --> 00:08:01,370
‫在那边.

100
00:08:01,370 --> 00:08:09,230
‫让我们继续重复这句话, 确保第一个玩家也在阁楼上.

101
00:08:09,230 --> 00:08:14,180
‫现在我们应该可以正确地测试它了, 做一个替代猪进入世界｡

102
00:08:14,180 --> 00:08:16,250
‫他来了, 我们在两米之内｡

103
00:08:16,250 --> 00:08:18,710
‫我从他身边走开, 然后看着他｡

104
00:08:18,710 --> 00:08:24,470
‫这次他甚至没有瞄准我, 但他试图沿着我｡

105
00:08:24,740 --> 00:08:29,630
‫但我一离开导航网, 他就不知道怎么找到我了｡

106
00:08:29,630 --> 00:08:31,190
‫所以我们来解决这个问题, 好吗？

107
00:08:31,190 --> 00:08:35,450
‫我们将转到导航网格反弹体积｡

108
00:08:36,250 --> 00:08:37,390
‫如果我能选择的话｡

109
00:08:37,390 --> 00:08:37,990
‫我们走吧｡

110
00:08:37,990 --> 00:08:44,170
‫然后我们想把这里放大, 试着把我们的整个水平都包括进去｡

111
00:08:44,180 --> 00:08:49,210
‫这一关在外面看起来有点不稳定, 但这只是事情通常的工作方式, 就是你建立的水平是从里面看,

112
00:08:49,210 --> 00:08:52,990
‫而不是从外面看｡

113
00:08:52,990 --> 00:08:55,480
‫所以让我们把这个范围扩大一些｡

114
00:08:55,480 --> 00:09:01,450
‫让它更高一些, 这样它就可以包含所有的楼层, 然后将它拖出来,

115
00:09:01,450 --> 00:09:04,000
‫这样就可以覆盖所有的楼层范围｡

116
00:09:04,000 --> 00:09:12,790
‫只要把它做得宽一点, 长一点, 只要确保所有这些都被完全包含｡

117
00:09:13,150 --> 00:09:16,690
‫你可以看到绿色出现了, 因为它是计算导航网格｡

118
00:09:16,690 --> 00:09:22,120
‫让我们确保导航测量值足够低, 覆盖了地图的最低范围,

119
00:09:22,120 --> 00:09:26,140
‫现在似乎覆盖了｡

120
00:09:26,140 --> 00:09:33,760
‫所以如果我们继续前进, 我们可以隐藏和导航网格, 现在我们已经设置好了, 我们可以做一个alt p继续前进和发挥,

121
00:09:33,760 --> 00:09:40,480
‫他可以找到我们, 并跟随我们几乎任何地方, 我们去这一级｡

122
00:09:40,780 --> 00:09:47,830
‫你可以看到, 我们所信任的忠诚仆人, 无论我们选择去哪里, 都沿着在我们身后｡

123
00:09:47,860 --> 00:09:51,040
‫他只是在跟踪我们, 跟踪我们, 这很烦人｡

124
00:09:51,040 --> 00:09:53,830
‫但他能够做到｡

125
00:09:54,590 --> 00:09:55,190
‫嗯, 一些东西｡

126
00:09:55,190 --> 00:10:05,450
‫在这节课中, 我们已经看到了如何创建NAV度量, 以及如何使用它们来让空气跟随我们绕着水平飞行｡

127
00:10:06,490 --> 00:10:12,220
‫下节课, 我们会回到这个问题, 修正这个bug,

128
00:10:12,220 --> 00:10:16,330
‫检查视线, 这样我们就不必一直追着玩家跑了｡

129
00:10:16,330 --> 00:10:17,050
‫看那里｡

130
00:10:18,390 --> 00:10:25,620
‫我刚刚注意到我犯了一个愚蠢的小错误, 那就是我打电话不是为了超级结肠抽搐｡

131
00:10:25,620 --> 00:10:31,860
‫这就是为什么当你有时会遇到这些奇怪的, 无法解释的错误时, 如果你不调用super,

132
00:10:31,890 --> 00:10:35,160
‫那么事情并不总是像预期的那样工作｡

133
00:10:35,160 --> 00:10:42,270
‫这就是焦点停止工作的原因, 因为本质上我们在一个高控制器上禁用了tic, 这是不好的｡

134
00:10:42,330 --> 00:10:47,520
‫如果启用该选项, 则在设置焦点时一切都应正常工作｡

