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

一、销毁粒子

  1. MagicProjectile的蓝图选择SphereComp,在细节面板中的“事件”中添加“组件命中时”事件,这个事件会在角色G发出的魔法粒子命中Hit)物体时触发。为了更加方便的调试,在其后添加“绘制调试球体Draw Debug Sphere”,其Center传入“获取Actor位置Get Actor Location”,即发生重叠事件时粒子所在的位置。同时,将Radius设置为10,Duration设置为1,Color换成任意明显的颜色。这样,在世界中发射粒子时就可以看见事件触发的位置。
  2. UE调制形状的绘制:
    (1)调试
  • 参数Uworld对象,点的位置,点的大小,点的颜色,是否持久,消失时间(对应前一项false
    注意: 若持续时间设置为-1,则表示绘制后下一帧就会消失,以下同理
DrawDebugPoint(GetWorld(), GetActorLocation() , 5.f, FColor::Red, false, 3.f);

(2)调试线

  • 参数Uworld对象,线的起始的位置,线的终止位置,线的颜色,是否持久,持续时间(对应前一项false
DrawDebugLine(GetWorld(), FVector(0.f, 0.f, 0.f), GetActorLocation(), FColor::Blue, false, 1.f);

(3)调试

  • 参数Uworld对象,圆心位置,圆的半径,圆的分段数(数字越小,圆的锯齿越多),圆的颜色,是否持久,持续时间(对应前一项false),深度优先级编号

深度优先级编号

  • 可以将渲染调试置于不同的渲染优先级。
  • 例如,在2中放置一个调试形状,在3中放置另一个调试形状,将导致3中的形状显示在2中的形状前面。
  • 如果不关心一个形状优先于其他形状呈现,则可以使用0
DrawDebugLine(GetWorld(),  GetActorLocation(), 20,50,FColor::Blue, false, 3.f,0);

(4)调试

  • 参数Uworld对象,球心的位置,球的半径,分段数量,球的颜色,是否持久,消失时间(对应前一项false,深度优先级,线的粗度)
DrawDebugPoint(GetWorld(), GetActorLocation() , 25.f, 10,FColor::Red, false,3.f,0,3.f);
  1. 在第5节的内容中,已经设置了SphereComp的“碰撞预设”为自定义的Projectile,在其中设置了对WorldStaticPhysicsBody为阻挡。现在,为了对所有物体都可以正确进行碰撞,我们将Projectile中除了VisibilityCamera的选项全置为阻挡。同时,我们也需要设置墙面WorldStatic为阻挡(或者直接设置碰撞预设为PhysicsActor)。运行关卡,可以发现在墙面阻挡魔法粒子的同时绘制了Debug球体。
  2. 为了实现魔法粒子击中物体后的销毁,在“绘制Debug球体”的后面添加“在位置处生成发射器Spawn Emitter at Location”节点,在其Emitter Template引脚中选择P_Gideon_Primary_HitWorld,并把Actor对应的值赋给Location与Rotation引脚。最后调用“销毁Actor(Destroy Actor)”节点,如图11-3所示。编译保存后运行测试结果。

二、使用Instigator

课程至此,出现了发射的魔法粒子直接在角色手中爆炸的情况,原因可能是魔法粒子一创建就HIt到了自身,从而触发后续的事件。

  1. 在UE中实现伤害判定时通常会引入Instigator,即发起者。一种使用Instigator的常见场景是射击游戏,在玩家发射子弹击杀了某个角色后,需要更新玩家的奖励数据统计时,就可以通过这个Instigator快速找到发射子弹的玩家对象。
  2. 回到SCharacter.cppPrimaryAttack_TimeElapsed函数中,在SpawnParams中直接添加Instigator
SpawnParams.Instigator = this;
  1. 回到UE,在蓝图中添加在进入Hit事件前判断是不是自己的逻辑。在创建“获取InstigatorGet Instigator”节点,并与Other Actor进行比较(命中对象是不是自己),在结果为True使用Branch分支执行后续的节点。
  2. 组件命中事件组件重叠事件是分开的两个事件,炸弹会在手里爆炸是因为ProjectilePawnBlock,同时PawnProjectile 也是Block的,因此炸弹在碰到pawn`的时候会互相阻挡,并触发命中事件
  • 相反的,如果两个对象只要有一方对另一方是允许重叠的,表现上物体会互相穿过,在事件触发上会触发overlap事件,不会触发命中事件。
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值