【UE4】添加一個 AI NPC

UE4 添加一個 AI NPC

  本文通過下載免費的 Character 和 Animation 在遊戲中添加三種類型的 NPC:

  1. 從起點走到目標點
  2. 走走停停
  3. 跟隨玩家

  注:文中的 “C&S” 都代表 “Compile and Save”

實現效果:

參考資料(Youtube):

  1. Unreal Engine 4 Tutorial How to Create Your First AI NPC CHARACTER | Part 1
  2. Unreal Engine 4 Tutorial How to Create Your First AI NPC CHARACTER | Part 2

具體步驟

1. 下載 Character 和 Animation

  用 Adobe ID 登錄 https://www.mixamo.com,有很多免費的 Characters 和 Animations 可以下載。選擇一個人物(比如 Brian),並下載,format 爲 FBX(.fbx),Pose 爲 Original Pose。
  下載人物後,下載我們需要的 Animation,這裏只下載 Idle 和 Walking 的動作(都選 fbx without skin,且一定要選上 "In Place"!!)。(注意:有的 Animation 和 Character 導入後有問題,還是跟着視頻選吧)

2. Import

  在 Content Browser 中創建文件夾 “NPC”,在裏邊創建文件夾 “Brian”,將 Brian.fbx 拖動進 UE 的 Content Browser 中,在彈出的窗口中選擇 “Import”。在新建的 Brian 文件夾下,新建文件夾 BrianStuff,把除了模型本身(Skeletal Mesh)以外的文件move到 BrianStuff 中。
  在 Brian 文件夾中將兩個 Animation 拖動導入,Skeletal Mesh 選擇 Brian 的。

3. 新建 AIController、Enumeration

  在 Brian 文件夾中右鍵新建 BluePrint Class 選擇父類爲 AIController,命名爲 “BrianAIController”。文件夾中右鍵新建 Blueprints->Enumeration,命名爲 “BrianEnum”。雙擊進入枚舉器,在 Enumerators 中 new 一個名爲 “Walk”,Enum Description 也設爲 “Walk”。C&S。

4. 創建 Character

  在 Brian 文件夾中右鍵新建 BluePrint Class,父類選擇 Character,命名爲 “BrianMasterAI” 並打開。在 Component 的 Mesh 中的 Details 中將 Skeletal Mesh 設爲 Brian,並移動將其放在 Capsule 中。如果 Perspective 視角不好調整,可以先改爲 left 視角進行調整腳的位置。C&S。

5. Animation Blueprint

  在 Brian 文件夾中右鍵新建 Animation->Animation Blueprint,彈出窗口中選擇 Brian_Skeleton,命名爲 “BrianAnimBP” 並打開。這個和普通的 BP 不同,這裏有一個 “AnimGraph” 窗口。且右下角的 Asset Browser 裏邊,可以看到我們添加的兩個 Animation 和 Brian 自己帶的一個。C&S。
  打開 BrianMasterAI,選擇 BrianMasterAI(slef),在 Details 中將 AI Controller Class 設爲 “BrianAIController”。在 Mesh 的 Details 中將 Anim Class 選爲 “BrianAnimBP”,C&S。

6. State Machine

  在 BrianAnimBP 中,在 Output Pose 的 Result 處左鍵拖動,添加一個 State Machine。

  雙擊打開 State Machine,從 Entry 箭頭脫出一個 “Add State…”,命名爲 “Idle”,雙擊打開,在 Asset Browser 中拖動 Idle 動畫並將其與 “Output Animation Pose” 連接。回到 New State Machine 層級,從 “Idle” 左鍵拖出一個 New State,命名爲 “Walking”,並且同上配置好。從 Walking 再次左鍵脫出箭頭指向 “Idle” State。

  在 BrianAnimBP 的 Event Graph 中,添加如下藍圖:

  其中 GET,是在從 “As Brian Master AI” 右鍵 “Promote to Variable” 並將 SET 的 Variable Name 修改爲 Brian 之後,先 “Get Brian”,然後右鍵選擇 “Converted to Validated Get” 得到的。C&S(會有 Warning)。
  回到 New State Machine,雙擊 Idle ——> Walking 上方的 Transition Rule 圖標,從變量 speed 拉出一個 Get Speed,然後再拖出一個 “NotEqual(float)”(想快速的話,可以輸入 “!=”),並將其與 “Can Enter Transition” 連接。回到 New State Machine,將下方的 Transition Rule 進行同樣修改,不過是 “Equal(float)”。C&S,這時候就不應該有 Warning 了。

7. 配置 BrianMasterAI

  打開 “BrianMasterAI”,從 Event BeginPlay 拖出一個 “Switch on BrianEnum”。在 My Blueprint 中的 Variables 中新增一個名叫 “Walk”,Type 爲 “Brian Enum” 的變量。Get Walk 並將其與 Selection 連接。新建一個 custom event 名叫 “WalkTo”。從 Switch on BrianEnum 的 Walk 拖出新建的 WalkTo。從剛新建的 WalkTo 調用函數 AI MoveTo。從 Pawn 拖出 Self。
  新建一個名爲 “Target_1”,Type 爲 “Target Point” 的變量,並通過變量右側的眼睛,將其設爲 "Public"。C&S。將其與 Target Actor 相連。C&S。

8. 添加 Nav

  在遊戲場景中,添加 “Nav Mesh Bounds Volume”。調整大小,按 “p” 查看是否正確。

  綠色部分是角色可以移動的部分,可以看到,有碰撞的物體,是不能移動到的,但是想這個沒有設置碰撞的 couch,就是可以的。

9. 添加 Target Point

  在場景中添加一個 Target Point,將 BrianMasterAI 拖進場景中,並在 Details 中,點擊 “Target 1” 右方的 Pick 按鈕,並選擇場景中剛剛添加的 Target Point(如果沒有找到 Target_1 說明在 BrianMasterAI 中沒有點擊眼睛將 Target_1 設爲 public)。這時候點擊 Play,可以看到 Brian 移動了目標點,但是移動得很詭異,我們需要調整他的方向和速度。

10. 進行調整,初步完成

  打開 BrainMasterAI,選擇 “CharacterMovement”,將 “Max Walk Speed” 設爲 150。
  選擇 BrianMasterAI(self),將 “Use Controller Rotation Yaw” 取消選擇。
  在 CharacterMovement 中勾選 “Orient Rotation to Movement”。
  在 Viewport 中將 Brian 繞着 z 軸旋轉 90° 使得他面向自己的 X 軸正方向(這是他的 Forward Arrow)。
  C&S。
  這時再啓動遊戲,應該就是正確的了。我第一次配置到這裏,效果如下。這是由於下載 Animation 的時候,沒有選擇 In Place!!!!難受啊。這樣會導致 Capsule 和動畫的速度不一樣,所以會閃。嘗試用 Root Motion 解決,但是沒有成功,會很奇怪,還遇到了新的問題。

  如果下載的是 In Place 的 Animation 到這裏就應該沒有問題了,暫時會得到一個從它的放置點 Walk 到我們設定的 Target Point 然後開始 Idle 的 NPC。

  是不是看起來有點 GTA 那種想給他一拳內味兒了~

11. New Enumerators

  從這裏開始是參考資料裏第二條教學視頻。
  在 BrianEnum 中將我們設置的 Walk 的Description 寫上 “Walk from point A to point B”,這樣更直觀。new 兩個 Enumerators,分別是 “Roam” 和 “Follow”,Description 分別爲 “Roaming to random locations” 以及 “Follow the player”。

12. 設置 Roam

  打開 BrianMasterAI 可以看到 Switch on BrianEnum 新增了 Roam 和 Follow。將 Walk 變量重命名爲 “AI_State” 並將其設爲 Public,C&S。在遊戲場景中選中 Brian,可以看到多了一個 AI_State 選項,選項就是我們設置的三個:Walk、Roam、Follow。
  回到 BrianMasterAI 的 Event Graph,add Custom Event “Roam” 和 “Follow”,從 Switch on BrianEnum 的 Roam 中拖出 Roam,Follow 同理。
  選擇 WalkTo 的四個 Node,然後按 “C”,添加一個 Comment Box,然後註釋 “Walk from point A to point B”。
  Roam 設置如下:

  其中 Delay 的 Duration 是指,每次 Roam 之後,NPC 會在原地呆多久,可以設一個隨機數。
C&S。在遊戲中將 AI_State 選爲 Roam,Play 就可以看到 NPC 在場景中亂走(直線),然後到了一個位置,停兩秒,繼續 Roam。這裏可以直接複製出一個 Brian,這樣就有兩個亂走的人了。

13. 設置 Follow

  Follow 設置如下:

  進入遊戲,複製出一個 Brian 然後將其 AI_State 設爲 Follow,可以看到他會走到玩家身旁,然後一直跟隨。
  值得注意的是:當玩家走出 NavMeshBoundsVolume 之後,設置爲 Follow 的 Brian 會 立即原地停住,而且玩家回到範圍內,Brian 也不會進行跟隨了。有點像怪物獵人裏邊,寵物貓馴服的怪,在玩家走出區域後就不再跟隨一樣。

  收工~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章