斯坦福UE4 + C++课程学习记录 11:蓝图-优化攻击

目录

1. 销毁粒子

2. 使用Instigator


        这节内容将会在之前实现的PrimaryAttack基础上,优化示例的攻击效果。

1. 销毁粒子

        在MagicProjectile的蓝图选择SphereComp,在细节面板中的“事件”中添加“组件命中时”事件,这个事件会在角色Gideon发出的魔法粒子命中(Hit)物体时触发。为了更加方便的调试,我们在其后添加“绘制调试球体(Draw Debug Sphere)”,其Center传入“获取Actor位置(Get Actor Location)”,即发生重叠事件时粒子所在的位置。同时,将Radius设置为10,Duration设置为1,Color换成任意明显的颜色。这样,在世界中发射粒子时就可以看见事件触发的位置。

图11-1 蓝图设置

        这里需要注意的是,在第5节的内容中,我们设置了SphereComp的“碰撞预设”为自定义的Projectile,在其中设置了对WorldStatic和PhysicsBody为阻挡。现在,为了对所有物体都可以正确进行碰撞,我们将Projectile中除了Visibility和Camera的选项全置为阻挡。同时,我们也需要设置墙面对WorldStatic为阻挡(或者直接设置碰撞预设为PhysicsActor)。运行关卡,可以发现在墙面阻挡魔法粒子的同时绘制了Debug球体。

图11-2 运行测试

        接下来,需要实现魔法粒子击中物体后的销毁。在“绘制Debug球体”的后面添加“在位置处生成发射器(Spawn Emitter at Location)”节点,如果在搜索时对节点的中文名称存疑的话,可以按住Alt键鼠标悬停以查看其英文全名。在其Emitter Template引脚中选择P_Gideon_Primary_HitWorld,并把Actor对应的值赋给Location与Rotation引脚。最后调用“销毁Actor(Destroy Actor)”节点,如图11-3所示。编译保存后运行测试结果,发现粒子会在触发特效的同时销毁:

图11-3 蓝图设置
图11-4 运行测试

2. 使用Instigator

        课程中进行到这一步时,出现了发射的魔法粒子直接在Gideon手中爆炸的情况,原因可能是魔法粒子一创建就HIt到了自身角色,从而触发后续的事件。虽然我自己复现时没有出现这个情况,但出于学习的目的,本示例也会同课程内容一样使用Instigator。        

        根据课程中的讲述,在UE中实现伤害判定时通常会引入Instigator,即发起者,在本节中就是角色Gideon(其实在第9节内容中,我们已经使用过Instigaor Pawn这个变量,只是没有赋予它实际的意义)。一种使用Instigator的常见场景是射击游戏,在玩家发射子弹击杀了某个角色后,需要更新玩家的奖励和数据统计时,就可以通过这个Instigator快速找到发射子弹的玩家对象。因此,在这个示例中我们也尝试使用Instigator。

        回到SurCharacter.cpp的PrimaryAttack_TimeElapsed函数中,在SpawnParams中直接添加Instigator:SpawnParams.Instigator = this;

        保存编译后回到UE,在蓝图中添加在进入Hit事件前判断是不是自己的逻辑。在,创建“获取Instigator(Get Instigator)”节点,并与Other Actor(命中对象)进行比较,在结果为True使用Branch分支执行后续的节点,如图11-5所示。修改完毕后运行测试依旧正常。

扫描二维码关注公众号,回复: 15193469 查看本文章
图11-5 蓝图设置

        在课程内容中作者还使用了其他方式来解决上述问题,同时口述了一些蓝图系统中事件和函数的特点。最后使用了一个例子说明即使项目以C++为主,蓝图系统仍然能在诸如测试方面提升我们的开发速度,感兴趣的朋友可以直接观看课程第五章最后一部分的内容。

猜你喜欢

转载自blog.csdn.net/surkea/article/details/127176918