‫嘿, 你好
‫欢迎回来｡
‫我们已经准备好完成我们的比赛, 这意味着还有一些事情要做, 以完善我们的比赛, 并得到它在一个状态,
‫我们很高兴｡
‫所以准备好结束这个游戏吧｡
‫我们快完成了｡
‫我们将添加几个功能｡
‫我想让摄像机的移动更平滑一点, 所以我们就从这个开始｡
‫我还注意到, 在坦克死亡后, 发射塔仍然发射炮弹, 所以我们可以做一个简单的代码修复,
‫以防止这种情况发生｡
‫同时, 我还将访问一个潜在的问题与炮弹产卵点｡
‫所以让我们来完善一下这个游戏｡
‫现在, 我首先要看的是摄像机的运动｡
‫如果我点击播放, 我会告诉你我的意思｡
‫当我移动时, 你会看到摄像机完全跟随着我们的移动, 当我们向前或向后移动时,
‫摄像机就自动地跟沿着｡
‫现在, 我们可以在这台相机上增加一个小技巧, 让它变得更平滑｡
‫让我们继续打开BP池｡
‫现在, 在BP Pond Tank中, 我将选择弹簧臂组件｡
‫如果我搜索摄像头延迟, 我会在延迟部分看到这个复选框, 启用摄像头延迟｡
‫我要检查一下, 然后启用摄像机旋转滞后｡
‫我也要过牌｡
‫现在, 这让我们可以让相机落后, 并顺利赶上, 这创造了一个很好的专业相机的效果排序｡
‫让我们点击“播放”来测试一下｡
‫所以请注意当我移动时, 摄像机需要很短的时间来跟上我们的移动｡
‫当我们旋转时也是一样｡
‫就像是有一点惯性, 摄像机在某种滑轨上, 它慢下来停下来｡
‫现在, 我们可以选择弹簧臂, 并可以更改相机滞后速度和旋转滞后速度｡
‫例如, 如果我把它放在一个更小的值, 比如说5和5而不是10, 现在我们来看看它是什么样子的｡
‫所以我在移动, 你会看到相机有一点滞后｡
‫现在, 我们可以增加或减少这一点, 因为我们认为合适｡
‫这是你可以尝试的东西, 然后找到适合你的价值观｡
‫这里我们有一个值2, 对我来说, 这有点太滞后了｡
‫所以我觉得5到2之间的数字对我比较合适｡
‫如果你喜欢这样的价值, 那么你可能会把它保持在2甚至更低｡
‫但是我将把它的值设为, 比如说, 4表示摄像机的滞后速度, 4表示摄像机的旋转滞后速度｡
‫让我们来看看它的样子｡
‫所以当我移动时, 摄像机会滞后｡
‫很明显有一些相机滞后, 但不算太多｡
‫我觉得这个看起来很不错, 所以我很满意｡
‫我们的下一个项目是在坦克已经死亡后发射塔｡
‫让我来告诉你我的意思｡
‫我们走吧｡
‫坦克已经死了, 发射塔还在开火｡
‫这是因为坦克还在｡
‫只要它在射程内, 发射塔就会继续开火｡
‫这是很容易处理的, 通过一个变量, 我们可以检查, 看看坦克是否已经死亡｡
‫我将进入tank类, 然后添加一个布尔变量, 我们可以检查这个变量,
‫看看它是否还活着.
‫我将把它公开, 因为我们打算从课堂外访问它｡
‫我把它设成一个bull变量, 叫做Be Alive, 默认情况下设为true.
‫因此, tank将以alive状态开始, 然后随着tank的死亡, alive将被设置为false｡
‫而这种情况可能发生在坦克指挥所在处理破坏时｡
‫所以我们来处理这里的破坏｡
‫在我们设置了其他属性之后, 我将把B的alive设为false｡
‫因为我们把B的值设置为false, 我们就可以知道坦克是否已经死亡然后我们就可以通过检查这个布尔值来阻止发射炮弹.
‫现在进入塔台指挥所检查射击情况
‫我们可以在开火前确定坦克还活着｡
‫首先我要看看tank是否有效｡
‫如果tank等于null指针, 我就提前返回.
‫这样我们就知道Tank是有效的, 然后在检查是否在射程内时, 我会加上一个and,
‫看看Tank是否还活着.
‫如果坦克｡
‫是活的, 那我们就开火｡
‫如果Tank死了我们就不开火
‫现在, 你可能想知道, 把回报放在一行上是否是个好主意, 就像你在前面的视频中看到的那样｡
‫这是一个讨论Unreal Engines､ 最佳编程实践和建议的好机会｡
‫Unreal engine编码实践确实建议您为所有if语句使用带主体的大括号, 即使那些只有一条语句的语句也是如此｡
‫原因是如果你打算添加多行代码, 那么你已经有了主体｡
‫而且也更加清晰｡
‫这也让我想到了另一点, 那就是我对汽车的使用｡
‫我在projectile类中使用过auto几次,
‫虽然这可能很高效, 但乍一看并不清楚类型是什么, 这就是为什么在虚幻引擎编码实践中也不推荐使用auto的原因｡
‫如果您想坚持Unreal Engine推荐的编码实践, 您可以用实际类型替换这些auto实例｡
‫例如, 这里, get instigator controller返回一个A控制器, 所以我们可以把它改成一个控制器,
‫这是一个指针｡
‫这个你破坏类型的静态类返回一个U类, 所以我们可以在这里使用你的类, 当然这里的get owner返回一个a
‫actor, 所以我们可以用a actor代替auto, 如果你看一下这段代码,
‫这些类型是什么就很明显了, 而auto只是屏蔽了一切, 让你可以偷懒,
‫不用输入这些类型｡
‫有时候我不确定一个big表达式返回的是什么, 所以我将使用auto来查看该类型,
‫然后用实际的类型替换它｡
‫所以这是另一种方式, 你可以使用auto来帮助你学习, 像这样的, 长的, 复杂的表达式返回的类型｡
‫既然我们还在完善阶段, 我将用projectile中的实际类型名来替换auto｡
‫我也会在fire函数中用到base pawn, 这里有一个projectile, 这是从这个长表达式中返回的.
‫在这种情况下, Spawn actor将返回一个抛射体, 所以我可以用一个抛射体来替换它｡
‫好吧, 我会的
‫这将使C++端的代码更加完善｡
‫让我们继续进行编译｡
‫编译成功后, 让我们回到编辑器, 点击播放,
‫确保那些塔在我们死后不会再向我们射击.
‫所以只有一个匹配｡
‫还有一个, 我在等, 但我没有看到更多的炮弹｡
‫好极了｡
‫好吧, 我会的
‫在我们结束之前, 我想讨论的最后一点是抛射体的产卵点｡
‫现在, 让我们在BP Pond Tank中选择该选项, 并确保它与桶之间的距离足够远｡
‫在此之前, 我将把它放在非常非常近的地方, 向您展示一些可能出现的问题｡
‫现在, 当我向前移动并单击鼠标左键时, 您会看到我看不到投射物｡
‫事实上, 我根本看不到它, 因为它太近了｡
‫我们已经撞上了｡
‫它还没来得及做任何事就被摧毁了｡
‫所以要确保它离桶有一个很好的交易｡
‫反正我们也会产生一些烟雾, 所以看起来像是有烟迹在后面｡
‫所以这看起来还是很逼真的｡
‫看起来很不错｡
‫当我们在炮弹产卵点, 这可能是一个好主意, 去看看英国石油公司池塘炮塔,
‫并选择其炮弹产卵点｡
‫如果你有任何问题产卵炮弹从炮塔,
‫你可能要确保它是一个很好的距离, 以及远离枪管的炮塔｡
‫所以我们有它｡
‫我们有一个功能性的游戏, 它看起来棒极了｡
‫我们有能力在世界上打滚, 我们有能力发射炮弹, 它们会把东西炸飞｡
‫如果我们击中一座塔, 我们就能摧毁它｡
‫如果塔击中我们, 它会摧毁我们｡
‫就像那样｡
‫我们有输赢条件与HUD小工具, 显示在屏幕上, 告诉我们, 我们是赢了还是输了比赛｡
‫这真是太棒了｡
‫如果你想打包这个游戏, 你可以很容易地做到这一点, 通过去到顶部,
‫并点击平台图标, 无论是Windows, 如果你在Windows机器或iOS, 如果你使用的是mac机器,
‫那么当然你有这些其他的选项.
‫如果你想为其他平台打包, 我建议你在网上做一些研究, 查找不同的平台以及如何为它们打包｡
‫我使用的是Windows计算机, 因此只需单击此处的“package project for Windows”（为Windows打包项目）,
‫它就会询问我希望将游戏打包到哪里｡
‫现在我有我的项目在这里调音坦克｡
‫我将右键单击, 创建一个新文件夹, 然后简单地调用此构建｡
‫这通常是您放置打包项目的位置｡
‫所以我将选择该文件夹, 并允许虚幻引擎打包我的游戏｡
‫这可能需要几分钟的时间, 一旦完成, 我应该有一个打包的游戏｡
‫好吧, 我会的
‫因此, 一旦完成打包, 我们应该会在输出日志中看到构建成功,
‫然后我们可以查看为打包项目指定的文件夹｡
‫对我来说, 它将是这个构建文件夹｡
‫现在我打包了四个窗口, 所以我有一个Windows文件夹, 这是我的tune tank, 点xy｡
‫是个可执行文件｡
‫我可以双击它, 这里是我的最终项目｡
‫我会开枪｡
‫我可以躲闪｡
‫看起来我的敌人塔可以向我射击, 我可以摧毁他们｡
‫是的, 我能摧毁他们｡
‫他们可以摧毁我, 看起来, 我可以输掉比赛｡
‫当然, 如果我再熟练一点, 我就能赢得比赛｡
‫最后一个挑战, 我会让你在游戏中加入自己的风格｡
‫让这个游戏成为你自己的游戏｡
‫找到一些新的声音或效果或网格, 并创建一些时髦的期待塔和坦克｡
‫增加更多的塔, 也许增加不同的技能水平, 使塔越来越难, 因为你在你的水平的进展｡
‫也许水平坦克, 给予它一个水平, 你可以增加, 因为你摧毁越来越多的塔｡
‫也许你可以添加新的水平几何图形, 使坦克爬上斜坡, 并试图摧毁坦克在难以到达的地区｡
‫可能性是无穷无尽的, 但最重要的是, 玩得开心｡
‫在你开发游戏的时候｡
‫你不打算暂停视频为这个挑战｡
‫这将是你可以做的事情从这一点向前与您的游戏项目｡
‫所以恭喜你
‫我们的游戏结束了｡
‫我希望你喜欢这一部分｡
‫我玩得很开心｡
‫这是一个伟大的游戏项目, 你已经走了很长的路｡
‫在本节课程中, 您已经学到了大量的技能, 因此我希望您已经准备好继续学习更令人兴奋的内容｡
‫非常感谢您的光临｡
‫我是史蒂文, 我们很快就会见面的｡