16_156~166Combat
156?Actor ComponentsActor組件
Creating Our Own Custom Components創(chuàng)建我們自己的自定義組件
創(chuàng)建自定義組件,可以專門包含一些功能,例如生命值,Gold,XP 等等
在UE中創(chuàng)建一個(gè)Actor Component的C++類

給這個(gè)類添加生命值屬性

然后我們給Enemy類添加這個(gè)組件


編譯之后就可以在UE中看到敵人有新添加的組件

157?Widget Components小工具組件
Creating a Health Bar for the Enemy為敵人創(chuàng)建一個(gè)健康條


創(chuàng)建一個(gè)UHealthBarComponent類,命名為HeathBarComponent //視頻里面這里錯(cuò)了,應(yīng)該是UHealthBarComponent 不是UWidgetComponent
然后先給Enemy類添加一個(gè)UHealthBarComponent組件,綁定在root根上(需要添加UMG模塊,添加頭文件)


//注:這里創(chuàng)建的也應(yīng)該是UHealthBarComponent類,而不是UWidgetComponent
編譯代碼之后,就可以在UE中看到Enemy多了一個(gè)組件,將之前新建的HealthBar UI添加至組件


158?User Widget Class用戶小工具類
C++ Class for our Health Bar Widget用于我們的健康欄小工具的C++類
創(chuàng)建一個(gè)UserWidget類,命名為HealthBar類

在HealthBar類中,新建UProgressBar對象,

編譯之后,回到UE中,打開WBP_HealthBar,我們需要修改父類

修改3 ,為創(chuàng)建的HealthBar
這里C++類的名字應(yīng)該與空間中原來默認(rèn)的名字相同
否則C++將無法控制到這個(gè)進(jìn)度條組件
159?Setting the health Percent設(shè)置健康百分比
Accessing the HealthBar UserWidget in C++在C++中訪問健康條的用戶小部件
在UHealthBarComponent中


在Enemy類中


編譯之后,回到UE中執(zhí)行,就可以看到在enemy類中,可以設(shè)置血條顯示

160?Damage傷害
UE中內(nèi)置了傷害方式


因?yàn)槭褂肨akeDamage需要使用actor和一個(gè)controller,所以我們需要在裝備武器的時(shí)候,將對應(yīng)的信息傳入Weapon類中
給Equip方法添加了兩個(gè)傳入?yún)?shù)

在方法中設(shè)置這兩個(gè)參數(shù)

然后在Character類中,EPressKey方法中,傳入

在UAttributeComponent類中,創(chuàng)建兩個(gè)方法,用于更新血條進(jìn)度 和 在受到傷害后更新血量


然后我們在武器命中方法中,使用UGameplayStatics::ApplyDamage()添加傷害

在Enemy中,使用TakeDamage,接受收到傷害的方法
編譯代碼
然后來到UE中,我們需要設(shè)置場景中Enemy的Health和MaxHealth

運(yùn)行游戲,攻擊敵人,可以看到血量減少
161?Custom Health Bars自定義健康條
Spicing up the HUD 為HUD增色
用自己的圖片替換掉系統(tǒng)默認(rèn)的進(jìn)度條樣式
162?Enemy Death Animations死亡動(dòng)畫
Animations for Enemy Death
從mixamo導(dǎo)入死亡動(dòng)畫,從blander轉(zhuǎn)換一下 使其有root根動(dòng)畫
將轉(zhuǎn)換好的動(dòng)畫導(dǎo)入U(xiǎn)E,并創(chuàng)建一個(gè)Paladin_Death的動(dòng)畫蒙太奇,將動(dòng)畫加入AM中
一定要記得在編輯器里,編輯好蒙太奇動(dòng)畫后,需要去點(diǎn)一下那個(gè)清除!

163?EnemyDeath敵人的死亡
Deading Some Fools欺騙一些愚蠢的人
在Enemy中,新建蒙太奇變量,新建一個(gè)方法處理角色死亡

在UAttributeComponent中,添加一個(gè)方法判斷角色生命值是否大于0

實(shí)現(xiàn)Die方法

然后在GetHit_Implementation方法中,將之前判斷角色受擊動(dòng)畫用if包含起來,先判斷角色是否死亡
如果沒有則處理受擊事件(播放受擊動(dòng)畫,扣除血量),否則處理死亡事件(播放死亡動(dòng)畫,處理Enemy的Actor消失)

164?Death Poses死亡姿勢
Making the Enemy Stay Down!讓敵人躺在地
將之前準(zhǔn)備的死亡動(dòng)畫,最后一幀提取為新的動(dòng)畫

準(zhǔn)備好之后,來到ABP_Paladin的動(dòng)畫藍(lán)圖


我們可以在動(dòng)畫藍(lán)圖事件中這么操作,讓動(dòng)畫每一幀都去設(shè)置DeatPose的值,但是這樣效率很低

所以我們刪掉這些
我們創(chuàng)建一個(gè)Blueprint Thread safe Update Animation


獲取對象變量信息


將Deathpose提升為變量


進(jìn)入規(guī)則界面


設(shè)置Death里面的動(dòng)畫 使用Blend pose 加上 EDeathPose的枚舉名稱


前面的事件圖表也是必要的

165?Polishing Enemy Death完善敵人的死亡
Finishing Touches on Enemy Death敵人之死的收尾工作
1 去掉Enemy的膠囊體碰撞
在Die方法中添加
2 在擊中敵人后才顯示血條,死亡后不顯示
首先設(shè)置默認(rèn)不顯示血條

然后再GetHit方法中,設(shè)置true
死亡后把血條設(shè)置false
敵人死亡后,關(guān)閉SkeletaMesh的碰撞,避免死亡后尸體還是會(huì)被武器打中,繼續(xù)播放死亡動(dòng)畫

3 設(shè)置敵人在一段時(shí)間沒有被攻擊后,血條隱藏
他的思路是,聲明一個(gè)AActor變量,如果被攻擊,則將攻擊對象(玩家)復(fù)制給這個(gè)Actor
然后不停檢測敵人與Actor的距離,如果超過XXX則隱藏血條