TomLooman_ActionRoguelike_第九章音頻動畫
該專欄用于保存對TomLooman的ActionRoguelike項目的學(xué)習(xí)筆記,學(xué)習(xí)過程中的思考與記錄不一定準(zhǔn)確。
教程參考:https://github.com/tomlooman/ActionRoguelike
基于UE5.0的項目實現(xiàn):https://github.com/CarolBaggins2023/TomLooman_ActionRoguelike_Tutorial

2023_08_05
音頻動畫:創(chuàng)建聲音提示,動畫藍(lán)圖和處理玩家死亡,三維用戶界面
?
當(dāng)角色生命值降到0時,我們希望能播放一個角色的死亡動畫。
可以想到的是,這里的邏輯為,角色受擊時,判斷角色血量,如果血量小于等于0,播放動畫。這和上面受擊放光材料的邏輯是類似的,因此可以想到角色類中的屬性組件成員變量也需要與角色類的一個成員函數(shù)綁定。
下面是委托與函數(shù)的綁定,以及函數(shù)的聲明和實現(xiàn)。在函數(shù)的實現(xiàn)中,我們通過void APawn::DisableInput(class APlayerController* PlayerController)取消了玩家對角色的控制權(quán),并將碰撞組件設(shè)置為無碰撞,避免尸體吞子彈的情況出現(xiàn)。



但是在C++中我們不方便控制動畫,動畫要用動畫藍(lán)圖實現(xiàn)。要在藍(lán)圖中實現(xiàn)播放死亡動畫,要先判斷角色的血量是否小于等于零。我們可以選擇在角色類中暴露一個函數(shù),返回一個bool值,但是這樣一方面無法復(fù)用,另一方面這個判斷與屬性組件類更為密切,所以我們選擇在屬性組件中暴露一個函數(shù)。因為要在藍(lán)圖中調(diào)用,所以這個函數(shù)要是BlueprintCallable的。

?
接著,我們修改角色的動畫藍(lán)圖。通過雙擊角色Mesh組件的SkeletalMesh,可以進(jìn)入一個資產(chǎn)界面,其中就包括動畫藍(lán)圖。


在動畫圖(AnimGraph)中,通過BlendPosesbybool,我們可以實現(xiàn)類似if語句的效果,需要一個判斷的表達(dá)式和兩個Pose。
一個Pose是動畫圖自帶的,根據(jù)角色朝向、速度等因素生成的動畫,另一個Pose是我們導(dǎo)入的死亡動畫,這里要關(guān)閉動畫循環(huán)。
這里我們創(chuàng)建了一個變量IsAlive作為用于判斷的表達(dá)式,那么此時的任務(wù)就變成了根據(jù)角色的血量屬性給IsAlive賦值,這一步要在事件圖(EventGraph)中完成。

我們在事件BlueprintUpdateAnimation的執(zhí)行流中對IsAlive賦值,這里的邏輯類似于血條UI的邏輯,先獲得玩家控制的Character,再在Character里找屬性組件變量,再調(diào)用屬性組件變量的bool函數(shù),將返回值作為IsAlive的值。


?
?
我們想要在受到傷害時顯示傷害的數(shù)值。由于是“顯示”,所以跟我們的UI有關(guān),因此我們通過創(chuàng)建Widget藍(lán)圖來實現(xiàn)這個功能。
藍(lán)圖如下,

這個UI只需要一個Text組件來顯示傷害,AttachTo是我們創(chuàng)建的變量,用來表示受擊物體。
這里有兩個Event,主要的是EventTick。其中主要用到了PorjectWorldToScreen,其功能是將三維世界空間投影到二維平面,也就是將游戲空間中的某個位置投射到顯示器的某個位置。GetViewportScale的作用是獲取當(dāng)前DPI的Scale并應(yīng)用到窗口和Widget,避免出現(xiàn)由于DPI不同導(dǎo)致UI偏移的情況。
還有一個EventConstruct的功能是在UI顯示一段時間后讓UI在屏幕上消失,通過RemoveFromParent實現(xiàn)。
目前AttachTo還未被賦值,但是它是上面創(chuàng)建的Widget中的一個參數(shù),所以我們可以在創(chuàng)建該Widget時對它進(jìn)行賦值。

?
我們可以在子彈飛行和爆炸時加入一些聲音效果。
創(chuàng)建一個聲音的方法如下,

在內(nèi)容瀏覽器中選中后,我們可以加入聲音文件,


選擇Looping可讓聲音循環(huán)

為了讓聲音顯得真實,我們可以加入衰減(Attenuation),可以直接在細(xì)節(jié)面板設(shè)置,或者為了復(fù)用性,我們可以創(chuàng)建一個聲音衰減實例,這里我們用的是實例中的默認(rèn)值,


我們還可以選中兩個聲音文件,然后添加一個Random節(jié)點,使這兩個聲音隨機(jī)播放,還可以加入隨機(jī)調(diào)制器,進(jìn)一步增加輸出聲音的隨機(jī)性,
