4 - 添加角色动画

如何为你的第一人称射击游戏角色添加动画。

Choose your operating system:

Windows

macOS

Linux

前置主题

为了理解并使用本文中的内容,请确保您已掌握以下主题:

FinalShot.png

这是你完成本节后会看到的内容。

目的

本节旨在展示如何为你的第一人称射击游戏角色添加动画。

目标

完成教程的这一节后,你将能够:

  • 为角色添加动画

  • 设置事件图表

  • 添加动画状态机

  • 为动画添加过渡状态

  • 关联动画蓝图与角色蓝图

步骤

  • 4.1 - 为角色添加动画

  • 4.2 - 设置事件图表

  • 4.3 - 添加动画状态机

  • 4.4 - 添加动画过渡状态

    • 4.4.1 - 添加空闲到奔跑/奔跑到空闲的过渡

    • 4.4.2 - 添加空闲到跳跃开始的过渡

    • 4.4.3 - 添加奔跑到跳跃开始的过渡

    • 4.4.4 - 添加跳跃开始到跳跃循环的过渡

    • 4.4.5 - 添加跳跃循环到跳跃结束的过渡

    • 4.4.6 - 添加跳跃结束到空闲的过渡

  • 4.5 - 关联动画蓝图和角色蓝图

4.1 - 为角色添加动画

这一步中,你将在游戏中添加一些动画。

导入动画

在开始之前,从以下链接下载并提取示例动画:

  1. 内容浏览器(Content Browser) 中点击右键,选择 新建文件夹(New Folder)

    RightClickImport.png

  2. 将此新文件夹命名为"Animations"。

  3. 双击打开该文件夹。

  4. 找到以下五个本地动画文件:

    • FPP_Idle.FBX

    • FPP_JumpEnd.FBX

    • FPP_JumpLoop.FBX

    • FPP_JumpStart.FBX

    • FPP_Run.FBX

  5. 在"Animations"文件夹中点击右键,然后点击 导入到/Game/Animations/(Import to /Game/Animations/...) 开始导入动画。

    ImportAnimations.png

  6. 在弹出的的对话框中,选择 选择骨架(Select Skeleton) 标题下的 HeroFPP_Skeleton ,然后点击 全部导入(Import All) 导入所有动画。

    SelectHeroFPP_Skeleton.png

    确保在导入动画之前选择了正确的目标网格体!否则,稍后转到地图动画时可能会出现一些问题。

  7. 现在, 内容浏览器(Content Browser) 中的 动画(Animations) 文件夹中应该有全部五个动画。

    ImportedAnimations.png

  8. 点击 保存(Save) 按钮,保存已导入的文件。

创建动画蓝图

  1. 在内容浏览器中右键点击动画文件夹。在 创建高级资产(Create Advanced Asset) 分段里,展开 动画(Animation) 并选择 动画蓝图(Animation Blueprint)

    AddNewAnimBP.png

  2. 选择 AnimInstance 作为父类,并选择 HeroFPP_Skeleton 作为目标骨架。

    CreateAnimBP.png

  3. 将新动画蓝图命名为"Arms_AnimBP"。

  4. 双击 Arms_AnimBP 打开 蓝图编辑器(Blueprint Editor)

    DoubleClickAnimBP.png

添加状态机过渡变量

  1. 我的蓝图(My Blueprint) 选项卡中,点击 新增(Add New) 按钮,并选择 变量(Variable)

    AddingNewVariable.png

  2. 将该变量设置为 布尔(Boolean) (可能已经这样设置了,但最好通过 细节(Details) 面板确认一下),并将其命名为"IsRunning"。

  3. 我的蓝图(My Blueprint) 选项卡中,点击 新增(Add New) 按钮,并选择 变量(Variable)

  4. 将该变量设置为 布尔型(Boolean) ,并将其命名为"IsFalling"。

  5. 现在你应该有两个动画过渡变量,用于驱动动画的状态机。

  6. 进入下一节时,保持 Arms_AnimBP 处于打开状态。

4.2 - 设置事件图表

在这一步中,我们要编辑动画的事件图表,以确保我们的动画过渡变量在游戏运行时能够正确触发。

更新状态变量

  1. 打开 Arms_AnimBP (如果尚未打开)。

  2. 双击 我的蓝图(My Blueprint) 选项卡中的 事件图表(EventGraph) ,打开事件图表。

    OpenEventGraph.png

  3. 在图表中点击右键,弹出 上下文菜单(Context Menu)

  4. 上下文菜单(Context Menu) 的搜索字段中输入"Update",然后点击 Event Blueprint Update Animation 以添加该节点。

    Event Blueprint Update Animation 节点用于在每次更新动画时更新我们的状态变量,使变量始终与游戏状态同步。
    EventBlueprintUpdateAnimationNode.png

  5. 在图表中点击右键,弹出 上下文菜单(Context Menu)

  6. 上下文菜单(Context Menu) 的搜索字段中输入"Owner",然后点击 Try Get Pawn Owner 以添加该节点。

    TryGetPawnOwnerBP_Node.png

  7. 从输出引脚连出引线,并在 上下文菜单(Context Menu) 中选择 Cast to Character

    CastToCharacterContextMenu.png

  8. Event Blueprint Update Animation 节点上的输出执行引脚关联到 Cast to Character 节点上的输入执行引脚。

    ConnectedCastToCharacterNode.png

  9. As Character 输出引脚连出引线,并选择 Get Character Movement (可能需要禁用上下文相关(Context Sensitivity)以方便找到此节点)。

    GetCharacterMovementNode.png

  10. Character Movement 输出引脚连出引线,并选择 Get Movement Mode

    GetMovementMode.png

查询角色移动

  1. Movement Mode 输出引脚连出引线,并选择 Equal (Enum)

    EqualEnumNode.png

确定角色是否在下降状态

  1. Equal (Enum) 节点上的下拉菜单值设置为 下降(Falling) .

    SelectFalling.png

  2. 按住Alt键的同时点击 我的蓝图(My Blueprint) 选项卡中的 IsFalling ,将其拖到图表中,创建一个 Set Is Falling 节点。

  3. Cast to Character 节点的未标记输出执行引脚连接到 Set Is Falling 节点的输入执行引脚,并将 Equal (Enum) 节点的输出布尔数据引脚连接到 Set Is Falling 节点的输入布尔数据引脚。

    ConnectedIsFalling.png

确定角色是否在奔跑状态

  1. 返回 Cast To Character 节点,并从 As Character 引脚再次连出引线。这次选择 Get Velocity 节点。

    GetVelocityNode.png

  2. 如果角色不是站立不动,其速度向量的长度将大于零。因此,从 Return Value 向量输出引脚连出引线,并选择 Vector Length 以将该节点添加到图表。

    VectorLength.png

  3. Return Value 浮点输出引脚连出引线,并选择 > (float) 节点。

    GreaterThan.png

  4. 按住Alt键的同时点击 我的蓝图(My Blueprint) 选项卡中的 IsRunning ,将其拖到图表中,创建一个 Set Is Running 节点。

    IsRunning.png

  5. Set Is Falling 节点的输出执行引脚连接到 Set Is Running 节点的输入执行引脚,并将 > (float) 节点的输出布尔引脚连接到 Set Is Running 节点的输入布尔引脚。

    ConnectedIsRunning.png

  6. 现在你的 事件图表 应如下所示:

    点击查看大图。

4.3 - 添加动画状态机

在这一步中,你将组合一个状态机,以利用你新创建的变量。

  1. 双击 我的蓝图(My Blueprint) 选项卡中的 AnimGraph , 打开该图表。

    AnimGraph.png

  2. 右键点击该图表,在 上下文菜单(Context Menu) 中选择 状态机(State Machines)>添加新状态机(Add New State Machine...)

    AddNewSM.png

  3. 右键点击 我的蓝图(My Blueprint) 选项卡中的 新状态机(New State Machine) ,将其命名为"Arms State Machine"。

    NewArmsStateMachine.png

  4. 将"Arms State Machine"节点上的输出执行引脚连接到 Final Animation Pose 节点上的 Result 输入执行引脚。

    ConnectedArmsStateMachine.png

  5. 双击"Arms State Machine"节点,打开其图表进行编辑。

4.4 - 添加动画过渡状态

在这一步中,你将向状态图表添加五个状态,即:

  • 空闲(Idle)

  • 奔跑(Run)

  • 跳跃开始(JumpStart)

  • 跳跃结束(JumpEnd)

  • 跳跃循环(JumpLoop)

  1. 在图表中点击右键,并从下拉菜单中选择 添加状态(Add State...)

    AddState.png

  2. 将该状态命名为"Idle"。

  3. 双击该状态开始编辑。

  4. 在图表区域内点击右键,并在 上下文菜单(Context Menu) 中搜索"空闲(Idle)"。

  5. 点击 Play FPP_Idle 以插入该节点。

    PlayIdle.png

  6. Play FPP_Idle 节点的输出执行引脚连接到 Output Animation Pose 节点的 Result 输入执行引脚。

    ConnectedIdleNode.png

    对其他4个状态重复执行步骤1-6,即:

    • 奔跑(Play FPP_Run > Output Animation Pose)

    • 跳跃开始(Play FPP_JumpStart > Output Animation Pose)

    • 跳跃结束(Play FPP_JumpEnd > Output Animation Pose)

    • 跳跃循环(Play FPP_JumpLoop > Output Animation Pose)

  7. 完成以上操作后, Arms State Machine 图表应如下所示:

    点击查看大图。

    每种状态都应包含一个 Play 节点,该节点连接到各自的 Final Animation Pose 节点。

  8. Entry 节点拖出引线,连接到 Idle 状态节点。

    ConnectEntrytoIdle.png

4.4.1 - 添加空闲到奔跑/奔跑到空闲的过渡

在这一步中,你将设置空闲与奔跑相互之间的过渡,以便在角色开始移动时,状态机会从 空闲(Idle) 过渡到 奔跑(Run)

  1. 空闲(Idle) 状态拖出引线连接到 奔跑(Run) 状态,以创建过渡。

    WireIdletoRun.png

  2. 双击该过渡进行编辑。

  3. 按住Control键的同时点击 我的蓝图(My Blueprint) 选项卡中的 IsRunning ,拖到图表中,创建一个 Get Is Running 节点。

  4. Get Is Running 节点的输出引脚连接到 Result 节点上的 Can Enter Transition 引脚的输入引脚上。

    IsRunningtoResult.png

    角色停止移动时,状态机应从 奔跑(Run) 状态过渡到 空闲(Idle) 状态。

  5. 返回 Arms State Machine 图表,并从 奔跑(Run) 状态拖出一条引线连接到 空闲(Idle) 状态。

    WireRuntoIdle.png

  6. 双击该过渡进行编辑。

  7. 按住Control键的同时点击 我的蓝图(My Blueprint) 选项卡中的 IsRunning ,拖到图表中,创建一个 Get Is Running 节点。

  8. Get Is Running 节点上的输出布尔引脚拖出引线,创建一个 Not Boolean 节点。

  9. Not Boolean 节点的输出引脚连接到 Result 节点上的 Can Enter Transition 引脚的输入引脚上。

    IsNotRunningtoResult.png

4.4.2 - 添加空闲到跳跃开始的过渡

在这一步中,你将设置从空闲到跳跃开始的状态过渡。

  1. 返回 Arms State Machine 图表,并从 空闲(Idle) 状态拖出一条引线,连接到 跳跃开始(JumpStart) 状态。

    IdletoJumpStart.png

  2. 双击该过渡进行编辑。

  3. 按住Control键的同时点击 我的蓝图(My Blueprint) 选项卡中的 IsFalling ,拖到图表中,创建一个 Get Is Falling 节点。

  4. Get Is Running 节点的输出布尔引脚连接到 Result 节点上的 Can Enter Transition 输入布尔引脚。

    IsFallingtoResult.png

4.4.3 - 添加奔跑到跳跃开始的过渡

在这一步中,你将设置从奔跑到跳跃开始的过渡。

  1. 返回 Arms State Machine 图表,并从 奔跑(Run) 状态拖出一条引线,连接到 跳跃开始(JumpStart) 状态。

    RuntoJumpStart.png

  2. 双击该过渡进行编辑。

  3. 按住Control键的同时点击 我的蓝图(My Blueprint) 选项卡中的 IsFalling ,拖到图表中,创建一个 Get Is Falling 节点。

  4. Get Is Running 节点的输出布尔引脚连接到 Result 节点上的 Can Enter Transition 输入布尔引脚。

    IsFallingtoResult.png

4.4.4 - 添加跳跃开始到跳跃循环的过渡

在这一步中,你将设置从跳跃开始到跳跃循环的过渡。

  1. 返回 Arms State Machine 图表,并从 跳跃开始(JumpStart) 状态拖出一条引线,连接到 跳跃环路(JumpLoop) 状态。

    JumpStarttoJumpLoop.png

  2. 双击该过渡进行编辑。

  3. 在图表中点击右键,搜索并选择 TimeRemaining for 'FPP_JumpStart' 节点。

  4. Time Remaining 输出引脚连出引线,使用 上下文菜单(Context Menu) 添加一个 <= (float) 节点。

  5. <= (float) 节点的另一个输出字段中输入0.1,然后从该节点的布尔输出引脚拖出一条引线,连接到 Result 节点的 Can Enter Transition 输入引脚。

    TimeRemaining.png

4.4.5 - 添加跳跃循环到跳跃结束的过渡

在这一步中,你将设置从跳跃循环到跳跃结束的过渡。

  1. 返回 Arms State Machine 图表,并从 跳跃环路(JumpLoop) 状态拖出一条引线,连接到 跳跃结束(JumpEnd) 状态。

    JumpLooptoJumpEnd.png

  2. 双击该过渡进行编辑。

  3. 按住Control键的同时点击 我的蓝图(My Blueprint) 选项卡中的 IsFalling ,拖到图表中,创建一个 Get Is Falling 节点。

  4. Get Is Falling 节点上的输出布尔引脚连出引线,创建一个 Not Boolean 节点。

  5. Not Boolean 节点的输出引脚连接到 Result 节点上的 Can Enter Transition 引脚的输入引脚上。

    IsNotFalling.png

4.4.6 - 添加跳跃结束到空闲的过渡

在这一步中,你将设置从跳跃结束到空闲状态的过渡。

  1. 返回 Arms State Machine 图表,并从 跳跃结束(JumpEnd) 状态拖出一条引线,连接到 空闲(Idle) 状态。

    JumpEndtoIdle.png

  2. 双击该过渡进行编辑。

  3. 在图表中点击右键,搜索并选择 TimeRemaining for 'FPP_JumpEnd' 节点。

  4. Time Remaining 输出引脚连出引线,使用 上下文菜单(Context Menu) 添加一个 <= (float) 节点。

  5. <= (float) 节点的另一个输出字段中输入0.1,然后从该节点的布尔输出引脚拖出一条引线,连接到 Result 节点的 Can Enter Transition 输入引脚。

    TimeRemaining.png

4.5 - 关联动画蓝图和角色蓝图

这是本教程的最后一部分,在这一步,你将把创建好的动画蓝图与你的角色蓝图关联起来。

  1. 编译并保存 Arms_AnimBP 动画蓝图,然后关闭蓝图。

  2. 转到 内容浏览器(Content Browser) 中的 蓝图(Blueprints) 文件夹,打开 BP_FPSCharacter 蓝图。

  3. 组件(Components) 选项卡中选择 FPSMesh

    LocateFPSMesh.png

  4. FPSMesh 动画类(Anim Class) 设置为你刚创建的 Arms_AnimBP 动画蓝图。

  5. 默认(Defaults) 模式下运行时,将 FPSMesh 位置(Location) 变换属性设为{50, -15, -150}, 旋转(Rotation) 变换属性设为{0, 25, 350}。

  6. 编译并保存该蓝图,然后关闭蓝图。

  7. 点击 关卡编辑器工具栏 中的 运行(Play) 按钮。

    FinalGif.gif

    动画状态机将不同动画组合在一起,当你的手臂在这些动画间过渡时,将呈现出动画效果。

恭喜!你已经学会了如何:

✓ 建立新项目
✓ 添加角色
✓ 实现抛射物
✓ 为角色添加动画

你已完成了C++第一人称射击游戏教程!

欢迎帮助改进虚幻引擎文档!请告诉我们该如何更好地为您服务。
填写问卷调查
取消