【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 也不会进行跟随了。有点像怪物猎人里边,宠物猫驯服的怪,在玩家走出区域后就不再跟随一样。

  收工~

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