斯坦福UE4C++課程P50-P54敲定AI,擴展框架
首先給ProjectileBase添加音頻組件,一定記得設(shè)置Attachment,因為音頻組件繼承自場景組件(組件繼承自Actor組件(藍圖中在左側(cè)欄下面)和Scene組件(藍圖中在左側(cè)欄上面)),而場景組件包含位置屬性,不設(shè)置Attachment就會在原點播放。而繼承自Actor組件的,比如Attribute組件,就沒有位置屬性,也不需要位置屬性,僅僅是Actor的'register'。并且場景組件繼承自Actor組件。
下面我們給AI角色類添加一些功能(死亡時停止行為樹、ragdoll效果、自動銷毀)。
ragdoll碰撞profile文件如下:

現(xiàn)在AI死亡'Ragdoll'效果(播放死亡動畫時,開啟骨骼的模擬物理效果(重力、骨骼相互作用)):

另外,為了讓AI子彈傷害和角色不同,我們從魔法球藍圖創(chuàng)建子藍圖類MagicProjectileBP_AI,到行為樹的RangeAttack任務(wù)里選擇該子藍圖類,傷害改成5,而角色用的魔法球藍圖類傷害改成30。
打開AI用的網(wǎng)格體,點擊右上角Physics:

可以看到所有骨骼,有的用的box碰撞,有的用的膠囊體碰撞。骨骼之間會有約束,點擊模擬,可以看出這種約束。
另外,C++項目生成時,會自動給我們添加默認的GameMode類:

如果不想用這個,直接刪掉,重新構(gòu)建項目即可。

下面我們給AI提供更多的感覺,比如添加受到傷害時的反應(yīng)
在AICharacterC++類的OnHealthChanged函數(shù)中,形參的Instigator我們之前一直傳入的nullptr(Attribute組件類Broadcast傳入的nullptr),我們給之前的功能都添加該參數(shù)(魔法球類、生命藥水類)。
現(xiàn)在AI在受到傷害/看到玩家時,就會設(shè)置TargetActor為玩家。
SAICharacter.h
SAICharacter.cpp

下面我們學(xué)習(xí)使用靜態(tài)函數(shù)。
打開UGameplayStatics庫,發(fā)現(xiàn)繼承自UBlueprintFunctionLibrary(和藍圖沒多大關(guān)系,只是一個函數(shù)庫)。其中的函數(shù)都用UFUNCTION()暴露在藍圖中,且都用static聲明,所以UGameplayStatics類不會有實例對象,意義不大,純粹是為了別人用其中的函數(shù)。
為了寫像這樣的靜態(tài)函數(shù)庫,我們可以用C++(新建繼承自UGameplayStatics的類),也可以用藍圖(創(chuàng)建Blueprint Function Library),這兩者純粹是編程方式的區(qū)別。
下面我們在屬性組件中添加靜態(tài)函數(shù)。
因為之前我們要用屬性組件中的東西需要:
這是冗長的一段代碼,我們在屬性組件中寫一個靜態(tài)函數(shù),讓其他類獲取到Actor的屬性組件更加簡便。
在屬性組件.h文件public下添加
.cpp文件實現(xiàn):
現(xiàn)在只需要用
就可以獲取該Actor的屬性組件(沒有屬性組件就返回nullptr)
下面寫第二個靜態(tài)函數(shù),獲取到Actor是否活著的信息。
.h中添加(meta修飾符可以讓該函數(shù)在藍圖中的名字展示為"IsAlive",讓API更加直觀)
.cpp中添加

這一P我們給AI的在RangedAttack任務(wù)中,設(shè)置
讓AI發(fā)射的魔法球ignoreAI自身,即便魔法球半徑再大也不會攻擊到自身。
然后添加
讓AI每次發(fā)射魔法球都有一定的偏差。
最后添加
讓AI在玩家死亡時不再攻擊角色。(查看行為樹,該task返回Failed,其所在sequence就停止執(zhí)行task右側(cè)的節(jié)點)
看下整個RangedAttack類:
SBTTask_RangedAttack.h
SBTTask_RangedAttack.cpp

最后我們通過HitFlash效果進行傷害反饋。
在SAICharacter類OnHealthChanged函數(shù)受到傷害時,添加
.h中對TimeToHitParamName聲明
在構(gòu)造函數(shù)中為TimeToHitParamName賦值為閃光材質(zhì)的TimeToHit參數(shù)名字
于是在藍圖中可以看到TimeToHitParamName的值為TimeToHit,便于美術(shù)人員工作。
我們給原有AI材質(zhì)自發(fā)光顏色Add上閃光材質(zhì)函數(shù)的輸出值即可。(之前作業(yè)我們是直接給AI用的閃光材質(zhì),和這里實現(xiàn)有所不同)