p54-p58導航網絡、藍圖和AI樹實現AI隨機移動和跟隨移動、靠近玩家揮拳、AI跟隨樣條線移動思路
- p54導航網格
- p55藍圖實現AI隨機移動和跟隨移動
- AI Move To(AI進行移動)
- Get Random Pointln Navigable Radius(獲取可導航半徑內的隨機點)
- Set Timer by Event(以事件設置定時器)
- Random Float in Range(范圍內隨機浮點)
- p56AI樹實現AI隨機移動和跟隨移動
- 目標感知跟新時(AIPerception)(On Target Perception Updated(AIPerception))
- 中斷AISimulus(Break AISimulus)
- AI行為樹
- p57靠近玩家揮拳
- 蒙太奇
- p58AI跟隨樣條線移動思路
p54導航網格
在體積找到“導航網格體邊界體積”拖拽到視圖中出現一個線框和綠色覆蓋,線框覆蓋部分屬于AI可以行動范圍
快捷鍵“P”可以顯示消失的查看綠色覆蓋
綠色導航網格分為靜態和動態
靜態代表游戲運行之前就已經計算好了AI可以運動的范圍
動態代表游戲運行時實時的計算AI可以運動的范圍
p55藍圖實現AI隨機移動和跟隨移動
ctrl+w復制ThirdPersonCharacter,創建的新藍圖類重命名為AI
新建文件夾AI,把藍圖類AI放到新文件夾AI中
打開藍圖類AI,刪掉藍圖、遍歷、攝像機、其他事件圖表
AI Move To(AI進行移動)
作用:讓AI進行移動
Pawn:連接(使其移動的)對象(一般都連接self(獲得一個對自己的引用))
Destination:(將要移動到的)目標
Target Actor:跟蹤(某個角色)移動(如果連接的是玩家,就會一直跟著玩家跑)(和Destination選擇一個使用,區別為Target Actor傳入的是演員,Destination傳入的是向量)
Acceptance Radius:走到目標的多少范圍
Stop on Overlap:大勾后Acceptance Radius變成了走到目標的多少范圍停止
成功時:AI到達目的地成功時觸發
失敗時:AI到達目的地失敗時觸發
創建新的自定義事件“AI移動”連接輸入執行引腳
Pawn連接self
Destination拉出引線搜索Get RandomPointln Navigable Radius(獲取可導航半徑內的隨機點)
Get Random Pointln Navigable Radius(獲取可導航半徑內的隨機點)
Origin:(需要傳入一個圓心)在此圓心范圍內找到一個點
Radius:半徑范圍數值
Origin拉出引線搜索“獲取Actor位置”
創建事件開始運行,拉出引線連接事件AI移動
藍圖如下
現在AI會在以自身為半徑的Radius范圍內隨機選一個點移動,之后就會停下,當前目的需要AI在移動到一個點后再次移動
Set Timer by Event(以事件設置定時器)
Time:可以設置時間
Looping:循環(打勾即會循環)
Random Float in Range(范圍內隨機浮點)
如圖連接藍圖
如此,每過5到7秒觸發一次時間AI移動,循環(如果AI還沒到目的地時間就到了,AI會選擇向新的點走去)
p56AI樹實現AI隨機移動和跟隨移動
右鍵內容瀏覽器-》人工智能-》黑板
右鍵內容瀏覽器-》人工智能-》行為樹
右鍵內容瀏覽器-》藍圖類-》搜索AIController(AI控制器)(這是所有AI控制器的父類)
AI_BP可以看作是傀儡,AI_BT控制AI_BP,行為樹控制AI的行為,黑板存儲變量
在黑板新建兩個變量,一個bool變量重命名為“是否看到玩家?”,另一個是向量重命名為“要去的坐標”
打開AIController,在組件面板添加“AI感知組件”(作用是讓AI感知周圍的敵人友軍等)
點擊AIPerception(AI感知組件),在細節面板找到“AI感知”點擊“感官配置”右側的加號
有許多配置,選擇視力配置
實力配置可以修改如下參數
次要視覺半角角度:AI的視力范圍
按歸屬檢測中的中立方要打勾,這樣才可以檢測到玩家(如果想要更改敵友等需要更改c++代碼)
目標感知跟新時(AIPerception)(On Target Perception Updated(AIPerception))
Actor:AI看到(因為之前選的視力配置)的”Pawn和角色藍圖類“會傳到此處
Stimulus:刺激物
Actor拉出引線搜索”類型轉換為ThirdPersonCharacter"(類型轉換的作用是只有看到小白人才會響應之后的邏輯)
Stimulus拉出引線搜索“中斷AISimulus”
中斷AISimulus(Break AISimulus)
Successfully Sensed:是否成功感測到了小白人
如下圖連接藍圖,進行測試
想要進行測試還需要打開AI_BP,在細節面板-》Pawn-》AI控制器類-》選擇AI_BT(剛才的AIContoller)
編譯保存
如此在游戲中出現在AI視野范圍內左上角會出現true,走出AI視野會在左上角出現false
AI行為樹
從根拉出的Composites:復合節點(用于分支的規則)
Selecter:選擇,幾選一……
Sequence:序列,按順序進行
因為目的是AI看到玩家沖到玩家身邊揮拳,所以先連接Selector根據有沒有看到玩家而判斷,接下來連接Sequence(如果看到了玩家依次進行什么動作)
如下圖連接
在左側Sequence右鍵添加裝飾器,選擇黑板Blackboard(調用了黑辦里的變量)
在右側細節面板選擇要調用的變量“是否看到玩家?”
當黑板太多時,點擊空白處,在細節面板可以選擇使用的黑板
右側Sequence也添加裝飾器黑板,在細節面板-》黑板-》鍵查詢-》未設置,黑板鍵選擇變量“是否看到玩家?”
(選擇未設置就代表未看到,已設置就是看到)
現在設置優先級(使其優先級相等)點擊Sequence的黑板,在細節面板-》流控制-》觀察器終止-》Both
兩個都如此設置,現在兩個在同一優先級
在AI_BT的事件圖表右鍵搜索“獲取黑板”拉出引線搜索“將值設為布爾”,此時“將值設為布爾”出現Bool Value節點,連接中斷AIStimulus藍圖的Successfully Sensed節點
從Key Name拉出引線搜索“創建文字命名”,在“創建文字命名”寫上“是否看到玩家?”
如此就可以實時的傳遞bool值“是否看到玩家?”了
現在行為樹的規則有了,但是還沒有內容,接下來添加內容
點擊左上角新建任務,選擇BTTask_BlueprintBase(如果沒下拉,選擇即可)
在新建的任務(藍圖)在左側我的藍圖,點擊函數右側的重載“事件接收執行AI”
刪除之前創建的藍圖實現隨機移動的藍圖
如圖在新建的任務如下圖鏈接
Comtrolled Pawn連接AI Move To的Pawn(這一步是連接AI控制器的對象)
AI Move To的成功時連接”完成執行“(Finish Execute)(這一步是讓AI在執行完成后告訴系統到底是成功還是失敗了,才能進行下一個任務)(不要忘記給完成執行的bool打勾)
(必須在完成任務時讓編譯器知道,不然就不會做任何事了)
這是隨機找點的邏輯,邏輯寫完該讓行為樹調用了
在右側行為樹”沒看到玩家時“拉出搜索”隨機找點_BP“(剛才新建的任務的重命名)
再添加一個Wait。設置為5秒,這樣就會,找個點,待5秒,再找個點,待5秒,如此循環
現在行為樹還沒有和AIController產生聯系
在AIController的藍圖中創建”事件開始運行“,連接”運行行為樹“
在”運行行為樹“的BTAsset選擇對象行為樹”AI_BT“
在AI_Tree新創建一個任務”尋找玩家_BP“,重載”接收執行AI“如圖連接
現在AI會一陣跟著玩家,但是很容易視野丟失玩家就會跑開
解決辦法:讓AI看到玩家后一直朝向玩家
打開AI小白人藍圖,在組件選中角色移動,在細節面板搜索朝向,取消勾選
選中類默認值,在細節面板找到Pawn-》使用控制器旋轉Yaw
打開尋找玩家_BP,搜索”設置焦距“目標連接Owner Controller,New Focus連接Return Value
控制AI旋轉方向的是設置焦距的New Focus,New Focus連接獲取玩家角色,就會一直看向玩家角色方向
使用焦距后AI會一直朝向玩家,會在還沒看到玩家的時候斜著走等等
所以需要在沒看到玩家時關掉設置焦距
在隨機找點_BP中創建清除焦距藍圖,如下圖連接
p57靠近玩家揮拳
給AI添加一個碰撞盒子(Sphere Collision)調整大小
點擊Sphere,在細節面板點擊兩個藍圖(組件開始重疊時(Sphere)、組件結束重疊時(Sphere))的加號創建藍圖
蒙太奇
蒙太奇就是多個動畫或片段剪輯組合在一起,通過程序驅動播放某一個片段
點擊組件面板的“網格體(CharacterMeshO)”拖出,拉出引線搜索“獲取動畫實例(Get Anim Instance)”,拉出引線搜索“蒙太奇播放(Montage Play)”
(蒙太奇播放的目標是動畫實例,所以先創建前面兩個藍圖。因為要讓“網格體(CharacterMeshO)”里的模型播放動畫,所以選用“網格體(CharacterMeshO)”來連接)
為蒙太奇播放添加一個動畫
可以通過調節In Play Rate而更改動畫播放時間
返回值是直接獲取動畫的長度,練到time效果如下:
當播放蒙太奇的同時,觸發計時器,計時器開始倒計時,時間為蒙太奇的總時間,倒計時結束時,正好是動畫播放完,觸發自定義事件,就會再一次播放動畫,觸發計時器,勾選looping之后,就會如此重復播放動畫
以事件設置定時器的Return Value拉出引線搜索“Clear and Invalidate Timer by Handle(以句柄清除定時器并使之無效)”
按上述路徑打開,復制第一個,在AI文件夾復制并改名“AI_AnimBP”(以防和玩家的混掉)
打開AI_BP藍圖,點擊組件面板的“網格體(charaMeshO)(繼承)”在細節面板的動畫-》動畫類。選擇剛才命名的“AI_AnimBP”
雙擊打開“AI_AnimBP”
雙擊左側動畫圖表的AnimGraph
兩個連線之間添加一個插槽“DefaultSlot”
插槽的作用相當于標簽(分類),為了更好的識別
完整藍圖如下
現在拳頭靠近玩家攝像機時會被阻擋,所以進行如下操作
打開藍圖AI_BP,選中網格體-》在細節面板-》碰撞-》碰撞預設改為Custom-》Camera勾選忽略
p58AI跟隨樣條線移動思路
如圖,隨著點走
新建一個Actor藍圖類
在添加組件添加“樣條組件”
拉出藍圖到視口會出現下圖
選中左側點,按住Alt鍵拉動可以快速創建一個點
打開事件樹,在左上角新建任務,新建
拉出時間接收執行AI,連接獲取類的所有Actor(Actor Class選中剛才創建的藍圖)