‫嘿, 你好
‫欢迎回来｡
‫现在, 我们已经设置了一个回调函数, 它绑定到代理, 以防止受到任何损坏｡
‫最后一步是实际生成损坏事件｡
‫当我们的抛射体击中某个物体时, 我们就想这样做｡
‫一旦我们为这个委托进行了广播, 我们就可以对我们击中的东西施加伤害｡
‫我们将使用应用伤害来广播这个事件, 它属于游戏静态类｡
‫让我们来看看应用的损伤函数｡
‫现在这里是应用伤害的文档, 它说用一般伤害伤害指定的角色｡
‫所以这是一个应用伤害的通用函数｡
‫我们如何回应这位代表的广播取决于我们｡
‫现在, 我们看到我们需要包括游戏静态, 在语法中, 我们看到几个输入参数｡
‫现在我们实际上得到了一些参数的描述｡
‫如果我们继续向下滚动, 我们会看到受损的参与者是好的, 将受损的参与者是基础损害,
‫在这里应用真正的描述性文档｡
‫-谢谢—谢谢
‫史诗事件煽动者是负责造成这种损害的控制者｡
‫比如说, 上面写着开枪的玩家｡
‫当它说播放器时, 它指的是那个控制器｡
‫然后我们有损害致因, 即实际造成损害的行为者｡
‫上面写着爆炸的手榴弹｡
‫在我们的情况下, 这将是炮弹爆炸｡
‫最后, 我们有损伤类型类, 这是一个描述所造成的损伤的类｡
‫现在回到语法部分, 我们可以看到这些输入的类型, 我们可以看到damage
‫type class是的子类, 我们之前已经看到, 的TW子类将满足类型U class的输入参数｡
‫当我们调用apply damage的时候, 我们可以传入一个U类来表示我们想要使用的伤害类型.
‫我们稍后将讨论如何满足这个输入参数｡
‫因此, 色调游戏静态功能, 应用的损害是要采取一些输入参数｡
‫让我们来计划一下如何传递合适的值当我们调用这个函数时, 我们看到首先我们需要受损的参与者｡
‫好吧, 让我们回到投射CP, 我们称之为施加伤害｡
‫我们想在这里做, 我们不再需要这些日志｡
‫所以我只需要删除它们, 注意到我们的on hit回调在被调用后会得到一些传入的输入｡
‫当on组件命中委托被广播时, 我们会看到我们有了其他参与者｡
‫所以我们可以接触到被炮弹击中的演员, 而这就是我们想要伤害的演员｡
‫这样就可以处理第一个输入参数｡
‫会是另一个演员｡
‫接下来, 我们需要伤害量, 这意味着我们的抛射体应该有一个伤害变量,
‫这样我们就知道要施加多少伤害｡
‫所以为什么我们不进入投射特效, 增加一个伤害变量, 这个变量可以是浮点数｡
‫我们可以简单地称之为damage, 我们可以将其初始化为一个值, 比如50 F,
‫因为这是我们可能想要实验的, 我们可以给予它一个U属性, 来公开它,
‫让它在任何地方编辑｡
‫所以现在我们有一个伤害金额传递时, 我们呼吁采取损害｡
‫现在, 下一个参数是激发器, 我们看到它是A型控制器｡
‫那我们怎么拿到控制器
‫我们已经看到, 我们可以使用get owner函数获得特定组件的所有者｡
‫这将返回拥有特定组件的参与者, 这些投射是动态产生的｡
‫所以我们需要确保, 如果我们要调用get owner, 所有者已经设置好了,
‫现在我们从基础兵中产生这些｡
‫所以如果我们进入垒卒｡
‫这是我们生成演员的地方, 但是Spawn Actor也返回一个指针, 指向被生成的演员,
‫这样我们就可以把它存储在一个局部变量中｡
‫例如, 我们可以说auto projectile, 并指定从spawn actor返回的值｡
‫现在, 如果您不熟悉auto, 它允许编译器确定要分配给这个新变量的类型｡
‫如果你把鼠标悬停在它上面, 你会看到它有一个类型为A的投射指针, 因为这是我们从spawn
‫actor函数中签名的｡
‫这就像我们在这里放了一个投射物指针, 现在我们可以访问新生成的投射物｡
‫我们这样做的原因是我们想设置它的所有者｡
‫我们要确保它的所有者设置为产生它的兵｡
‫所以我们可以说抛射体｡
‫这里有一个函数叫做集合所有者｡
‫集合所有者取一个演员, 我们要传递这个, 这样当一个兵产生一个投射物时,
‫它就会把那个投射物设为所有者.
‫这样的话, 如果我们再调用get owner,
‫我们就能得到这个类的实例.
‫回到这里, 在projectiveDHCP中, 我们有get owner函数调用, 我们可以将其存储在一个本地变量中｡
‫我将继续使用auto, 并将其称为我的所有者, 并将其设置为get owner返回的结果｡
‫所以现在我们有了一个存储所有者值的本地参与者指针｡
‫现在, 我们可以从该执行元访问煽动者控制器｡
‫现在, 在我们这样做之前, 最好检查一下以确保我的所有者不为空｡
‫所以我会说如果我的所有者是null等于等于null指针, 那么我会简单地返回｡
‫现在, 如果你if body有一个这样的语句, 你可以把它放在同一行, 不用花括号,
‫以防你不知道｡
‫而null指针是C++中的一个关键字, 它允许你检查一个指针是否是null指针｡
‫所以如果我的所有者为null, 那么我们将提前退出函数, 不做其他任何事情｡
‫现在, 正如我所说的, 我们可以从我的所有者那里得到煽动者控制器,
‫这就是函数get煽动者控制器的用法｡
‫如果我们把鼠标悬停在上面, 我们会看到它返回一个A控制器指针｡
‫我只需要使用auto并将其存储在一个局部变量中, 我称之为我的所有者instigator｡
‫所以现在我们知道该传递什么作为煽动者了｡
‫下一个输入是伤害原因, 这是对投射物造成伤害的行为者｡
‫这将是简单的｡
‫剩下的是最后一个输入参数, 即损坏类型｡
‫我们看到它是的一个子类, 这意味着我们需要正确的使用类来传递｡
‫N现在这里是你的损坏类型的虚幻引擎文档｡
‫它说, 一个损害类型的目的是定义和描述一个特定形式的损害, 并提供一个渠道,
‫定制反应的损害从各种来源｡
‫现在, 我们不打算定制我们的破坏｡
‫我们只需要满足输入参数, 这意味着我们需要一个U类值来表示这个损坏类型类｡
‫现在在C++中, 如果我们想得到YOU类中的任何一个特定的类比如你破坏的类型, 我们可以调用一个叫做static类的函数｡
‫这是从您的物件类别继承而来｡
‫当然, 我们现在使用的是你的伤害类型, 所以我们需要标题｡
‫我从文档中拷贝了include行,
‫然后把它粘贴到projectile CP的顶部, 现在你会看到这个静态类函数返回了一个U类指针, 这个新的类将代表新的破坏类型C++类｡
‫现在, 由于我们没有根据你的伤害类型创建蓝图, 也没有设置一些额外的数据,
‫所以我们并不需要变量的子类｡
‫所以在这个例子中我们可以使用static class, 这将返回一个U类, 代表这个类型｡
‫我们可以把它存储在一个变量中, 我把它叫做damage type类｡
‫这是我们可以传递的最后一个参数, 以应用损害｡
‫所以我们现在有了所有需要传递到应用损伤函数的信息｡
‫但是在我们这样做之前, 我想进行一些检查, 以确保我们调用这个函数是适当的｡
‫所以我在这里做一个if语句｡
‫首先, 我想确保其他参与者不为null｡
‫所以我要把另一个演员放在这里｡
‫我将在这里放置一个and, 这样我就可以检查以确保其他参与者不等于此参与者｡
‫我们不想对自己造成伤害, 如果我们是抛射体, 现在我将放置另一端,
‫并确保其他演员不等于我的主人｡
‫如果射弹对主人造成伤害就不好了｡
‫现在如果我们进入if语句, 我们就知道调用apply damage是合适的, 这样我们就可以这么做了｡
‫这就是你们的挑战｡
‫所以在我们新的if语句中, on hit函数调用了你的游戏静态应用损伤函数｡
‫这意味着您需要为游戏静态信息包含正确的头部, 并且知道要传入哪些输入参数｡
‫所以现在暂停视频并添加函数调用以在命中函数中应用伤害｡
‫好吧, 我会的
‫所以我在这里的投射CP, 我将包括头文件的游戏静态, 我们可以看到,
‫从应用损害文档页面, 包括是kismet斜线游戏静态｡
‫我将把它粘贴到这里, 现在我可以调用应用损坏了.
‫所以我打算叫你游戏静态应用伤害｡
‫现在, 只要我键入左括号, 就会弹出提示框, 提醒我需要输入参数｡
‫第一个是受损的演员, 那是另一个演员.
‫所以我们接下来要输入其他演员｡
‫我们需要伤害数值, 我们在投射特效中增加了这个伤害浮动, 我们将其设置为50｡
‫所以我接下来要跳过damage端｡
‫我们需要煽动者, 我们有我的主人煽动者｡
‫所以我将把我的所有者传递给煽动者｡
‫其次是损害原因｡
‫当然, 抛射体本身就是造成伤害的原因｡
‫所以我们要把这个传递进去｡
‫最后, 我们需要damage类型的子类, 我们知道U类指针可以满足这个要求,
‫这就是为什么我们有damage类型类｡
‫所以让我们传入破坏类型类｡
‫我们现在称之为应用损坏｡
‫所以当我们调用它的时候, 我们会生成damage事件, 而on take, any,
‫damage代理会对此做出响应, 这意味着在我们的健康组件中, damage taken会被调用｡
‫所以我们只需要在这里做点什么｡
‫嗯, 这将是有意义的采取这一损害, 并减去该数额的健康｡
‫不过, 在我们这么做之前, 我想先确认一下损害不小于或等于零｡
‫F在记录损坏之前进行这些检查是有意义的, 只是为了确保我们不会应用一个没有任何意义的值,
‫比如零或负值｡
‫所以如果是这样的话, 我们就直接回去｡
‫当然, 如果你想耍滑头, 像我在CP的projectile中做的那样, 我们可以把回报放在那里｡
‫现在, 如果我们越过这条线, 伤害值是正值, 所以我们可以用生命值减去伤害值.
‫为了确保这是工作, 为什么我们不把一个euy日志在这里？
‫Yui日志, 临时警告文本, 我们可以简单地打印健康值, 以及百分比F和健康值, 然后我们可以编译｡
‫现在编译成功了, 我们将返回编辑器, 打开输出日志, 点击播放｡
‫现在让我们看看我们能不能被炮弹击中｡
‫好了
‫我们的生命值现在降到了50, 如果我们再次被击中, 我们会得到相当多的命中事件,
‫因为我们非常快地多次击中抛射体｡
‫但我们看到我们的健康状况记录得很好｡
‫因此, 我们确实需要确保在健康状况为零时, 我们在死亡时实施正确的行为｡
‫但我们也需要确保我们不会得到这个点击事件垃圾邮件多次｡
‫现在我们知道投射物应该在击中某个东西时被销毁, 所以防止垃圾邮件发送击中事件的最好方法是销毁投射物｡
‫这是我们在这段视频中要做的最后一件事｡
‫所以回到投射体, 在受到伤害后, 我们能做的就是让投射体自毁, 这再简单不过了.
‫我们简单地称之为destroy函数｡
‫在编辑器中再编译一次, 我们就可以继续, 然后被一个投射物击中, 看看这个｡
‫炮弹不见了｡
‫所以它造成了伤害然后就消失了｡
‫当然, 我们也可以测试击中塔楼的情况, 用投射物爆破它们,
‫并确保这些击中事件是触发的｡
‫正如你所看到的, 我可以用一大堆炮弹来攻击这个塔,
‫我们会看到这个可怜的塔的健康值变得非常非常负｡
‫总之, 我们调用了apply damage函数, 这导致了对on take any
‫damage委托的广播｡
‫我们在健康组件中记录了健康状况, 并销毁了炮弹｡
‫所以我们现在已经处理了损坏｡
‫我们还没有处理死亡｡
‫这将是我们在以后的视频中要介绍的内容之一｡
‫我很快就会见到你的｡