‫你好, 欢迎回来｡
‫现在我们已经创造了一个坦克, 可以移动, 甚至旋转它的炮塔｡
‫我们现在准备创建一个塔类, 它可以继承坦克从基本pod类继承的一些功能｡
‫现在, 一旦我们创建了一个塔类, 我们将覆盖tick函数, 这样我们就可以旋转它的炮塔了｡
‫所以我们的目标是让炮塔旋转, 这样它们就能一直看着坦克.
‫这样, 当他们开始发射炮弹, 他们会击中坦克有时只要坦克没有移动的方式很快｡
‫我们还要想办法弄到坦克｡
‫这样我们就可以瞄准坦克——然后把塔的炮塔转向坦克——｡
‫我们准备好了一些炮弹战斗｡
‫我现在在编辑器中, 我将进入tune tank文件夹, 基本类和tank类都在那里.
‫现在, 我想在基类的基础上创建一个塔式类.
‫我们在坦克课上的做法是对的｡
‫单击base-—并选择create C++ class derived from based
‫on（创建从基于派生的C++类）另一种方法是转到tools（工具）并选择new C++ class（新的C++类）｡
‫在这里, 我们可以单击显示所有类的选项卡, 然后搜索base-—｡
‫这里我们看到了我们的基类｡
‫如果我选择此选项并单击“下一步”, 现在我将基于base-—创建一个新类｡
‫我会把它放在和其他C++类一样的路径上, 我会把它叫做塔.
‫因此, 让我们单击“创建类”｡
‫这是我的新塔时代和塔点｡
‫CP现在我们需要的第一件事是滴答功能, 因为塔要旋转它的炮塔, 面对——｡
‫所以我们要重写tick函数｡
‫我将创建一个新的公共部分, 我们将输入virtual void tick, 它接受一个名为Delta
‫Time的浮点数, 这是一个覆盖值.
‫现在, 我们将在以后的视频中详细介绍virtual和override,
‫但我们实际上是采用继承的tick函数并为其创建新的实现｡
‫让我们在Tower CP中实现tick函数｡
‫现在, 我们需要在tick函数名称前面加上一个tower和双冒号｡
‫和往常一样, 跟注超级分笔成交点是一个好主意, 我们需要传递Delta时间｡
‫现在我想做的是旋转坦克炮塔, 使炮塔威胁到坦克, 并准备发射炮弹｡
‫但我想只有在坦克在射程内时才能这么做｡
‫现在, 为了知道坦克是否在射程内, 我们需要知道从炮塔到坦克的距离｡
‫这里有一个小发明代表了世界的起源
‫换句话说, 就是空间中X､ Y和Z为零的点｡
‫现在, 当我们谈论一个演员的位置时, 我们谈论的是从原点到那个位置的向量｡
‫我们总是可以通过获取演员位置来获取位置向量, 这样我们就可以得到其中一个塔的位置和坦克的位置｡
‫如果我们知道这两个位置, 我们就可以计算出它们之间的距离｡
‫现在, 我们可以用向量数学来做这个, 但是F向量类有一个函数, 叫做dist,
‫这个函数取位置向量, 它返回的是它们之间的距离｡
‫在塔CP文件中, 在tick函数中, 我将写几个注释, 以便我们知道应该做什么｡
‫首先, 我们需要找到距离坦克后, 检查, 看看坦克是否在范围内,
‫如果在范围内旋转炮塔对坦克｡
‫所以我们有一些事情要做｡
‫现在, 为了找到到坦克的距离, 我们需要抓住坦克｡
‫现在, 一个很好的地方是这样做的开始发挥｡
‫因此, 除了tick函数之外, 让我们继续并覆盖开始Play｡
‫现在注意在坦克H, 开始发挥是在一个保护区｡
‫我们也要把它保护在塔里｡
‫因此, 我们将把protected部分放在public部分下面, 并在tick下面实现开始play｡
‫让我们转到Tower Dot, CP, implement, 开始play, 完全限定函数名, 正如您可能猜到的,
‫我们调用Super Begin Play｡
‫现在, 为了获取tank并将其存储在变量中, 我们需要一个类型为tank的变量｡
‫所以我们要把它放在H塔的一个私人区域｡
‫这是一个A型坦克, 它是一个指针, 我们可以简单地称它为坦克｡
‫为了避免在这里包括坦克H, 我们可以提前声明, 我们已经看到了它的重要性｡
‫现在我们有了这个坦克指针, 如果我们知道如何进入坦克, 我们就可以把它存储在坦克指针里,
‫然后开始游戏.
‫我首先要做的是把坦克H包括进去, 这样我们就可以使用这个类型了｡
‫那我们怎么进入水箱？
‫好吧, 这里有一个名为get player pawn的实用函数的虚幻引擎文档｡
‫它存在于一个游戏静态｡
‫既然我已经打开了它, 我将继续复制游戏静态的include, 并查看语法｡
‫它有两个输入一个世界上下文对象｡
‫我们已经知道如何处理这一点和球员指数｡
‫就像我们在单人博弈中看到的, 参与者索引总是0号参与者这样我们就可以访问0号参与者对应的棋子.
‫我们把这个函数叫做塔点CP｡
‫我将粘贴include, 然后在开始播放时,
‫我将把tank设置为等于你的游戏静态, get player-—对于世界上下文对象｡
‫我可以传递这个, 对于球员指数, 我们可以传递零｡
‫现在看看红色的曲线｡
‫它说A型兵的值不能赋给A型坦克的实体｡
‫这与我们在尝试调用､ 获取控制器并将结果存储在A播放器控制器中时遇到的问题完全相同｡
‫坦克是兵的子级, 所以我们不能在子指针中存储父类型｡
‫我们必须这样做｡
‫你猜对了, 我们得赶了｡
‫所以我们要把返回的值放在一个转换函数调用中.
‫所以我们要说cast我们要对坦克施法｡
‫我们要传递给投出的是这个让玩家Pond跟注的指令｡
‫所以我们把它放在括号里｡
‫施法完毕后我们就能进入水箱了｡
‫现在我们已经接触到了水箱, 我们可以找到水箱的距离, 距离就是浮子的距离.
‫所以我们可以做一个局部浮点变量叫做distance｡
‫我们要设置它等于调用F向量静态函数dist的结果｡
‫现在, dist接受两个类型为F vector的输入参数｡
‫现在我们需要空间中两点之间的距离｡
‫一是塔位｡
‫我们在塔类中, 所以我们可以调用获取演员位置, 这样就得到了塔的位置｡
‫但是坦克呢？
‫好吧, 我们可以打电话给坦克, 得到演员的位置, 现在我们有了距离｡
‫现在唯一的问题是, 我们在使用tank指针时没有首先检查它是否为空｡
‫所以我们必须先说if tank然后我们可以把这个函数调用拖到if语句里.
‫因此, 如果tank是有效的, 那么我们可以通过get actor location访问它的位置｡
‫好极了｡
‫因为我们在处理if语句,
‫我将把其他的注释移到里面, 因为我们知道我们不能检查坦克是否在范围内, 如果坦克是无效的｡
‫所以我想挑战你把炮塔转向坦克｡
‫现在, 我们只想在坦克在射程内的情况下这样做, 我们有距离｡
‫所以现在我们需要一个射程变量｡
‫因此, 在塔类中创建一个名为fire range的浮动对象, 并使用属性将其公开｡
‫我们希望能够在编辑器中编辑此内容｡
‫现在你要检查一下坦克是否在射程内｡
‫如果叫旋转炮塔, 旋转炮塔需要一个看目标的角度｡
‫你要通过坦克的位置｡
‫暂停视频, 立即执行此行为｡
‫好吧, 我会的
‫所以我们需要一个射程变量｡
‫所以在H座, 我们有一个私人区域｡
‫我们要做一个花车｡
‫我把这个叫做射程, 我会把它初始化为, 比如说, 300华氏度.
‫但我们会尝试一下, 因为这将是一个你的财产｡
‫所以你的财产｡
‫因为我想让所有坦克都有相同的射程, 所以我会把它设为默认值.
‫因此, 我们只能在默认蓝本上编辑它｡
‫现在, 如果您在任何地方进行编辑, 或者只编辑实例, 这完全没有问题｡
‫这是一个偏好的问题, 我们可以稍后更改｡
‫我也会给予它一个类别, 我会把这个类别叫做战斗｡
‫让我们进入CP塔, 这里有下一个点｡
‫检查坦克是否在射程内, 这意味着我们需要检查距离是否小于或等于射程｡
‫我们有小于或等于而不仅仅是等于,
‫因为从一帧到另一帧, 距离实际上可能大于一帧的射击范围, 而小于射击范围的下一帧完全掠过射击范围｡
‫所以它实际上可能永远不会完全等于射程｡
‫实际上, 对于浮点值, 两个浮点值完全相等是非常罕见的｡
‫所以我们有这个如果检查, 如果我们到达它的内部, 这意味着距离小于或等于射程｡
‫坦克现在在射程内, 这意味着这条评论可以移动到那里｡
‫现在, 如果在射程内, 将炮塔转向坦克, 这意味着我们要调用旋转炮塔功能.
‫这是我们放在基地舱里的保护功能｡
‫现在转动炮塔看看目标, 我们需要坦克的位置｡
‫所以这将是坦克得到演员的位置｡
‫我们现在称之为旋转炮塔只有当坦克在射程内｡
‫让我们编译一下, 看看它是如何工作的｡
‫我们回到了编辑器, 我们需要做的是进入蓝图, 兵, 找到一个BP兵炮塔,
‫打开完整的蓝图编辑器｡
‫现在在右上方, 我们看到了父职业的基础兵, 但是我们希望我们的父职业是塔, 这样我们就可以进入职业设置,
‫父职业, 搜索塔并选择它｡
‫现在我们的兵炮塔是基于塔类的｡
‫现在让我们看看当我们点击播放时会发生什么｡
‫好吧, 我在移动水箱｡
‫我们不在射程内, 所以我们没有看到任何来自塔的移动｡
‫但如果我进入射程, 看看这个｡
‫现在他们跟着我, 看起来很危险｡
‫现在300个单位并不遥远｡
‫所以我想做的就是编辑这个距离｡
‫因此, 从这里在BP典当炮塔, 我将选择BP池塘炮塔自己｡
‫这是战斗部分｡
‫我将把它设置为大约700｡
‫现在, 如果我点击播放, 我会看到当我回到这里时, 它们不会旋转｡
‫但我一进入射程, 他们就盯上我了｡
‫好极了｡
‫总之, 我们创建了塔式机类｡
‫我们现在有一个敌人的坦克｡
‫我们还在滴答功能中旋转塔的炮塔朝向坦克, 我们只在坦克在射程内时才这样做｡
‫我们还公开了射程变量, 以便可以在蓝图中调整｡
‫我们几乎准备好战斗了｡
‫我们将在接下来的视频中开始设置｡
‫我很快就会见到你的｡