UE4藍圖AI角色制作(八)之測試行為樹、EQS查詢、飢餓策略


16、測試行為樹

在播放游戲前,重新調整玩家的位置讓它不會立刻被AI發現。開始游戲后,在內容瀏覽器中打開行為樹,找到工作欄中的下拉菜單,它當前顯示“沒有選中調試對象“,點擊它並選中”AIC Third PersonCharacter“,現在我們可以看到行為樹的執行流程。

 

選中隨即漫游事件的等待節點,然后按下F9設置斷點,注意下次這個節點執行時行為樹會暫停,現在我們可以i通過右下角的黑板框查看“TargetLocation“的數值,它會停止更新。我們還可以點擊工具欄中的”返回:進入“按鈕,返回行為樹中的上一個執行節點。

17、創建第一個EQS查詢

我們的AI現在可以使用感知系統找到玩家並向他們靠近。下一步我們需要讓AI將多種環境因素考慮在內。對於這種復雜情況,我們需要用到環境查詢系統。我們先從創建一個AI感興趣的對象——一個食物來源Actor,把它布置在關卡,然后我們會啟用EQS系統並創建一個EQS查詢來幫助AI定位關卡內的食物來源。我們從新建食物來源開始。在藍圖目錄中新建一個目錄,將它命名為”EQS”,打開目錄,右鍵點擊內容瀏覽器,選擇“藍圖類“,然后選擇”Actor“,命名為”foodsource“。雙擊食物來源,打開藍圖編輯器,找到左邊的組件面板,點擊”添加組件“按鈕,選擇立方體,為藍圖添加立方體組件。在組件面板中選中立方體組件,找到細節面板中的”碰撞“分段,其中”碰撞預設“下拉菜單將它從默認設置改為”無碰撞“,這么做是為了避免這個對象的碰撞對導航網格體產生干擾進而影響AI的運動。接着把立方體相對於根節點的Z坐標設置成正70,這將有助於我們把它直接放到關卡地面上,修改完成后,我們編譯並保存藍圖。

現在我們要在關卡內放置多個食物。為此我們可以直接將Actor從內容瀏覽器中拖動到視口中。接下來,按下P鍵顯示導航網格體調試器,確認導航網格體沒有因此被破壞。

 

在創建第一個EQS查詢之前我們要啟用EQS系統,其仍處於試驗階段。為了使用它,在編輯器偏好設置中找到通用,實驗性功能,在右側找到“AI“分段,啟用”環境查詢系統“,然后關閉”編輯器偏好設置“窗口。打開”EQS”,右鍵選擇”人工智能“>”環境查詢“,將新資源命名為”EQS find CloseFoodSource“,雙擊打開查詢編輯器。拖動根節點,在生成器分段中,選擇”Actorsofclass“,在細節面板中找到”生成器“分段。首先,我們要指定這個查詢要查找哪個Actor,在”搜索的Actor類“中,點擊下拉菜單,找到我們的食物來源Actor,取消勾選”僅在半徑內生成Actor“,這樣做是因為沒有必要將搜索結果限定在一個特定半徑內。右鍵點擊生成器,點擊”添加測試“,然后選擇”距離“。點擊左鍵選擇距離修改器,找到細節面板查看第一個分段,查看”測試目的“,我們要把測試目的設置為”僅計分“,把積分因子設為”-1“,現在我們保存並退出。

是時候在行為樹上使用我們的新功能了。首先要創建一個黑板鍵,保存最近的食物來源,稍后我們將使用這個鍵來控制裝飾器以便於區分看到玩家、追逐玩家和搜尋食物。首先在內容瀏覽器中打開行為樹,點擊黑板鍵。新建“object“,命名為”targetfoodsource“,在右側找到”鍵類型“將基類從”obiect“改為”foodsource“actor。現在回到行為樹界面,我們要新建一個序列,將它放置於”追逐玩家“和”隨機漫游“之間,並命名為”Find Food“序列。拖動”Find Food“序列,選擇”Run Query“,在右側細節面板中的”EQS“分段,展開”EQS任務“分段,選擇剛才創建的查詢作為查詢面板,在下拉菜單中選中它,確保”運行模式“是”單個最佳項“。

 

注意,我們之前把查詢設置成對項目僅進行計分,這意味着它當前會返回多個項目,將“運行模式“設置為”單個最佳項“,會返回得分量高的項目,也就是距離最近的對象。最后將黑板鍵設置為我們新建的”targetfoodsource“。

現在EQS就完成了。他會運行“EQS find CloseFoodSource“,並將結果保存在”targetfoodsource“黑板鍵。

接下里讓AI去做的就是移向目標食物來源Actor,我們可以使用“Move to task“,拖動”Find Food“序列,選擇“Move to task“,在細節面板中找到”黑板“分段,將黑板鍵改為”TargetFoodSource“,最后我們要在序列末尾添加一個簡短的等待任務。最后回顧一下”Find Food“序列,首先是EQS查詢,它會運行我們的查找最近食物來源查詢,這個查詢隨后會返回最近的食物來源,並將結果保存在”TargetFoodSource“黑板框中,假設它成功了,AI然后會移向目標食物來源。

 

18、根據飢餓程度制定策略

在這節我們會賦予AI尋找食物的理由並避免它一直尋找食物。

我們要在行為樹中創建一個服務,用它修改表示飢餓的黑板鍵,然后我們會通過這個服務讓飢餓水平逐步上升,最后我們會新建一個裝飾器讓它根據飢餓程度來控制當前執行哪個程序。我們將學習如何編寫這類邏輯。通過重新排列當前行為樹中的節點來快速重建復雜行為。

為此,我們首先會新建一個黑板鍵,用來保存飢餓值,然后通過服務對其進行操作,首先打開當前的行為樹,在右側打開黑板,在黑板中添加一個浮點類型的黑板鍵,並命名為“hungerKey“。添加新鍵后,在右上角選擇”行為樹“,現在我們添加一個服務,點擊工具欄中的”服務“按鈕,這樣會自動新建服務並打開編輯器,回到內容瀏覽器將之命名為”BTS_Hunger“,在我的藍圖面板新建一個變量,將它命名為”HungerKey”,把變量類型設置為”key“,確保它是公共變量所以其他行為書中可修改它。現在在事件圖表中添加一個”tick”事件,每當行為樹中的服務更新時,這個事件都會觸發,右鍵點擊事件表,選擇”Event Recevie Tick AI“,現在我們需要從創建的”HungerKey“中獲取一些信息。按住Ctrl鍵和左鍵,將”變量“分段中的“hungerKey“拖動到事件圖表,拖動”HungerKey“然后輸入”get Blackboard value as float“。現在我們要做的是讓飢餓值與浮點數相加用於表示在這一幀中飢餓發生了變化,拖動”get Blackboard value as float“的返回值搜索”float+float“的第二個輸入,將它提升至變量,把這個變量命名為”Hunger increase Rate“,確保它也是公共變量。這樣每當服務更新時,”Hunger Increase Rate“都會與當前的飢餓值相加。我們要讓飢餓值介於0和1的范圍之間,我們可以通過限制函數來實現這點,拖動”float+float“節點,然后輸入”clamp float“,限制函數會獲取輸入值,然后根據函數定義中的最小值和最大值返回結果。現在要將新的飢餓值保存到黑板中,在事件圖表中選中”Hunger Key“,復制后拖動並選擇”set blackboardvalueasfloat“。現在拖動限制函數的返回值連上”set Blackboard value as float“的輸入值。最后要做的是將”Tick AI“事件的執行引腳連到”set Blackboard value as float“,編譯並關閉。

 

現在我們將新增加的行為添加到行為樹上了,打開行為樹。我們希望服務一直運行,由於服務只在那個節點執行時運行,我們需要將它放置在選擇器中,位於所有分支之上。右鍵點擊選擇器,選擇“添加服務“”BTS_Hunger“。選中新建的服務,如果查看細節面板的”默認“分段,我們能調整在服務中創建的變量,我們可以讓”Hunger Key“指向”Hunger“黑板鍵,可以把增長率從1改為0.1,此外,在細節面板的”服務“分段中,我們可以調整服務運行的間隔和它的隨機偏差,在這個事件中,我們要盡量避免它的不確定性,所以去除隨機偏差。

接下來我們要做的是根據這個飢餓值來改變行為樹的執行順序,為此我們要再添加一個裝飾器。右鍵點擊“Find Food“序列,選擇”添加裝飾器“然后選擇”黑板“,將新的裝飾器的”黑板“分段中的黑板鍵改為”Hunger“。注意上面會多出一個”鍵值“選項,把它改為1,這樣這個裝飾器會阻止運行”Find Food“序列,除非”Hunger“達到最大值1。為了避免忘記這個裝飾器的作用,將節點名改為”Is Hunger at Maximum“,這樣行為樹就修改好了。

 

現在我們來運行游戲並觀察行為樹,會發現當飢餓值到達1時,裝飾器就會始終執行尋找食物序列。

接下來要做的是新建一個任務,這個新任務會把“Hunger“黑板鍵的值重置到0,我們會有意讓這個任務變成一個泛型,這樣我們就可以在任何時間用它來控制浮點類型的黑板鍵。這樣把數值改為0。首先點擊工具欄中的”新建“按鈕,新建一個任務,選擇”BTTTask_Blueprintbase“作為新任務的基類,將此任務重命名為”BTT_setkeyfloat“。首先我們添加需要的黑板鍵,在”我的藍圖“面板的”變量“分段中,新建一個變量並命名為”FloatKey“,確保是公共變量,在右側細節面板中將變量類型改為黑板鍵選擇器。再新添一個變量並命名為”FloatValue“,在細節面板將變量類型改為浮點數,確保這個變量是公有變量,編譯。

接下來,右鍵點擊事件圖表,然后輸入“Event Receive Execute AI“,我們要用變量將黑板鍵設置成需要的值,按住Ctrl鍵,將” FloatKey “拖動到主窗口,拖動其引腳,找到”set Blackboard value as float“。現在將”FloatValue“連到”set Blackboard value as float“的數值輸入,按住Ctrl鍵,將”FloatValue“拖動到主窗口,將浮點數值連到”set Blackboard value as float“的數值輸入,現在我們可以將事件的執行引腳連到函數上。

 

接下來我們要確保結果返回真,否則行為樹就會卡在這里等待返回值,右鍵事件圖表“Finish Execute“函數,務必勾選布爾值”成功“,然后將”set Blackboard value as float “的執行引腳連到”Finished Execute“,保存並編譯。

現在我們回到行為樹,開始使用我們新建的任務,我們將該任務放置在搜尋食物序列的等待任務的后面。拖動搜尋食物序列找到我們的新任務 ,找到細節面板將“Float Value“設為0,將”Float Key“設為”Hunger“,之后保存。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM