‫所以如果我靠近我们的塔, 我可以看到他们正在绘制调试球体, 证明他们正在调用fire函数,
‫而且他们每2秒就这样做一次｡
‫除此之外, 他们只调用这个函数｡
‫如果我在射程内, 如果我回到这里, 你会注意到他们没有画调试球｡
‫因此, 这也涉及到距离检查｡
‫一旦我足够接近, 他们就开始画那些调试球体｡
‫你好, 欢迎回来｡
‫现在我们已经创建了一个fire函数, 我们在tank类中使用它, 因为我们已经把它绑定到了fire动作映射.
‫但我们也想在塔类中重用它｡
‫现在, 我们将使用计时器, 而不是使用塔式类的用户输入｡
‫我们将为塔类创建一个计时器, 以便计时器可以调用fire函数｡
‫每隔一段时间, 我们会在调用fire函数之间设置一个指定的秒数｡
‫既然我们希望在塔类中经常调用fire函数, 那么现在我们需要讨论计时器｡
‫Unreal Engine可以使用一个名为F Timer Manager的类来设置计时器｡
‫存在管理世界中的定时器的世界定时器管理器｡
‫现在这个世界定时器管理器有一个名为Set Timer的函数, set Timer需要一些输入,
‫比如一个定时器句柄｡
‫这是由计时器管理器管理的特定计时器的句柄｡
‫这允许管理器拥有多个计时器, 我们可以通过使用计时器句柄作为该计时器的名称或ID来访问每个计时器的计时器信息｡
‫这是一个类型为F的对象计时器句柄｡
‫因此, 我们创建一个计时器句柄, 并将其传递给set timer函数｡
‫现在, 设置计时器还需要其他输入, 如速率或在实际执行某项操作之前应等待的时间量｡
‫这就是回调函数中的内容｡
‫我们创建了一个函数, 并将该函数绑定到计时器, 以便一旦经过足够的时间,
‫特别是计时器速率, 就可以调用回调函数｡
‫我们已经看到了计时器需要一些东西, 我们将把这些东西放在塔类中｡
‫让我们进入H塔, 在H塔文件中, 我们将添加一些私有变量｡
‫在射程范围内, 我们需要一个计时器手柄｡
‫这是一个F计时器句柄, 我们可以简单地调用这个触发速率计时器句柄｡
‫我们还需要一个射速, 这将是一个浮动｡
‫我们称之为射速, 我们可以把它初始化为2, F｡
‫这样的话, 在回调函数被调用之前, 我们会有两秒钟的等待时间｡
‫说到回调函数, 我们实际上需要一个｡
‫我们要做一个void函数, 我们称之为检查激发条件｡
‫我们有一个计时器句柄, 一旦我们设置了计时器, 它就开始运行了,
‫那么在计时器真正导致函数被调用之前, 我们有2秒的等待时间｡
‫我将此称为检查火灾条件,
‫因为我们可以检查塔是否能够调用火灾函数, 这样我们就可以设置一些条件, 以检查是否应该调用火灾｡
‫现在我们已经声明了fire条件函数｡
‫我们需要对其进行定义, 以便进入塔CPP并在此处定义函数｡
‫我将把它放在开始play下, 所以我将给它一个函数体, 并在函数名之前给它一个塔类名称.
‫现在我们有了一个函数, 但我们实际上需要设置计时器, 以便计时器开始计时,
‫并在计时结束时调用函数｡
‫我们可以在这里设置计时器, 然后开始游戏, 这样它就会从游戏开始时开始运行｡
‫我们提到了世界定时器管理器, 我们可以通过一个名为“获取世界定时器管理器”的函数来访问它｡
‫现在获取世界定时器管理器, 返回一个F定时器管理器对象｡
‫由于我们使用的是该类型, 因此需要包含F计时器管理器的头文件｡
‫这是一个简单的计时器管理器h｡
‫我们还可以看到一些属于这个类的函数｡
‫因此, 如果您对F定时器管理器的所有不同功能感兴趣, 请滚动浏览这些功能｡
‫因此, 我们可以将此头文件包含在塔的顶部, 就在其他包含文件的下面｡
‫现在, 我们已经包含了头文件, 现在我们可以访问世界定时器管理器, 我们感兴趣的函数称为set
‫timer｡
‫现在, get世界计时器管理器只返回一个F计时器管理器, 它不返回指针｡
‫所以我们要用点来代替｡
‫箭头, 我们将调用设置计时器｡
‫现在设置计时器有几个版本或函数重载｡
‫现在, vs代码有这个弹出窗口, 让我们浏览每个重载, 看看这个函数的不同版本｡
‫我感兴趣的版本首先使用F计时器句柄, 我们将使用我们在H塔中声明的射速计时器句柄｡
‫现在, 我们的特定函数重载的下一个参数将是user类, 就像在bind axis和bind
‫action中一样｡
‫这是我们要处理的类, 我们要在其中绑定函数, 它就是这个.
‫接下来是回调函数, 它将是我们刚刚创建的A塔检查火灾条件｡
‫现在我们需要operator的地址, 因为set timer需要函数地址｡
‫下一个参数是一个浮点数, 表示在回调函数被调用之前, 需要经过多长时间.
‫这就是我们的射速｡
‫最后一个参数是一个布尔值, 它将指定该计时器是否应该循环｡
‫现在我希望我们的回调函数每2秒调用一次, 所以我希望这个计时器循环｡
‫所以我要说是真的｡
‫如果我们传递false, 则会经过2秒｡
‫我们的函数会被调用, 就这样｡
‫但由于我们将其设置为循环, 因此我们的函数将在2秒后被调用, 之后计时器将重新启动,
‫然后再过两秒, 函数将再次被调用, 它将继续循环, 直到游戏结束｡
‫现在我们有一个绑定到计时器的函数, 它被设置为每2秒调用一次｡
‫我们已经将一个函数绑定到了计时器上, 它每2秒被调用一次｡
‫但是我们需要某种证明或者确认这个函数确实被调用了｡
‫所以, 对于你在塔类中的挑战, 进入我们新的回调函数, 检查火灾情况｡
‫确保坦克在射程内｡
‫你要检查从塔到坦克的距离｡
‫我们知道怎么做因为我们已经在tick函数中做过了.
‫因此, 您可能需要查看tick函数, 看看它是如何完成的, 以提醒自己,
‫现在检查距离, 确保我们在射程内, 如果我们在射程内, 则调用fire函数,
‫暂停视频并立即执行此操作｡
‫好吧, 我会的
‫现在我回到塔台指挥中心, 我将滚动到tick功能, 提醒自己如何获得这个距离,
‫并检查它是否在射程内｡
‫现在我们可以简单地重复使用这段代码, 检查火灾情况｡
‫现在重用代码不是很有效, 所以我们可以考虑重构它, 但首先让我们确保它工作,
‫这样我们就可以首先检查我们的tank指针, 以确保它是有效的｡
‫所以我要在这里检查一下火势｡
‫如果tank和tank是有效的, 我们接下来要做的就是得到这个距离,
‫这个值是用f向量dist函数计算出来的｡
‫我把它放在这里, 处于止火状态.
‫现在我们要做的下一件事是检查距离是否小于或等于射程｡
‫所以这就是我们要做的｡
‫如果距离小于或等于射程, 如果是这样, 我们就可以调用fire函数｡
‫所以我们要叫火, 就这么简单｡
‫让我们继续编译, 回到编辑器, 我点击播放, 进入射击范围｡
‫我可以看到我们的发射塔在炮筒的顶端画出了调试球,
‫这样我们就可以看到发射函数被调用了, 它对发射塔的作用和对坦克的作用是一样的｡
‫所以这是伟大的｡
‫这向我们证明了计时器正在运行, 并且每2秒调用一次回调函数｡
‫好的, 我们现在每2秒调用一次fire函数, 处于check, fire状态｡
‫我们有这个功能, 我们可以查看是否在范围内, 我们在tick函数中做的事情与此完全相同｡
‫因此, 这是重构的绝佳机会｡
‫我们可以创建一个函数, 如果我们在坦克的射程内, 它会返回一个布尔值.
‫那么我们为什么不继续快速地把它重构成一个多头返回函数呢？
‫所以在H座, 让我们创建一个私人功能｡
‫它会返回bool, 我们会说在射程内.
‫现在这是一个简单的游戏, 我们的塔只会在范围内与坦克｡
‫这并不含糊,
‫因为没有其他东西塔想要检查它现在是否在射程内, 如果这是一个更复杂的游戏,
‫塔想要检查距离, 那么我们可能会命名得有点不同, 但我们可以简单地称之为在射程内.
‫我要做的就是在Tower中实现这个功能｡
‫因此, 让我们继续创建函数体｡
‫我们需要一个塔来固定函数名｡
‫我们现在要做的基本上是同样的距离检查｡
‫所以我们首先要用if检查来确保tank是有效的｡
‫如果是的话, 我们就可以得到这个距离, 这样我们就可以复制这条线, 在这里创建我们的本地距离浮动,
‫然后简单地检查这个距离与射程的关系, 这样我们就可以知道, 距离是否小于或等于射程,
‫如果是这样的话, 我们就可以简单地返回true｡
‫此函数可返回值true｡
‫现在我们有了一个函数, 如果我们在范围内, 它会返回true｡
‫现在, 只要我们在if语句中点击了返回true这一行, 那么函数就会返回｡
‫我们会跳出这个功能｡
‫因此, if语句后面的任何其他语句都不会运行｡
‫所以我们能做的就是在函数的最后, 我们可以返回false因为如果我们到达了返回true,
‫我们就永远不会到达返回false这条线了.
‫我们只需提前退出该函数｡
‫但是如果我们不在范围内, 如果这个距离检查失败, 那么我们就永远不会返回true｡
‫我们将到达函数的末尾并返回false｡
‫所以这个函数会根据我们是否在范围内返回true或false, 我们可以用这个来代替在两个函数中使用重复的代码｡
‫例如, 在这里, 我们只需要在旋转炮塔之前检查一次, 看看我们是否在射程内｡
‫所以我们可以说, 如果在射程内, 如果返回真, 我们就在射程内, 所以我们可以调用旋转炮塔｡
‫所以我们把它放在if语句里｡
‫现在所有这些代码都是不必要的, 所以我们可以简单地删除它｡
‫现在这里看起来比以前干净多了｡
‫然后我们可以下来检查火势, 做同样的事情｡
‫而不是所有这些, 我们可以简单地检查, 如果在射程｡
‫如果我们是, 我们可以简单地调用火｡
‫现在, 我们已经成功地将所有代码重构为一个检查, 该检查在我们的in fire range函数中进行｡
‫让我们再次编译并真实的测试它, 以确保一切都按预期运行｡
‫所以我们要按播放键进入射击范围｡
‫当然, 我们在射程内, 它工作正常｡
‫总之, 我们创建了一个计时器, 每隔2秒调用一次塔类中的fire函数｡
‫现在我们也在检查坦克是否在射程内
‫所以我们只在坦克在射程范围内的情况下每2秒调用一次射击函数｡
‫我们还看到, 我们在两个不同的函数中使用了距离检查｡
‫所以我们把它重构成自己的函数, 然后调用它来检查是否在范围内｡
‫所以我们现在有一个在塔类上调用的fire函数｡
‫接下来要做的是用我们的火功能开始产卵抛射物｡
‫所以我们会在下一个视频中讨论这个问题｡
‫我很快就会见到你的｡