‫你好, 欢迎｡
‫在这节课中, 我们要让胜利条件起作用, 这样我就可以杀死我级别中的所有敌人｡
‫它会显示这个挡风玻璃｡
‫好耶!
‫让我们来看看它是如何完成的｡
‫所以我们希望我们的玩家有可能赢得这场比赛｡
‫目前他们不能｡
‫那我们要怎么做呢？
‫好吧, 你可以用很多方法来做｡
‫其中之一将是当卒杀死被调用, 卒不是玩家控制器, 而是一个AI｡
‫我们可以从一个变量中减去, 这个变量表示世界上有多少人工智能, 我们要杀死多少｡
‫然后当它降到零的时候, 我们就可以以有利于参与者的方式结束博弈｡
‫然而, 我认为这有点脆弱, 因为它要求我们把世界上有多少敌人放在两个地方｡
‫从本质上讲, 它需要在游戏模式下, 但也需要在世界上, 当你把敌人下来,
‫这两个可能会失去同步, 这将导致一些问题｡
‫所以我更喜欢这样做, 简单地说, 让我们计算一下世界上所有的敌人,
‫每次一个棋子被杀, 让我们重新计算一下, 所有人工智能的人数, 看看哪些还活着｡
‫如果他们中还有人活着, 那我们还不能结束游戏｡
‫基本上, 游戏还没有结束, 但如果他们都死了, 而游戏控制器没有,
‫那么玩家就赢了｡
‫所以为了做到这一点, 我们需要有一种方法来查询一个玩家控制器是否已经死了｡
‫对不起, 我是说, 人工智能控制器｡
‫我们去找枪手吧｡
‫AI控制器｡
‫这里我们要做的是创建一个新的公共方法, 它允许我们查询它是否是死的｡
‫所以我们要做的是一个基本上是死的球, 这将是一个竞赛, 因为它不应该改变控制器中实际发生的事情,
‫当它被调用｡
‫我们可以继续创建一个实现｡
‫现在我们应该控制一个——它可以告诉我们它是否死了｡
‫如果我们再去看一遍, 我们会看到射手的角色, 这是一个——｡
‫记住, 我们已经本是死在那里不能发挥作用了｡
‫所以本质上我们要做的就是把请求传递给我现在控制的射手｡
‫是的, 我知道
‫在KML游戏模式下, 你可以拿到控制器,
‫拿到控制的东西, 投一个角色, 然后检查它是否死了.
‫然而, 这通常不是最佳实践,
‫因为这意味着, 如果我们计算死亡的方式突然发生了变化, 或者AI控制器将要控制不同类型的——, 我们突然需要改变游戏模式,
‫这是没有意义的｡
‫所以最好是这样做, 这样在AI控制内部传递就更鲁棒了｡
‫它阻止了我们在其他类的内部进行操作, 这通常意味着我们可以限制当事情发生变化时,
‫我们可以限制我们必须去接触, 更新和改变多少个类, 这总是一件好事｡
‫所以我们要做的是得到——并投出——以确保它是一个射击角色｡
‫我们来做个石膏吧｡
‫这将是一个射手｡
‫性格｡
‫我认为我们需要在我们的眼睛控制顶部做一个哈希, 以确保我们了解射手角色｡
‫然后我们要执行强制转换, 执行get, 我们要把它存储在一个变量里, 所以它是一个shooter.
‫字符指针调用姑且称之为受控｡
‫性格｡
‫我不能直接称它为字符, 因为它已经是人工智能控制器上的一个变量了, 在行尾放一个分号,
‫我们要检查它是否为空｡
‫所以控制字符不等于空指针, 那么我们应该能够查询它的状态, 比如它是死的还是活的｡
‫所以我们应该可以返回那个被控制的字符｡
‫死了｡
‫基本上, 如果控制角色是一个射手角色, 我们就把请求转发给控制角色｡
‫但是, 请注意, 这里没有return语句｡
‫在另一种情况下, 我们确实需要一个return语句, 如果返回值不是void, 那么它总是一个return｡
‫所以我们需要在if语句的外面放一个return语句, 来捕捉我们在if语句里面还没有返回的情况｡
‫这里我们要说的是, 这个角色死了吗？
‫是的, 如果不是这样, 基本上它是死的｡
‫如果我们没有兵, 如果我们没有控制兵, 那么基本上这个控制器对我们来说就是死的.
‫这是可能发生的, 因为请记住, 当卒死亡时, 它会与其AI控制器分离｡
‫现在我们回到游戏模式我们要做什么呢？
‫本质上我们要做的是在所有的I上进行for循环. 我...我...
‫在世界上｡
‫还有for循环｡
‫我们要做什么？
‫我们要看的就是死｡
‫基本上和或者说基本上是没死｡
‫如果其中任何一个没有死, 那么我们立刻就知道我们根本不必检查所有的眼睛｡
‫哪怕只是一个A｡ 一､ 还活着, 游戏就还没结束
‫所以我们可以做一个早期返回, 你们可能已经见过了, 它会退出这个函数,
‫而不执行其中的任何代码.
‫所以在这个早期返回之后的所有东西都将停止执行for循环, 在它停止执行之后的任何东西都将停止执行｡
‫但是我们可以说, 如果我们成功地通过了这个完整的循环, 而它没有提前返回,
‫这意味着没有活的A｡ 一､ 那我们就得结束这场游戏｡
‫就这么简单｡
‫现在, 我们需要关注的一个谜题是结局.
‫因为我们的游戏已经在玩家控制器上结束了｡
‫让我们来看看射手玩家控制器目前是如何处理这个问题的｡
‫如果我们看它的CP, 我们现在看到的是它现在完全忽略了B是赢家现在忽略了它是不是赢家.
‫所以我们要做的就是判断B是否是赢家｡
‫那我们就做点别的｡
‫我们将显示失败屏幕｡
‫因此, 请将此处负责显示丢失屏幕的这些行剪掉｡
‫把它放在alt语句中, 我们将在这两种情况下重新开始｡
‫所以现在B是赢家｡
‫我们该怎么办？
‫好吧, 我们只是要继续下去, 并可能创造一个挡风玻璃, 以及, 这将是相当简单的｡
‫我们转到射击游戏播放器控制器的头文件｡
‫我们可以复制我们的失败屏幕类, 并在这里创建一个成功屏幕类｡
‫我们还可以继续干下去｡
‫事实上, 这对你来说是个小挑战｡
‫也许可以把它安装起来, 这样它就可以做挡风玻璃了｡
‫好吧, 我会的
‫欢迎回来｡
‫所以希望你已经试过了｡
‫我们将把挡风玻璃放在这里, 而不是所有的损失, 并复制基本上所有其他的东西｡
‫就像这样｡
‫我们将继续编译它, 然后进入编辑器, 找到播放器控制器类.
‫我们现在应该看到有一个空的挡风玻璃类, 我们要做的是进入UI,
‫我将复制丢失的屏幕来调用挡风玻璃, 如果你愿意, 你可以从头开始创建你的挡风玻璃｡
‫但我会用类似的方法, 只是我会把颜色换成绿色.
‫把它变成你赢而不是你输｡
‫因为重启逻辑实际上是相同的｡
‫不知道什么原因, 它把我的颜色重新设置了｡
‫我将再次将颜色设置为绿色｡
‫好吧, 那太好了｡
‫但是我们在KML游戏模式中仍然有一堆伪代码没有被填充｡
‫这是因为计算输赢是你的挑战｡
‫填写伪代码｡
‫使用T从该类别的下方进行划分, 以帮助您解决问题｡
‫使用我们在控制器上创建的新的is dead函数并对其进行测试｡
‫当你杀死世界上所有的人工智能时, 看看你的挡风玻璃是否会出现｡
‫把它和伪代码放在屏幕上, 让你看一下｡
‫K欢迎回来｡
‫我们从for循环开始｡
‫所以我们要做一个四｡
‫我们要怎么循环？
‫此时它不是控制器｡
‫它将是射手AI控制器｡
‫所以我们需要把它算进去｡
‫一定会是凶手｡
‫I控制器H｡
‫这意味着我们要循环遍历一个射手A. 一､ 控制器, 星星｡
‫只需调用控制器来设置shorts, 然后我们再做一次t, actor, range, shooter, A.
‫一､ 控制器中｡
‫我们需要让这两个类型匹配, 然后得到世界｡
‫所以我们在这一关做｡
‫这里是for循环的主体, 我们要问它是否还没死.
‫所以如果没有, 控制器箭头就死了｡
‫基本上我们是说确保我们没有死｡
‫如果它还没死, 我们就继续回到这个早期的回归, 因为我们知道游戏还不能结束｡
‫否则, 如果我们通过了循环的漏洞而没有返回, 我们就需要结束游戏,
‫因为玩家必须有一个杀死了关卡中所有的AI｡
‫所以在这种情况下我们可以做一个终结游戏｡
‫是的｡
‫因为玩家有一个｡
‫这应该会通知所有的玩家控制器和周围的控制器｡
‫好的, 谢谢
‫让我们来编译一下｡
‫首先, 我要去虚幻世界玩一玩｡
‫由于某种原因, 我的编辑器认为我正在编辑指定的颜色操作, 所以我打算关闭它并重新启动它｡
‫现在它重启了, 我要继续按播放键, 我会被杀的｡
‫第一点｡
‫是的, 我还是输了｡
‫那太好了｡
‫看看我能不能在他杀我之前杀了他｡
‫我们走吧｡
‫砰砰砰砰砰砰｡
‫我输得太快了｡
‫我们再去找把枪, 准备好｡
‫为了测试目的, 我们把枪的伤害弄得很高｡
‫这次我会把伤害降到20.
‫所以它还是很快, 但没那么快｡
‫去打他几下｡
‫我们在那里看到的是, 实际上我赢了, 因为水平重新开始｡
‫所以如果我再杀一次这个人, 你会发现什么都没发生｡
‫它在消息日志中说创建它是用一个空类调用的｡
‫原因是, 如果我们再看一下BP射击游戏机控制器, 你会发现我们还没有连接挡风玻璃｡
‫有一件事我忘了做, 所以你可以去编译, 保存和播放｡
‫现在如果我把这个家伙杀到新末日, 我就赢了, 我会在5秒内重新开始.
‫我想告诉你们同样的道理｡
‫如果我把更多的玩家控制器放在世界上, 它将需要我杀死他们两个｡
‫所以让我们把射手角色带进来｡
‫这将是我要杀的第二个敌人｡
‫所以杀了这家伙, 嘣｡
‫但它没有赢｡
‫然后我去找第二个人, 砰｡
‫现在我有了一个, 因为我已经杀死了所有的AI, 我们不需要改变任何变量, 因为我们的for循环计算了所有的A｡
‫一､ 每一次都是从零开始｡
‫所以现在我们生活在一个相当安静的世界里｡
‫所以在下一节课中, 我想开始看看我们如何做一些音频｡
‫我会看到你在那里｡