﻿1
00:00:04,360 --> 00:00:05,260
‫你好, 欢迎｡

2
00:00:05,260 --> 00:00:08,800
‫在这节课中, 我们将从玩家的角度来看待问题.

3
00:00:08,830 --> 00:00:15,280
‫我们将掌握球员的视口, 位置和旋转的相机, 基本上,

4
00:00:15,280 --> 00:00:21,010
‫所以当我们点击触发按钮, 我们可以画一个调试相机｡

5
00:00:21,040 --> 00:00:26,890
‫这些红色的小家伙, 这些红色的方形摄像头, 告诉我们视口在哪里｡

6
00:00:26,890 --> 00:00:28,060
‫我们可以证实｡

7
00:00:28,060 --> 00:00:32,050
‫然后我们可以在稍后使用它对枪进行光线跟踪｡

8
00:00:32,050 --> 00:00:34,990
‫让我们深入了解一下, 看看所有这些功能的实际效果｡

9
00:00:36,200 --> 00:00:38,360
‫让我以一个问题开始这堂课｡

10
00:00:38,360 --> 00:00:45,860
‫所以如果你像这样通过你的视窗瞄准, 你试图把你的屏幕中心和D对D命令中心或者零命令中心排成一行,

11
00:00:45,860 --> 00:00:51,020
‫不管这意味着什么｡

12
00:00:51,260 --> 00:00:54,860
‫我的目标是什么？

13
00:00:54,950 --> 00:00:56,420
‫我能打到什么？

14
00:00:56,450 --> 00:00:59,360
‫你可能会说, 好吧, 我希望它达到零｡

15
00:00:59,360 --> 00:01:01,260
‫萨姆, 这似乎是个显而易见的答案

16
00:01:01,280 --> 00:01:06,980
‫好吧, 这不一定是你要击中的, 取决于你如何做事情, 你如何做你的重铸｡

17
00:01:06,980 --> 00:01:10,160
‫让我们来看看我们有哪些策略可以用来重铸｡

18
00:01:10,190 --> 00:01:15,920
‫最明显的是你说, 好吧, 我们是从枪里发射的, 所以我们要重新铸造枪的枪管｡

19
00:01:15,920 --> 00:01:20,450
‫或者顺便说一下, 这个设定, 非常非常粗糙, 基本上是我们的第三人称设定｡

20
00:01:20,450 --> 00:01:21,860
‫我们这里有摄像头｡

21
00:01:21,860 --> 00:01:23,870
‫我们有角色, 我们有枪｡

22
00:01:23,870 --> 00:01:26,690
‫他正试图射击另一个目标人物｡

23
00:01:26,900 --> 00:01:31,240
‫所以, 首先, 我们把枪重新铸造成那样｡

24
00:01:31,280 --> 00:01:38,120
‫也许它错过了, 因为我们的相机没有指向枪指向的地方, 不一定｡

25
00:01:38,120 --> 00:01:41,630
‫即使它们可能指向同一个方向, 但它们彼此之间有轻微的偏移,

26
00:01:41,630 --> 00:01:43,970
‫因此它们不一定会击中相同的物体｡

27
00:01:43,970 --> 00:01:48,440
‫相反, 你可能会选择你想从相机重铸｡

28
00:01:48,470 --> 00:01:57,440
‫这意味着无论摄像机在看什么, 都会是被击中的东西, 这在第三人称游戏中通常感觉更自然｡

29
00:01:57,710 --> 00:02:02,960
‫当你在第一人称游戏中时, 事情会变得更接近, 因为你经常离桶很近｡

30
00:02:02,960 --> 00:02:07,100
‫但即使在第一人称游戏中, 这条规则也往往是如此｡

31
00:02:07,100 --> 00:02:10,970
‫您不希望在屏幕上瞄准点的位置移动｡

32
00:02:10,970 --> 00:02:18,680
‫你通常会有一小块UI覆盖在屏幕的中间, 这就是你要瞄准的地方｡

33
00:02:18,680 --> 00:02:25,010
‫所以这就是为什么我们倾向于在这个视口下使用射线投射武器进行射线投射｡

34
00:02:25,340 --> 00:02:34,520
‫幸运的是, 我们有办法得到这个视口, 我们实际上是从控制器中得到的, 我们得到了控制器的视口｡

35
00:02:34,520 --> 00:02:41,720
‫因此, 这需要我们转到角色, 找到角色的控制器,

36
00:02:41,720 --> 00:02:44,300
‫然后找到其视口位置和旋转｡

37
00:02:44,300 --> 00:02:53,060
‫我们在这堂课上要做的就是试着想象并确认视口的位置和旋转是我们所期望的｡

38
00:02:53,210 --> 00:02:57,350
‫我们将通过绘制一些调试助手来实现这一点｡

39
00:02:57,500 --> 00:03:05,390
‫现在, 调试助手位于一个头文件中, 头文件名为debug｡

40
00:03:06,310 --> 00:03:06,820
‫帮手｡

41
00:03:06,820 --> 00:03:10,600
‫说来好笑, 我相信还是画画, 画调试帮手｡

42
00:03:10,600 --> 00:03:11,170
‫就是这个｡

43
00:03:11,530 --> 00:03:16,600
‫如果我们看一下这个F 12导航到一个头文件（如果您已经在包含文件中找到了它）,

44
00:03:16,600 --> 00:03:22,120
‫我们将查找一个名为“camera draw debug camera”的文件｡

45
00:03:22,120 --> 00:03:26,890
‫这画出的东西看起来有点像我的图表, 有点像一个三角形,

46
00:03:26,890 --> 00:03:29,440
‫或者我们可以使用的秘方｡

47
00:03:29,440 --> 00:03:31,270
‫那么它会吸收什么呢？

48
00:03:31,270 --> 00:03:37,870
‫它将在世界上获取摄像机的位置, 摄像机的旋转｡

49
00:03:37,900 --> 00:03:41,320
‫位置, 旋转, 视野｡

50
00:03:41,320 --> 00:03:44,440
‫我们将其设置为默认值, 如90度｡

51
00:03:44,440 --> 00:03:46,960
‫有一个比例, 有一个颜色默认值｡

52
00:03:46,960 --> 00:03:48,130
‫这些都是默认值｡

53
00:03:48,130 --> 00:03:49,720
‫所以我们可以使用默认值｡

54
00:03:50,020 --> 00:03:59,410
‫我们试着在我的枪里画一个调试摄像头, 我们把它放在扣动扳机的方法里, 因为这就是我们工作的原因｡

55
00:03:59,410 --> 00:04:01,870
‫它首先需要的, 是什么呢？

56
00:04:01,870 --> 00:04:03,970
‫这是一个新的世界｡

57
00:04:03,970 --> 00:04:06,460
‫所以我们得到了我们的世界｡

58
00:04:07,300 --> 00:04:11,410
‫但我们需要画成下一件事将是一个位置｡

59
00:04:11,410 --> 00:04:21,250
‫让我们暂时获取演员位置, 并进行演员旋转｡

60
00:04:22,030 --> 00:04:25,650
‫最后我们需要的是视野｡

61
00:04:25,660 --> 00:04:33,280
‫让我们来看看90度的视野, 这只是一个随机的东西, 我们可以继续编译,

62
00:04:33,280 --> 00:04:35,860
‫看看这是否会出现｡

63
00:04:36,280 --> 00:04:40,480
‫然后让我们按播放, 按｡

64
00:04:41,170 --> 00:04:42,100
‫触发按钮｡

65
00:04:42,100 --> 00:04:43,480
‫我什么都没看到｡

66
00:04:43,480 --> 00:04:47,110
‫我们来做个F8看看能不能靠近点｡

67
00:04:48,550 --> 00:04:51,790
‫这里还是没有任何摄像头｡

68
00:04:51,790 --> 00:04:53,740
‫我在想它是不是真的很小｡

69
00:04:54,490 --> 00:05:00,730
‫所以这里的另一个选择是我们可能希望有一个持久的线｡

70
00:05:01,120 --> 00:05:07,660
‫这就意味着我们需要在C++中指定所有的变量, 这样我们就可以把小数位数设为1｡

71
00:05:07,660 --> 00:05:13,180
‫我们甚至可以把它放大到2倍, 以防它的大小是个问题｡

72
00:05:13,240 --> 00:05:16,960
‫我们可以选择一种更显眼的颜色, 比如红色｡

73
00:05:16,960 --> 00:05:19,000
‫F色, 冒号, 冒号, 红色｡

74
00:05:19,420 --> 00:05:27,760
‫然后我们可以试着让持久性线条为真, 并试着让它变大｡

75
00:05:28,410 --> 00:05:29,910
‫于是重新编译｡

76
00:05:30,890 --> 00:05:32,810
‫然后投入比赛｡

77
00:05:33,260 --> 00:05:34,960
‫好了

78
00:05:34,970 --> 00:05:35,990
‫我们撞上了｡

79
00:05:37,450 --> 00:05:38,260
‫扳机｡

80
00:05:38,260 --> 00:05:45,730
‫你可以看到这里有一个小的摄像机框, 我们在这里按下扳机,

81
00:05:45,730 --> 00:05:50,350
‫它的旋转和位置是由枪和位置和旋转设置的｡

82
00:05:50,350 --> 00:05:53,020
‫因此, 现在我们要尝试获取视口｡

83
00:05:53,020 --> 00:05:57,220
‫正如我已经说过的, 这将在我们的控制器上｡

84
00:05:57,250 --> 00:06:06,640
‫让我们再看一下控制器H, 我们需要游戏框架中的控制器, 我们将在这里寻找视口｡

85
00:06:06,770 --> 00:06:07,390
‫你说什么？

86
00:06:07,390 --> 00:06:11,050
‫事实上, 观点是我们要找的词, 这里有几个｡

87
00:06:11,050 --> 00:06:15,670
‫为演员的眼睛提供一个视点, 该视点将通过演员的眼睛进行观察｡

88
00:06:15,670 --> 00:06:22,240
‫但我们实际上想要的是视点的获取, 对于眼睛控制器来说, 它将使用他们的眼睛, 而对于玩家来说,

89
00:06:22,240 --> 00:06:24,490
‫它将使用玩家的相机｡

90
00:06:24,490 --> 00:06:25,570
‫所以这就是我们想要的｡

91
00:06:25,570 --> 00:06:27,700
‫我们需要“获取播放器”的观点｡

92
00:06:27,910 --> 00:06:32,080
‫但首先, 我们必须首先得到那个控制器｡

93
00:06:32,080 --> 00:06:39,160
‫要做到这一点, 首先,

94
00:06:39,250 --> 00:06:48,190
‫我们需要让我们的主人记住, 当我们打开射击角色CP时, 我们向下或向上进入我们的开始播放, 你可以看到我们将枪的主人设置为角色｡

95
00:06:48,400 --> 00:06:51,700
‫这意味着在枪里我们可以走另一条路｡

96
00:06:51,700 --> 00:06:56,890
‫我们可以说得到所有者, 这将得到我们的射手角色｡

97
00:06:56,890 --> 00:06:59,380
‫现在它不会知道它是一个射手角色｡

98
00:06:59,380 --> 00:07:00,880
‫它只知道自己是个演员｡

99
00:07:00,880 --> 00:07:02,560
‫所以我们要在这里做石膏｡

100
00:07:02,890 --> 00:07:07,810
‫所以我们要给射手这个角色做一个演员阵容｡

101
00:07:08,540 --> 00:07:12,890
‫事实上, 我们甚至不需要知道任何事情, 因为事实上, 这是一个射手字符｡

102
00:07:12,890 --> 00:07:19,760
‫只要知道它是一个兵就足够了, 任何兵都可以拥有这把枪, 即使它不是一个射手角色｡

103
00:07:19,760 --> 00:07:22,210
‫所以尽量不具体｡

104
00:07:22,220 --> 00:07:24,200
‫但为什么一定要当棋子呢？

105
00:07:24,200 --> 00:07:29,570
‫它必须是一个卒, 因为我们需要得到一个控制器, 而只有卒才能被控制器占有｡

106
00:07:29,570 --> 00:07:30,980
‫我们把它放在一个变量中｡

107
00:07:30,980 --> 00:07:39,200
‫它将是一个——星星, 然后是所有者——将是变量的名称｡

108
00:07:39,710 --> 00:07:42,350
‫然后我们需要检查它是否不为空｡

109
00:07:48,750 --> 00:07:53,490
‫我将用一个行程序来完成这个过程,

110
00:07:53,490 --> 00:07:59,280
‫如果它是空的, 我们会提前从池触发器返回, 这样我们就不会有任何尝试调用空指针的风险｡

111
00:07:59,430 --> 00:08:08,790
‫然后我们可以做一个兵主, 得到控制器, 我们想把它保存到A控制器中｡

112
00:08:09,030 --> 00:08:11,640
‫星星和这可以是所有者｡

113
00:08:12,090 --> 00:08:12,960
‫控制器｡

114
00:08:14,210 --> 00:08:15,140
‫就像这样｡

115
00:08:15,470 --> 00:08:19,700
‫同样, 我们只需要检查它是否为空,

116
00:08:19,700 --> 00:08:23,930
‫因为我们要在它上面调用一个方法, 而我们不能在空指针上调用方法｡

117
00:08:23,960 --> 00:08:26,930
‫它使人虚幻､ 不快和崩溃｡

118
00:08:26,930 --> 00:08:31,460
‫这就是我们现在可以做所有者控制器的地方｡

119
00:08:33,340 --> 00:08:37,300
‫我们应该能够调用到一个观点｡

120
00:08:38,420 --> 00:08:42,020
‫因此, 您面临的挑战是如何设置位置和旋转｡

121
00:08:42,020 --> 00:08:45,440
‫使用这个新函数, 您可以看到它的签名｡

122
00:08:45,440 --> 00:08:52,040
‫同样, 我们转到文件前面的控制器H, 看看它是否播放了一个视点｡

123
00:08:52,040 --> 00:09:01,460
‫试着看看你是否可以从这个签名中找到如何使用它来获得我们想要传递给我们的绘图调试助手的位置和旋转｡

124
00:09:01,700 --> 00:09:05,690
‫你们要记住, 这是使用out参数｡

125
00:09:05,690 --> 00:09:14,270
‫因此, 修改输出参数, 使用我们刚刚编写的代码片段绘制调试摄像机, 并在视口中对其进行测试｡

126
00:09:14,300 --> 00:09:19,400
‫去, 在不同的位置点击几次触发按钮, 看看摄像机在哪里结束显示暂停视频,

127
00:09:19,400 --> 00:09:21,380
‫然后去看看｡

128
00:09:22,470 --> 00:09:22,800
‫好吧, 我会的

129
00:09:22,800 --> 00:09:23,440
‫欢迎回来｡

130
00:09:23,460 --> 00:09:24,660
‫所以得发挥一个观点｡

131
00:09:24,660 --> 00:09:29,720
‫我将复制该方法的名称并将其带到这里, 因为它是一个out参数｡

132
00:09:29,730 --> 00:09:34,080
‫我需要首先声明那些值要进入的变量｡

133
00:09:34,080 --> 00:09:36,330
‫我有一个F矢量的位置｡

134
00:09:36,720 --> 00:09:41,340
‫我们有一个F旋转器旋转｡

135
00:09:42,260 --> 00:09:45,660
‫我们想把它们作为参数传递进去｡

136
00:09:45,680 --> 00:09:48,320
‫让我把这里的压痕修一下｡

137
00:09:48,320 --> 00:09:51,860
‫我们将传递位置和旋转｡

138
00:09:52,190 --> 00:09:58,580
‫我们知道, 因为在阅读到这里的时候, 这里已经声明了, 我们可以猜测,

139
00:09:58,580 --> 00:10:04,130
‫这些现在是out参数, 尽管C++在这方面没有任何语法上的帮助｡

140
00:10:04,460 --> 00:10:13,820
‫然后我们可以传递这个位置而不是演员位置, 我们可以传递这个旋转而不是活动旋转到我们的绘图调试相机｡

141
00:10:14,210 --> 00:10:19,270
‫我们可以继续构建编译器, 并在编辑器中试用它｡

142
00:10:19,280 --> 00:10:21,350
‫看起来编译完成了｡

143
00:10:21,350 --> 00:10:23,120
‫我们去玩吧｡

144
00:10:23,450 --> 00:10:29,150
‫当我点击触发器时, 你可以看到一个摄像机出现在我的视角上方｡

145
00:10:29,150 --> 00:10:30,160
‫这是个好兆头｡

146
00:10:30,170 --> 00:10:32,510
‫如果我往后退一点, 你就能看到了｡

147
00:10:32,510 --> 00:10:38,300
‫我们有这些摄像头, 它们指向的方向正是我刚才看到的方向｡

148
00:10:38,300 --> 00:10:43,700
‫所以你可以想象一下我们如何从摄像机中射出一束光线, 沿着摄像机的末端,

149
00:10:43,700 --> 00:10:49,040
‫然后试着击中我当时正在看的东西｡

150
00:10:49,040 --> 00:10:51,190
‫这也是我们下节课要讲的内容｡

151
00:10:51,200 --> 00:10:51,920
‫到时候见｡

