斯坦福UE4 + C++课程学习记录 23:伤害数值

目录

1. 创建UI

2. 调用UI


1. 创建UI

        要显示数字,需要利用UMG来实现。创建UI的部分十分简单,在Ui文件夹下创建一个新的DamagePopup_Widget控件蓝图,只添加一个文本框即可。设置文本框的位置和默认值如下,需要注意设置文本框“Is Variable”便于后续访问。

图23-1 文本框设置

        伤害数值会显示在魔法粒子Overlap且有血量(即有AttributeComp)的对象上,因此我们需要一个变量来记录这个对象。在“图表”中创建一个变量AttachTo,变量类型设置为Actor,然后勾选其“可编辑实例”和“生成时公开”,从而暴露该变量方便我们在其他蓝图传递这个变量的值。随后创建如下蓝图:

图23-2 显示设置

        图23-2实现了数字UI的显示,其中的关键点在于利用“将场景投射到屏幕(Project World To Screen)”节点实现3维的游戏内世界坐标对应2维屏幕坐标的转换,并通过“获取视口缩放”来得到屏幕的缩放比例,从而矫正UI显示的位置。

        同时,我们希望数值UI在显示一定时间后自动消失:

图23-3 自动消失

2. 调用UI

        课程中以之前实现的蓝图类TargetDummyBP为例子(在SurTargetDummy.h已经声明了AttributeComp)。回顾之前的内容,在SurAttributeComponent类中声明了OnHealthChanged事件,即所有带有血量属性的对象都可以触发这个事件,而这些带有血量的对象刚好需要显示伤害数值。因此,我们可以利用这个事件来创建显示UI。

        打开TargetDummyBP蓝图,进行控件的创建。相关方法已在UMG提过,故不再赘述。唯一需要注意到,之前将AttachTo暴露后,可以在此处传入Attach的对象。

图23-4 创建UI

        此时,按照课程中的进度应该已经实现了显示数字的效果,但我在运行时却没有反应。由于OnHealthChanged事件和血量有关,于是很自然的,我在TargetDummyBP中添加如下节点显示血量来进行Debug:

图23-5 打印血量

        结果不出所料,虽然显示了粒子爆炸的特效,但TargetDummy的血量一直是100。再次经过一系列代码检查,我发现之前跟着课程实现的逻辑十分混乱:魔法粒子造成伤害在代码中实现,使用Overlap事件,且包含了Destroy语句;魔法粒子爆炸效果在蓝图中实现,使用了OnActorHit事件。这将导致魔法粒子在碰撞到Gideon角色后只扣血,而不能播放爆炸效果。因此我在MagicProjectile中添加(不是替换)了Overlap事件来触发,解决了一个历史遗留bug。

        此外,使用Overlap事件的话应该关闭“模拟物理”。我再次观看课程视频的时候,发现受击的方块确实悬浮在空中,应该是关闭了模拟物理选项。

        最后的效果如下图所示:

图23-6 粒子爆照效果
图23-7 显示数值

         最后,课程提到将在后续添加伤害数值大小的控制。

猜你喜欢

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