‫所以我们的目标是能够发射抛射体,
‫并在抛射体击中什么东西时获得爆炸效果, 包括我们击中敌人塔的时候, 以及敌人塔的抛射体击中我们的时候｡
‫你好, 欢迎回来｡
‫现在让我们来看看我们的分区计划, 看看我们已经走了多远｡
‫现在我们知道我们已经创造了一个坦克｡
‫它可以在世界各地移动｡
‫我们造了一个敌人的炮塔类｡
‫我们在游戏中增加了射击功能和射弹沿着生命伤害和破坏｡
‫现在, 我们有赢和输的条件, 我们显示这些与小部件到我们的HUD｡
‫现在最后一项是添加我们的特效, 这意味着我们需要一些烟雾尾随我们的炮弹以及一些爆炸和声音｡
‫我们还将添加一些其他的东西来增加我们的游戏的趣味性, 使它看起来更精致｡
‫在这段视频中, 我们将处理一些碰撞粒子｡
‫这些是当炮弹击中某物时的特效｡
‫这将涉及到一个叫做粒子系统的东西｡
‫让我们回到编辑器中, 看看我们项目中的粒子系统｡
‫所以我在这里编辑｡
‫我将进入“资源”文件夹和“效果”, 这里有三个效果｡
‫这些被称为粒子系统｡
‫现在我们有一个命中效果, 一个死亡效果和一个抛射轨迹｡
‫现在, 我们继续, 双击p点击效果, 你会看到这里有一个粒子系统编辑器｡
‫在这个小视窗中, 我们会看到爆炸一次又一次地发生｡
‫幸运的是, 这个粒子系统已经为我们创造出来了, 它看起来像一个漂亮的小爆炸｡
‫我们希望看到这种爆炸发生在抛射体击中物体的瞬间｡
‫这就是我们这段视频的目标｡
‫在V的代码中, 我想回到我们的投射类｡
‫我们来看看抛射体H, 我会在这个类中加入一个变量, 这就是一个粒子系统｡
‫这可以是一个私有变量, 类型是U.
‫粒子系统, 它是一个指针, 我们称之为碰撞粒子｡
‫现在我要向前声明它, 并且给予它一个新的属性.
‫假设你的财产, 我想在任何地方做这个, 这样我们就可以根据发射体的蓝图来设置这个｡
‫既然这样, 我会给予它一个类别, 我会把它放在战斗类别中,
‫因为它和我们的其他战斗变量有关系.
‫现在, 这是随处编辑, 因为我们计划在蓝本中进行设置, 这样我们就可以继续进行编译｡
‫现在让我们返回编辑器, 我将关闭其他蓝图, 并进入蓝图中的演员文件夹｡
‫演员们, 这是我们的B｡ 页：1 射弹
‫让我们打开它, 然后打开完整的蓝图编辑器｡
‫现在, 让我们来看看细节｡
‫面板｡
‫请记住, 必须选择BP射弹自我才能看到这些总体变量｡
‫这是我们的战斗部分, 我们看到了撞击粒子｡
‫这里有一个下拉菜单, 我们可以选择粒子系统｡
‫因为这个变量是你粒子系统的类型, 我们将对我们的命中粒子使用命中效果｡
‫现在我们有了一个变量, 它的值在投射体蓝图中设置｡
‫我们来编译并保存它｡
‫下一步就是在我们击中某个物体时,
‫生成这个粒子系统, 这意味着onhit是一个完美的函数, 现在我们需要知道如何生成粒子和使用游戏性｡
‫静力学有一个方便的功能｡
‫它被称为spawn emitter at location, 它表示在给定的位置和旋转播放指定的效果｡
‫开枪就忘｡
‫这很好, 因为我们不必担心删除它｡
‫我们只是启动这个函数｡
‫它生成粒子系统, 并为我们清理它, 这很棒｡
‫现在让我们来看看语法｡
‫有许多输入参数, 但这个函式有许多多载｡
‫现在, 由于这个函数有很多版本, 让我们进入V的代码, 看看那些不同的版本｡
‫现在, 我将打开投射CP, 并查看on hit函数｡
‫现在就在底部这里, 我将输入游戏静态spawn emitter at
‫location, 只要我输入左括号, 它的弹出窗口显示我需要传入的输入参数.
‫但是我们看到的是三个中的一个, 这意味着这个函数有三个不同的版本｡
‫三重超载｡
‫我将单击向下箭头两次, 以查看此特定的过载｡
‫现在, 它需要一个世界上下文对象､ 一个粒子系统和一个位置, 其余的输入参数具有｡
‫默认值, 因此它们是可选的｡
‫请注意, 旋转参数设定为零旋转器｡
‫现在, 如果我们愿意, 我们可以通过传入get active rotation, 将发射器的旋转设置为演员的旋转｡
‫这不是很重要, 但我想用与演员相同的旋转来繁殖发射器｡
‫所以我想使用get active rotation并把它传递进去｡
‫但这些参数的其余部分是可选的｡
‫既然我们知道需要在location调用spawn emitter来播放一个粒子系统, 我们可以在on hit函数中完成｡
‫我们知道第一个参数是一个世界上下文对象, 我们已经知道如何处理它｡
‫我们知道它需要一个粒子系统, 我们有一个可以传入的粒子系统变量｡
‫我们还知道, 我们需要位置和旋转, 我们知道如何使用获取演员位置和获取演员旋转来获取给定演员的位置和旋转｡
‫既然你已经有了所有这些信息, 我希望你能使用U游戏静态函数在命中函数中的位置处为抛射体类生成发射器｡
‫因此, 将这个传递给世界上下文对象, 传递给粒子系统本身,
‫我们创建的新命中粒子变量, 并使用投射物位置, 通过获取活动位置, 使用投射物旋转,
‫通过获取演员旋转｡
‫暂停视频, 并在点击功能中产生发射器｡
‫好吧, 我会的
‫所以我将删除这行代码, 我们用来查看这个函数的函数重载｡
‫我会在我们毁掉演员之前把这个放好｡
‫所以如果你把它放在函数的末尾, 没问题.
‫挑战对你来说是开放式的｡
‫但我们要在销毁演员之前放置它, 因为如果我们销毁演员,
‫那么在那之后繁殖粒子就没有意义了｡
‫所以我们要在毁掉演员之前做这个｡
‫所以我们会说, 你的游戏静态生成发射器在位置, 首先我们需要我们的世界上下文对象, 这将是这样的｡
‫接下来, 我们需要命中粒子, 然后是我们的演员位置, 我们将使用获取演员位置｡
‫接下来, 我们将传入旋转, 我们将使用get actor rotation,
‫现在我们将在该位置生成发射器｡
‫我想指出的一点是如果我的所有者是一个空指针, 我们提前从这个函数返回, 那么,
‫最好销毁这个投射体.
‫所以我想删除这个return语句, 并给予这个if语句它自己的主体仍然会返回｡
‫但就在我们回来之前, 我们应该摧毁演员｡
‫如果过牌, 我会跟destroy.
‫事实上, 即使我们没有通过所有其他的检查, 检查其他演员,
‫我们不希望一个抛射体只是徘徊在世界各地｡
‫所以我们应该把第二个要销毁的调用移到if检查之外｡
‫这样的话, 我们就能在炮弹击中目标时摧毁它, 不管是什么｡
‫这样的话, 我们就不会有任何原因的拖延弹｡
‫好吗？
‫虽然我们是安全的, 但我们应该注意到, 我们在这里使用的是碰撞粒子,
‫这意味着我们应该在尝试使用它们之前, 检查一下碰撞粒子是否设置好了｡
‫否则, 我们可能会使用尚未设置的命中粒子变量, 因此不应使用空指针｡
‫所以我们要在这里放置一个if检查, 看看命中粒子是否有效, 如果有效,
‫那么就可以安全地在这里调用spawn发射器｡
‫好吧, 我会的
‫现在让我们继续进行编译｡
‫编译成功后, 我们将返回到编辑器, 这是BP projectile｡
‫我们已经设置了碰撞粒子, 所以在测试之前, 一定要设置好｡
‫否则, 我们什么也看不见｡
‫如果我们点击播放, 我们可以等待我们的go部件, 然后砰的一声, 看看｡
‫我们有一团团烟雾｡
‫我们有命中粒子正在繁殖｡
‫我会继续射击我们的敌人, 我们会看到他们得到刷新时, 我们打敌人以及｡
‫好极了｡
‫总而言之, 我们现在已经产生了一些碰撞粒子｡
‫当我们的炮弹击中世界上的某个东西时, 我们会发生爆炸｡
‫下一步就是在抛射体在空中飞行时留下一条烟迹｡
‫我们会在下一个视频中处理这个问题｡
‫我很快就会见到你的｡