一、销毁粒子
- 在
MagicProjectile
的蓝图选择SphereComp
,在细节面板中的“事件”中添加“组件命中时”事件,这个事件会在角色G发出的魔法粒子命中(Hit
)物体时触发。为了更加方便的调试,在其后添加“绘制调试球体Draw Debug Sphere
”,其Center
传入“获取Actor位置Get Actor Location
”,即发生重叠事件时粒子所在的位置。同时,将Radius
设置为10,Duration
设置为1,Color
换成任意明显的颜色。这样,在世界中发射粒子时就可以看见事件触发的位置。 - 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);
- 在第5节的内容中,已经设置了
SphereComp
的“碰撞预设”为自定义的Projectile
,在其中设置了对WorldStatic
和PhysicsBody
为阻挡。现在,为了对所有物体都可以正确进行碰撞,我们将Projectile
中除了Visibility
和Camera
的选项全置为阻挡。同时,我们也需要设置墙面对WorldStatic
为阻挡(或者直接设置碰撞预设为PhysicsActor
)。运行关卡,可以发现在墙面阻挡魔法粒子的同时绘制了Debug
球体。 - 为了实现魔法粒子击中物体后的销毁,在“绘制Debug球体”的后面添加“在位置处生成发射器
Spawn Emitter at Location
”节点,在其Emitter Template
引脚中选择P_Gideon_Primary_HitWorld
,并把Actor对应的值赋给Location与Rotation引脚。最后调用“销毁Actor(Destroy Actor)”节点,如图11-3所示。编译保存后运行测试结果。
二、使用Instigator
课程至此,出现了发射的魔法粒子直接在角色手中爆炸的情况,原因可能是魔法粒子一创建就
HIt
到了自身,从而触发后续的事件。
- 在UE中实现伤害判定时通常会引入
Instigator
,即发起者。一种使用Instigator
的常见场景是射击游戏,在玩家发射子弹击杀了某个角色后,需要更新玩家的奖励和数据统计时,就可以通过这个Instigator快速找到发射子弹的玩家对象。 - 回到
SCharacter.cpp
的PrimaryAttack_TimeElapsed
函数中,在SpawnParams
中直接添加Instigator
:
SpawnParams.Instigator = this;
- 回到UE,在蓝图中添加在进入
Hit
事件前判断是不是自己的逻辑。在创建“获取InstigatorGet Instigator
”节点,并与Other Actor
进行比较(命中对象是不是自己),在结果为True
使用Branch
分支执行后续的节点。 - 组件命中事件和组件重叠事件是分开的两个事件,炸弹会在手里爆炸是因为
Projectile
对Pawn
是Block
,同时Pawn
对Projectile
也是Block的,因此炸弹在碰到
pawn`的时候会互相阻挡,并触发命中事件。
- 相反的,如果两个对象只要有一方对另一方是允许重叠的,表现上物体会互相穿过,在事件触发上会触发
overlap
事件,不会触发命中事件。