﻿1
00:00:04,460 --> 00:00:05,210
‫你好, 欢迎｡

2
00:00:05,210 --> 00:00:11,570
‫在这节课中, 我们将使用光线跟踪来修复这些错误, 以便我们可以杀死角色｡

3
00:00:11,570 --> 00:00:18,290
‫他们不会自杀的, 我们可以通过破坏他们的太空舱, 从他们去过的地方跑过去｡

4
00:00:18,290 --> 00:00:21,050
‫让我们来看看如何实现这一点｡

5
00:00:21,740 --> 00:00:24,500
‫所以我们现在有一些奇怪的错误｡

6
00:00:24,500 --> 00:00:35,930
‫所以我们有一个敌人的AI看起来像是在向自己的脸开枪, 你可以看到它很快就会像这样躺在地板上死去｡

7
00:00:35,930 --> 00:00:40,430
‫但不仅如此, 它还在继续射击, 因为它已经死了｡

8
00:00:40,430 --> 00:00:43,430
‫所以我们要逐步解决其中的一些问题｡

9
00:00:43,430 --> 00:00:45,290
‫让我们看看是怎么回事｡

10
00:00:45,290 --> 00:00:50,900
‫首先, 枪击本身的面部, 这可以很容易地看到发生了什么｡

11
00:00:50,900 --> 00:00:58,100
‫如果我们进入我们的枪CP, 看看它是如何工作的, 我们现在正在做这条线, 逐通道跟踪,

12
00:00:58,100 --> 00:01:04,640
‫以找到命中结果, 我们正在从玩家视口的位置开始做, 对不起,

13
00:01:04,640 --> 00:01:08,000
‫视点｡

14
00:01:08,060 --> 00:01:13,370
‫我们已经讨论过的人工智能, 它将在眼睛水平的某个地方｡

15
00:01:13,370 --> 00:01:15,080
‫这就是追踪的起点｡

16
00:01:15,080 --> 00:01:17,660
‫你可以看到这里可能有一点问题｡

17
00:01:17,660 --> 00:01:21,950
‫如果你从他的眼睛开始追踪, 你会击中这个胶囊｡

18
00:01:21,950 --> 00:01:24,500
‫事实上, 我们自己也有这个问题｡

19
00:01:24,500 --> 00:01:29,990
‫唯一的区别是, 因为我们在摄像机的视角,

20
00:01:30,020 --> 00:01:37,550
‫肩膀的视角, 所以我们基本上没有问题, 因为我们绕过了胶囊, 没有击中它｡

21
00:01:37,550 --> 00:01:42,500
‫但是如果我们的摄像机在不同的位置, 我们也可以很容易地击中我们自己的太空舱｡

22
00:01:42,920 --> 00:01:44,090
‫那我们该怎么阻止呢？

23
00:01:44,090 --> 00:01:50,030
‫所以如果我们回去定义它, 我们将创建一个struct,

24
00:01:50,030 --> 00:01:57,140
‫F碰撞查询参数, 我将调用params, 然后我们可以添加一些参与者, 这些参与者应该作为我们行的一部分被忽略｡

25
00:01:57,140 --> 00:02:04,610
‫Trace我们通过执行params, 点add, 忽略, 忽略的参与者来实现, 那么我们应该忽略哪些参与者呢？

26
00:02:04,610 --> 00:02:06,590
‫第一个就是枪｡

27
00:02:06,590 --> 00:02:10,460
‫所以这个和第二个是所有者——｡

28
00:02:10,460 --> 00:02:14,870
‫所以params add忽略了actor get所有者｡

29
00:02:14,870 --> 00:02:19,430
‫所以基本上枪的主人不应该被自己的枪击中｡

30
00:02:19,430 --> 00:02:25,270
‫我的意思是, 很明显, 你知道, 你可能想能够击中自己的棋子与枪, 但然后, 不,

31
00:02:25,340 --> 00:02:26,900
‫不是在这种情况下｡

32
00:02:26,900 --> 00:02:35,210
‫因此, 我们要传递的参数作为最后一个参数, 逐通道跟踪行, 然后保存并构建,

33
00:02:35,210 --> 00:02:38,240
‫看看是否有效｡

34
00:02:38,240 --> 00:02:44,510
‫理想情况下, 如果我们点击播放, 我们会看到,

35
00:02:44,510 --> 00:02:52,850
‫粒子效应作用在我们的胶囊上, 作用在我们的播放器上, 最终我们的生命值会降到零, 我们会四肢伸开躺在地板上｡

36
00:02:52,910 --> 00:02:53,510
‫我们走吧｡

37
00:02:53,510 --> 00:02:54,830
‫躺在地板上｡

38
00:02:54,830 --> 00:02:56,420
‫我们好像失败了｡

39
00:02:56,420 --> 00:03:01,580
‫我不知道我们真正的球员去了哪里, 但我们仍然在地板上｡

40
00:03:01,580 --> 00:03:03,140
‫但这里有另一个错误｡

41
00:03:03,140 --> 00:03:08,840
‫你可以看到他还在向我们射击, 他还在射击, 击中了一个太空舱｡

42
00:03:08,960 --> 00:03:10,970
‫同样的事情也发生了｡

43
00:03:10,970 --> 00:03:15,200
‫如果我要杀了这个人, 那就杀了他｡

44
00:03:15,200 --> 00:03:15,920
‫你去那里｡

45
00:03:15,920 --> 00:03:17,060
‫到了那里｡

46
00:03:17,090 --> 00:03:20,450
‫如果屏幕上没有可以指向的东西, 那就更难了｡

47
00:03:20,450 --> 00:03:22,250
‫但你能抓到他｡

48
00:03:22,670 --> 00:03:25,010
‫但他还在开枪还在向我开枪｡

49
00:03:25,100 --> 00:03:29,420
‫我们还可以看到他的胶囊仍然是活动的｡

50
00:03:29,420 --> 00:03:35,840
‫所以当我们的角色被杀的时候, 我们有几件事要做, 包括AI和玩家｡

51
00:03:35,840 --> 00:03:42,710
‫现在我们来看看射击角色CP, 看看我们的take damage函数｡

52
00:03:43,040 --> 00:03:44,870
‫我们基本上想在这里添加一个if语句｡

53
00:03:44,870 --> 00:03:47,150
‫我们要说的是如果死了｡

54
00:03:47,240 --> 00:03:49,400
‫所以基本上我们最后一次受到了伤害｡

55
00:03:49,400 --> 00:03:50,300
‫我们死定了｡

56
00:03:50,360 --> 00:03:51,980
‫我们得做点什么｡

57
00:03:52,250 --> 00:03:53,390
‫我们需要做些清理工作｡

58
00:03:53,660 --> 00:03:56,750
‫我们需要做的第一件事是将控制器与该角色分离｡

59
00:03:56,750 --> 00:03:58,880
‫控制器不再负责此角色｡

60
00:03:58,880 --> 00:03:59,840
‫角色已经死了｡

61
00:03:59,840 --> 00:04:04,070
‫你不能做任何事阻止我们射击｡

62
00:04:04,070 --> 00:04:06,860
‫所以人工智能死了就不会再开枪了｡

63
00:04:06,860 --> 00:04:08,090
‫这有点道理｡

64
00:04:08,090 --> 00:04:12,950
‫此外, 我们再也不能尝试在世界上四处走动｡

65
00:04:12,950 --> 00:04:19,100
‫所有这些都将通过从控制器挂起销毁中分离来禁用｡

66
00:04:19,250 --> 00:04:20,360
‫我们就这么办｡

67
00:04:20,870 --> 00:04:25,010
‫接下来我们要关闭胶囊碰撞｡

68
00:04:25,460 --> 00:04:32,150
‫我们将执行get capsule组件, 然后需要在顶部执行哈希include.

69
00:04:32,680 --> 00:04:34,060
‫对于胶囊组件｡

70
00:04:34,070 --> 00:04:37,720
‫那么如何包括那边的组件和胶囊组件呢？

71
00:04:38,760 --> 00:04:40,940
‫然后向下滚动到我们的承受伤害｡

72
00:04:41,270 --> 00:04:46,310
‫我将执行一个箭头操作符, 然后我们将执行一个启用碰撞的设置｡

73
00:04:46,490 --> 00:04:48,890
‫所以我们想将其设置为未启用｡

74
00:04:48,890 --> 00:04:51,260
‫这就是为什么我们要做一个设置碰撞启用, 奇怪的是｡

75
00:04:51,260 --> 00:04:55,340
‫所以它将启用E碰撞, 冒号, 冒号, 没有碰撞｡

76
00:04:55,430 --> 00:05:00,500
‫所以我们把太空舱对撞机设为无碰撞状态, 这应该能帮我们解决问题｡

77
00:05:00,920 --> 00:05:01,250
‫好吧, 我会的

78
00:05:01,250 --> 00:05:04,450
‫所以我们要继续构建, 看看这是否有帮助｡

79
00:05:04,460 --> 00:05:06,520
‫至少编译是成功的｡

80
00:05:06,520 --> 00:05:07,430
‫我们去玩吧｡

81
00:05:07,430 --> 00:05:09,140
‫所以他向我开枪｡

82
00:05:09,140 --> 00:05:10,910
‫我可以一枪打死他｡

83
00:05:11,210 --> 00:05:11,840
‫我们走吧｡

84
00:05:11,840 --> 00:05:12,560
‫他已经死了

85
00:05:12,740 --> 00:05:17,240
‫我可以越过他的太空舱, 我不再与它相撞｡

86
00:05:17,240 --> 00:05:21,800
‫你也可以看到他不再开枪了, 这太棒了｡

87
00:05:21,890 --> 00:05:24,050
‫看看他会不会杀了我们｡

88
00:05:24,050 --> 00:05:24,920
‫有什么行为？

89
00:05:24,920 --> 00:05:27,140
‫所以我们只需要等十发子弹｡

90
00:05:27,140 --> 00:05:32,450
‫你可以看到我像他一样躺在地上死了他一直朝我开枪｡

91
00:05:32,450 --> 00:05:32,930
‫没关系, 我会的

92
00:05:32,990 --> 00:05:39,200
‫他不再撞上一个空的对撞机, 我也不能再控制我的相机了, 因为我死了｡

93
00:05:39,200 --> 00:05:39,530
‫太棒了｡

94
00:05:39,530 --> 00:05:41,780
‫所以我们已经有了第一人称射击游戏的基础知识｡

95
00:05:41,780 --> 00:05:45,620
‫我们有敌人跟踪我们, 向我们射击, 我们可以向它射击｡

96
00:05:45,620 --> 00:05:46,820
‫我们俩都有健康｡

97
00:05:46,820 --> 00:05:48,830
‫我们两个都可以死｡

98
00:05:48,860 --> 00:05:55,520
‫接下来就是设置一些游戏结束条件, 这样我们就可以向玩家显示一条漂亮的消息, 告诉他们如果你杀死了关卡中的所有玩家,

99
00:05:55,520 --> 00:06:00,680
‫你就输了或者赢了.

100
00:06:00,680 --> 00:06:02,300
‫这将是下节课的主题｡

101
00:06:02,300 --> 00:06:02,960
‫所以你在那里｡

