58. UE5 RPG AI行為樹的裝飾器

書接56. UE5 RPG 給敵人添加AI實現跟隨玩家,我們實現了AI一些基礎設置,并實現了獲取敵人附近的玩家實現了跟隨功能
在這里插入圖片描述
接下來,我們將實現區分職業,并根據職業不同設置不同的攻擊距離,并且根據職業實現不同的技能施放。

黑板裝飾器

首先,我們在發現玩家下面添加一個Selector
在這里插入圖片描述
這個Selector上面右鍵添加裝飾器,裝飾器可以理解為用于增加條件判斷當前節點是否會設置為失敗,如果失敗了,節點下面的子項也將停止執行,運行其它分支邏輯,或者從頭開始重新執行行為樹。
在這里插入圖片描述
我們在節點上增加一個黑板裝飾器,這個裝飾器可以監聽黑板上的值來執行邏輯
在這里插入圖片描述
如果裝飾器這一關判斷通過不來,這個節點將直接被定義為失敗,節點下的行為將不被調用執行
在這里插入圖片描述
在右側屬性這里,有個黑板屬性,可以監聽一個黑板鍵,鍵查詢這里是可以通過的條件
在這里插入圖片描述
這里如果是已設置,那么如果黑板鍵被設置了值才能夠運行節點下面的節點,相反,如果設置的未設置,在這個黑板鍵被設置值以后,是無法執行此節點下面的后續節點。
在這里插入圖片描述
接下來是流控制這里的通知觀察者,這個值的設置用于在值在如何改變時,觀察者會中止某些流程。觀察者相當于整個行為樹的流程控制者,用于控制行為樹如何運行。
這兩個值的設置有什么區別呢?經過測試發現

  • 值改變時,觀察者將在黑板的鍵的值改變時通知觀察者
  • 結果改變時,是在裝飾器所在的節點結果發生變化(從成功變為失敗,從失敗變為成功)時通知觀察者
    在這里插入圖片描述
    上面講到了觀察者中止,那么如何中止呢,我們可以通過配置觀察器中止來實現,下面并列出來每個可以設置的值。
    在這里插入圖片描述
    這四個值將會設置需要在中止時中止那些運行的行為:
  • None 是不會中止
  • Self:如果設置了Self,觀察者將會中止掉此行為節點的所有正在運行的行為,并將自身返回失敗。
  • Low Priority:如果通知中斷,中斷所有低優先級的執行中節點。在行為樹中,節點通常具有優先級或執行順序,這種類型的中斷將影響所有優先級低于觸發中斷的節點的執行中節點。
    在下圖中,我們可以看到行為樹的執行順序,低優先級,就是比它的數值大的那些行為節點。
    在這里插入圖片描述
  • Both: 如果通知中斷,中斷所有低優先級的執行中節點,包括當前子樹中的節點。這實際上是“Self”和“Low Priority”的結合,既中斷當前子樹中的節點,也中斷其他所有低優先級的節點。

這也是我們為什么不把裝飾器放到前面的那個行為節點上的原因,你看執行順序就會發現,裝飾器的執行優先級比Selector要高,如果和發現最近玩家設置到一塊,那么如果裝飾器不通過,AI就無法運行查找最近玩家的服務。
在這里插入圖片描述

增加角色狀態的判斷

我們要執行移動或者攻擊時,還要判斷當前角色是否處于受擊狀態,所以,我們在黑板里增加一個布爾鍵,用于設置當前是否處于受擊狀態
在這里插入圖片描述
然后,我們在敵人基類里面,對其值進行初始化,從AIController里面獲取到黑板控件,然后調用函數設置即可。
在這里插入圖片描述
接下來就是設置它的動態值,我們之前實現了受擊時將敵人的速度設置為0,剛好在那里,我們還是使用同樣的方法設置其受擊布爾值

void AEnemyBase::HitReactTagChanged(const FGameplayTag CallbackTag, int32 NewCount)
{bHitReacting = NewCount > 0;GetCharacterMovement()->MaxWalkSpeed = bHitReacting ? 0.f : BaseWalkSpeed;//設置黑板鍵的值RPGAIController->GetBlackboardComponent()->SetValueAsBool(FName("HitReacting"), bHitReacting);
}

我們可以在節點上面增加多個裝飾器,所以,我們再增加一個判斷當前是否處于受擊狀態的黑板鍵
在這里插入圖片描述
這個黑板鍵監聽當前角色是否處于受擊狀態,由于使用的是布爾值,通知觀察者這里值和結果改變效果是一樣的,在通知觀察者中止行為是,我們選擇中止自身下面的子行為節點。
在這里插入圖片描述
然后,我們在它下面創建三個子行為節點,用于不同的需求
在這里插入圖片描述

實現根據職業切換行為節點

由于不同的職業的攻擊距離不同,所以,我們這里將區分了遠程攻擊和近戰攻擊。如果攻擊距離不夠時,我們還可以切換到向目標移動行為節點,來實現對目標的移動。
所以,我們再增加一個黑板鍵,用于記錄當前的角色是近戰攻擊還是遠程攻擊
我們增加一個RangedAttacker的布爾鍵,如果角色是近戰攻擊,我們將其設置為false,如果是法師或者游俠職業,我們將其設置為true。
在這里插入圖片描述
接著在敵人基類PossessedBy函數中,設置它的值。
在這里插入圖片描述
接下來,我們在下面創建三個Sequence,Sequence不同于Selector,它會執行所有的子行為,在有一個子行為失敗時返回失敗。
在這里插入圖片描述
我們在遠程攻擊行為節點上增加一個裝飾器
在這里插入圖片描述
這個裝飾器用于判斷當前角色是否為遠程攻擊者,如果是在戰士身上執行此ai行為樹,這里將直接返回false,不會運行后續的子行為
我們只需要在設置這里對RangedAttacker的鍵檢查是否已設置即可。
在這里插入圖片描述
接著增加一個修飾器,判斷攻擊范圍,并修改一下節點名稱,方便我們查看
在這里插入圖片描述

然后我們在近戰攻擊這里增加一個黑板裝飾器,用于判斷是否達到的近戰的攻擊距離
在這里插入圖片描述
這里選擇查看黑板鍵(與目標的距離),如果小于等于500cm,則能夠執行子行為,否則,將執行后續同級別行為。
在這里插入圖片描述
最后,我們在移動行為節點中,設置一個隨機等待時間和使用一個移動任務,任務的顏色都是由紫色標識出來。在下篇文章中,我們也會實現自己定義任務類。
在這里插入圖片描述
接著我們在行為節點上加上修飾器,用來限制它的子行為可以運行的范圍。
在這里插入圖片描述
它的身上變綠是因為我們設置中止規則,這個行為本來就是在玩家接近敵人一定距離后,敵人會朝向目標移動,然后在和目標距離一定距離后,切換為每個職業不同的攻擊行為邏輯。
所以,我們需要在結果改變時,終止此行為的執行。
在這里插入圖片描述
接著就可以運行查看效果,由于我們現在還未實現角色攻擊行為,所以它們正常應該就會停留在距離玩家500cm的位置。
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/16218.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/16218.shtml
英文地址,請注明出處:http://en.pswp.cn/web/16218.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《Effective Objective-C 2.0》讀書筆記——對象、消息、運行期

目錄 第二章:對象、消息、運行期第6條:理解“屬性”這一概念第7條:在對象內部盡量直接訪問實例變量第8條:理解“對象等同性”這一概念第9條:以“類族模式”隱藏實現細節第10條:在既有類中使用關聯對象存放自…

App推廣新境界:Xinstall助你輕松突破運營痛點,實現用戶快速增長!

在移動互聯網時代,App已經成為企業營銷不可或缺的一部分。然而,如何有效地推廣App,吸引并留住用戶,成為了眾多企業面臨的難題。今天,我們將為您揭秘一款神奇的App推廣工具——Xinstall,它將助您輕松突破運營…

繪唐3模型怎么放本地sd安裝及模型放置位置 及云端sd部署

繪唐3模型怎么放本地sd安裝及模型放置位置 及云端sd部署 資料里面授權方式: https://qvfbz6lhqnd.feishu.cn/wiki/CcaewIWnSiAFgokOwLycwi0Encf 云端和模型之間存在某種關聯性。云端通常用于存儲和管理大量數據,并提供計算和資源的服務。模型是對數據進…

Linux環境下TensorFlow安裝教程

TensorFlow是學習深度學習時常用的Python神經網絡框 下面以Mask R-CNN 的環境配置為例: 首先進入官網:www.tensorflow.org TensorFlow安裝的總界面: 新建anaconda虛擬環境: conda create -n envtf2 python3.8 (Pyth…

『大模型筆記』從頭開始代碼構建GPT!

從頭開始代碼構建GPT! 文章目錄 一. 從頭開始代碼構建GPT!二. 參考文獻一. 從頭開始代碼構建GPT! 我們構建了一個生成式預訓練Transformer (GPT),遵循論文《Attention is All You Need》和OpenAI的GPT-2 / GPT-3的方法。我們討論了與ChatGPT的聯系,ChatGPT已經風靡全球。我…

Vue3學習-用 vite@latest 初始化項目后,引入模塊出現:找不到模塊 ‘@/***

引入模塊時遇到路徑錯誤 因為沒有默認配置別名,需要在 vite.config.ts 與 tsconfig.json 添加配置 //vite.config.ts export default defineConfig({resolve:{alias:{:path.resolve(__dirname,./src)}} })//tsconfig.json {"compilerOptions": {"b…

C# 為什么說LINQ要勝過SQL

C# 為什么說LINQ要勝過SQL 現在讓我簡潔地總結一下為什么說LINQ要勝過SQL的幾個主要原因: 統一編程語言: LINQ將查詢語言融合到編程語言中,使得查詢和其他業務邏輯可以在同一種編程語言中編寫,減少了在不同語言之間切換的復雜性&…

Vue | 自定義組件雙向綁定基礎用法

Vue | 自定義組件雙向綁定基礎用法 vue 中,由于單向數據流,常規的父子組件屬性更新,需要 在父組件綁定相應屬性,再綁定相應事件,事件里去做更新的操作,利用語法糖 可以減少綁定事件的操作。 這里就簡單的梳…

Qt 打卡小程序總結

1.Qt::Alignment(枚舉類型)用于指定控件或文本的對齊方式 Qt::AlignLeft:左對齊。Qt::AlignRight:右對齊。Qt::AlignHCenter:水平居中對齊。Qt::AlignTop:頂部對齊。Qt::AlignBottom:底部對齊。…

python表達式解析的陷阱與技巧

新書上架~👇全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目錄 一、引言:表達式的復雜性 二、案例分析:表達式的解讀 三、陷阱揭示…

解決問題:Collecting package metadata (current_repodata.json)--faile

目錄 解決步驟: 1、創建pip.ini文件:winR對話框中復制輸入:%APPDATA%,然后回車。 2、conda添加清華源: 3、這些創建完,重啟電腦就可以創建你的虛擬環境了 4、利用鏡像源下載庫: 5、查看to…

AOP總結

AOP是什么 AOP是面向切面編程,其目的是將橫切關注點從核心業務代碼中分離出來,通過動態代理等方式,實現代碼的增強和解耦,使得其具有更好的可維護性和可擴展性。 其中橫切關注點是多個類或對象的公共行為,如事務管理…

2024寶藏工具EasyRecovery數據恢復軟件免費版本下載

在這個數字化的時代,數據已經成為我們生活中的重中之重。無論是工作中的重要文件,還是手機中珍貴的照片,我們都依賴著這些數據。然而,數據丟失的情況時有發生,可能是誤刪,可能是設備故障,更可能…

java-方法

在 Java 編程語言中,方法是一段用于執行特定任務的代碼。方法是面向對象編程(OOP)的基礎之一,因為它允許我們在對象上執行操作。在 Java 中,方法是類的組成部分,這意味著它們與類緊密相關。本解釋將涵蓋 Ja…

vue3和vite實現vue-router4版本路由的配置以及自動生成路由配置

這個是普通的手動路由配置:https://blog.csdn.net/weixin_68658847/article/details/130071101 自動路由配置 創建項目 npm create vitelatest my-vue-app -- --template vue // 或者 yarn create vite my-vue-app --template vue// 安裝路由 yarn add vue-route…

Ansible02-Ansible Modules模塊詳解

目錄 寫在前面4. Ansible Modules 模塊4.1 Ansible常用模塊4.1.1 Command模塊4.1.2 shell模塊4.1.3 scrpit模塊4.1.4 file模塊4.1.5 copy模塊4.1.6 lineinfile模塊4.1.7 systemd模塊4.1.8 yum模塊4.1.9 get_url模塊4.1.10 yum_repository模塊4.1.11 user模塊4.1.12 group模塊4.…

IPv4 報頭 Protocol 字段和 IPv6 報頭 Next header 字段中的 IP 協議號列表

IPv4 基本報頭(20 ~ 60 Byte) IPv6 基本報頭(40 Byte) IPv4 Header vs IPv6 Header 黃色 為 IPv6 與 IPv4 相同 紅色 為 IPv6 刪除的 藍色 為名稱不同功能相同 中青色 為新增的 Type of service Traffic Class (用于…

js知識點匯總之let const 和 var的區別

let const 和 var的區別 作用域 ES5 中的作用域有:全局作用域、函數作用域,ES6 中新增了塊級作用域。塊作用域由 { } 包括,if 語句和 for 語句里面的 { } 也屬于塊作用域。 var關鍵字 沒有塊級作用域的概念 // global scope {var a 10;…

AGI系列(2):掌握AI大模型提示詞優化術,從容應對各種提問場景

在上一篇大模型提示詞的文章中,筆者介紹一種通用提示詞優化的方法,這種方法基本上可以覆蓋大部分人的一般場景需求。 沒看到上文的讀者,可以通過如下鏈接去看下: 👉👉👉 AGI系列(1&a…

全網首發UNIAPP功能多的iapp后臺源碼

全網首發UNIAPP功能多的iapp后臺源碼,眾所周知UN Dev Assist 后臺是一款既不免費又不好用的后臺今天直接分享。 搭建教程在里面了,自己查看。 源碼下載:https://download.csdn.net/download/m0_66047725/89291994 更多資源下載:…