UE學(xué)習(xí)記錄:AI添加攻擊
缺少未解決的外部符號(hào),在build文件里添加模塊GameplayTasks
今天給AI的行為樹(shù)添加一些邏輯,目前只有移動(dòng)和等待,我們將給他添加一個(gè)攻擊范圍的檢測(cè):如果在攻擊范圍內(nèi)就立即停止移動(dòng),如果不在就開(kāi)始追蹤,我們可以給行為樹(shù)里的MoveToPlayer添加一個(gè)自己寫(xiě)的Service。首先新建一個(gè)C++類,繼承BTService類,命名為RgBTService_CheckAttackRange,對(duì)TickNode進(jìn)行重寫(xiě):
行為樹(shù)在游戲開(kāi)始后會(huì)重復(fù)循環(huán)運(yùn)行,我們到黑板里創(chuàng)建一個(gè)bool新鍵命名為WithinAttackRange,我們沒(méi)有對(duì)它進(jìn)行硬編碼,否則它必須與C++中的名字相匹配。打開(kāi)行為樹(shù)

右鍵添加Selector,添加服務(wù)CheckAttackRange。然后將暴露在藍(lán)圖中的AttackRangeKey設(shè)置為WithinAttackRange,這時(shí),我們需要給MoveToPlayer添加一個(gè)裝飾器Blackboard,命名為Outside attack range?。在它的流控制選項(xiàng)中,觀察者中止選擇self,這樣條件不滿足的時(shí)候就會(huì)終止行為樹(shù),然后重新執(zhí)行。

我們今天在行為樹(shù)中給AI添加攻擊行為。
新建一個(gè)TaskNode類命名為RgBTTask_RangedAttack,對(duì)ExecuteTask進(jìn)行重寫(xiě),我們要做的就是像寫(xiě)Service類那樣,用行為樹(shù)組件OwnerComp可以得到AI擁有者
Character類有一個(gè)可供我們使用的獲取網(wǎng)格類,我們想獲得槍口的位置,就得把MyController,Cast成一個(gè)ACharacter,然后就可以用一個(gè)FVector接受槍口的位置
然后我們需要拿到TargetActor,像之前在Service里做過(guò)的那樣,通過(guò)黑板組件得到對(duì)象的值,我們可以將任何目標(biāo)作為關(guān)鍵名稱,獲取該數(shù)據(jù)。我們要確保TargetActor不是空指針,這很有可能發(fā)生,因?yàn)槲覀冊(cè)赗gAIController中對(duì)其進(jìn)行過(guò)設(shè)置。
這樣我們有了AI和TargetActor(玩家),拿到他們得位置相減,就能得到槍口指向玩家的方向,這個(gè)方向矢量可以變成Rotation以便往特定的Rotation發(fā)射攻擊,
最后還需要添加一個(gè)碰撞處理方法的參數(shù),就可以產(chǎn)生攻擊NewProj,ProjectileClass可以暴露在藍(lán)圖里以便更改攻擊樣式。
轉(zhuǎn)到行為樹(shù)進(jìn)行如下操作

這里對(duì)行為樹(shù)目前用到的知識(shí)做簡(jiǎn)單的總結(jié):
Composite組合節(jié)點(diǎn)包括Selector,Sequence,Simple Parallel
Selector只要有一個(gè)子節(jié)點(diǎn)成功,則停止執(zhí)行其它子節(jié)點(diǎn)并返回true。如果所有子節(jié)點(diǎn)都失敗,則返回false。
Sequence只要有一個(gè)子項(xiàng)失敗,則停止執(zhí)行其它子節(jié)點(diǎn)并返回false。如果所有子節(jié)點(diǎn)都成功,則返回true。
Task 節(jié)點(diǎn)執(zhí)行實(shí)際操作,不含輸出連接
Decorator裝飾節(jié)點(diǎn)附著于其他節(jié)點(diǎn),用作其他節(jié)點(diǎn)是否可以執(zhí)行的條件
Services節(jié)點(diǎn)只能附著在Composite組合節(jié)點(diǎn)上,只要其附著的節(jié)點(diǎn)執(zhí)行,Services節(jié)點(diǎn)就會(huì)被執(zhí)行,通常用來(lái)檢查和更新黑板。
關(guān)于流控制中的觀察者中止:
NONE,不終止執(zhí)行
Self,中止自己和該節(jié)點(diǎn)下的所有子節(jié)點(diǎn)
Lower Priority,中止該節(jié)點(diǎn)右方的所有節(jié)點(diǎn)
Both,終止自己、該節(jié)點(diǎn)下的所有子節(jié)點(diǎn)、以及該節(jié)點(diǎn)右方的所有節(jié)點(diǎn)