欢迎光临散文网 会员登陆 & 注册

TomLooman_ActionRoguelike_第九章音频动画

2023-08-10 08:18 作者:别叫我小红  | 我要投稿

该专栏用于保存对TomLooman的ActionRoguelike项目的学习笔记,学习过程中的思考与记录不一定准确。


教程参考:https://github.com/tomlooman/ActionRoguelike

基于UE5.0的项目实现:https://github.com/CarolBaggins2023/TomLooman_ActionRoguelike_Tutorial

2023_08_05

音频动画:创建声音提示,动画蓝图和处理玩家死亡,三维用户界面

 

当角色生命值降到0时,我们希望能播放一个角色的死亡动画。

可以想到的是,这里的逻辑为,角色受击时,判断角色血量,如果血量小于等于0,播放动画。这和上面受击放光材料的逻辑是类似的,因此可以想到角色类中的属性组件成员变量也需要与角色类的一个成员函数绑定。

下面是委托与函数的绑定,以及函数的声明和实现。在函数的实现中,我们通过void APawn::DisableInput(class APlayerController* PlayerController)取消了玩家对角色的控制权,并将碰撞组件设置为无碰撞,避免尸体吞子弹的情况出现。

但是在C++中我们不方便控制动画,动画要用动画蓝图实现。要在蓝图中实现播放死亡动画,要先判断角色的血量是否小于等于零。我们可以选择在角色类中暴露一个函数,返回一个bool值,但是这样一方面无法复用,另一方面这个判断与属性组件类更为密切,所以我们选择在属性组件中暴露一个函数。因为要在蓝图中调用,所以这个函数要是BlueprintCallable的。

 

接着,我们修改角色的动画蓝图。通过双击角色Mesh组件的SkeletalMesh,可以进入一个资产界面,其中就包括动画蓝图。

在动画图(AnimGraph)中,通过BlendPosesbybool,我们可以实现类似if语句的效果,需要一个判断的表达式和两个Pose。

一个Pose是动画图自带的,根据角色朝向、速度等因素生成的动画,另一个Pose是我们导入的死亡动画,这里要关闭动画循环。

这里我们创建了一个变量IsAlive作为用于判断的表达式,那么此时的任务就变成了根据角色的血量属性给IsAlive赋值,这一步要在事件图(EventGraph)中完成。

我们在事件BlueprintUpdateAnimation的执行流中对IsAlive赋值,这里的逻辑类似于血条UI的逻辑,先获得玩家控制的Character,再在Character里找属性组件变量,再调用属性组件变量的bool函数,将返回值作为IsAlive的值。

 

 

我们想要在受到伤害时显示伤害的数值。由于是“显示”,所以跟我们的UI有关,因此我们通过创建Widget蓝图来实现这个功能。

蓝图如下,

这个UI只需要一个Text组件来显示伤害,AttachTo是我们创建的变量,用来表示受击物体。

这里有两个Event,主要的是EventTick。其中主要用到了PorjectWorldToScreen,其功能是将三维世界空间投影到二维平面,也就是将游戏空间中的某个位置投射到显示器的某个位置。GetViewportScale的作用是获取当前DPI的Scale并应用到窗口和Widget,避免出现由于DPI不同导致UI偏移的情况。

还有一个EventConstruct的功能是在UI显示一段时间后让UI在屏幕上消失,通过RemoveFromParent实现。

目前AttachTo还未被赋值,但是它是上面创建的Widget中的一个参数,所以我们可以在创建该Widget时对它进行赋值。

 

我们可以在子弹飞行和爆炸时加入一些声音效果。

创建一个声音的方法如下,

在内容浏览器中选中后,我们可以加入声音文件,

选择Looping可让声音循环

为了让声音显得真实,我们可以加入衰减(Attenuation),可以直接在细节面板设置,或者为了复用性,我们可以创建一个声音衰减实例,这里我们用的是实例中的默认值,

我们还可以选中两个声音文件,然后添加一个Random节点,使这两个声音随机播放,还可以加入随机调制器,进一步增加输出声音的随机性,


TomLooman_ActionRoguelike_第九章音频动画的评论 (共 条)

分享到微博请遵守国家法律