Choose your operating system:
Windows
macOS
Linux
目的
本节旨在展示如何为你的第一人称射击游戏角色添加动画。
目标
完成教程的这一节后,你将能够:
-
为角色添加动画
-
设置事件图表
-
添加动画状态机
-
为动画添加过渡状态
-
关联动画蓝图与角色蓝图
步骤
-
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 - 为角色添加动画
这一步中,你将在游戏中添加一些动画。
导入动画
在开始之前,从以下链接下载并提取示例动画:
-
在 内容浏览器(Content Browser) 中点击右键,选择 新建文件夹(New Folder) 。
-
将此新文件夹命名为"Animations"。
-
双击打开该文件夹。
-
找到以下五个本地动画文件:
-
FPP_Idle.FBX
-
FPP_JumpEnd.FBX
-
FPP_JumpLoop.FBX
-
FPP_JumpStart.FBX
-
FPP_Run.FBX
-
-
在"Animations"文件夹中点击右键,然后点击 导入到/Game/Animations/(Import to /Game/Animations/...) 开始导入动画。
-
在弹出的的对话框中,选择 选择骨架(Select Skeleton) 标题下的 HeroFPP_Skeleton ,然后点击 全部导入(Import All) 导入所有动画。
确保在导入动画之前选择了正确的目标网格体!否则,稍后转到地图动画时可能会出现一些问题。
-
现在, 内容浏览器(Content Browser) 中的 动画(Animations) 文件夹中应该有全部五个动画。
-
点击 保存(Save) 按钮,保存已导入的文件。
创建动画蓝图
-
在内容浏览器中右键点击动画文件夹。在 创建高级资产(Create Advanced Asset) 分段里,展开 动画(Animation) 并选择 动画蓝图(Animation Blueprint) 。
-
选择 AnimInstance 作为父类,并选择 HeroFPP_Skeleton 作为目标骨架。
-
将新动画蓝图命名为"Arms_AnimBP"。
-
双击 Arms_AnimBP 打开 蓝图编辑器(Blueprint Editor) 。
添加状态机过渡变量
-
在 我的蓝图(My Blueprint) 选项卡中,点击 新增(Add New) 按钮,并选择 变量(Variable) 。
-
将该变量设置为 布尔(Boolean) (可能已经这样设置了,但最好通过 细节(Details) 面板确认一下),并将其命名为"IsRunning"。
-
在 我的蓝图(My Blueprint) 选项卡中,点击 新增(Add New) 按钮,并选择 变量(Variable) 。
-
将该变量设置为 布尔型(Boolean) ,并将其命名为"IsFalling"。
-
现在你应该有两个动画过渡变量,用于驱动动画的状态机。
-
进入下一节时,保持 Arms_AnimBP 处于打开状态。
4.2 - 设置事件图表
在这一步中,我们要编辑动画的事件图表,以确保我们的动画过渡变量在游戏运行时能够正确触发。
更新状态变量
-
打开 Arms_AnimBP (如果尚未打开)。
-
双击 我的蓝图(My Blueprint) 选项卡中的 事件图表(EventGraph) ,打开事件图表。
-
在图表中点击右键,弹出 上下文菜单(Context Menu) 。
-
在 上下文菜单(Context Menu) 的搜索字段中输入"Update",然后点击 Event Blueprint Update Animation 以添加该节点。
Event Blueprint Update Animation 节点用于在每次更新动画时更新我们的状态变量,使变量始终与游戏状态同步。
-
在图表中点击右键,弹出 上下文菜单(Context Menu) 。
-
在 上下文菜单(Context Menu) 的搜索字段中输入"Owner",然后点击 Try Get Pawn Owner 以添加该节点。
-
从输出引脚连出引线,并在 上下文菜单(Context Menu) 中选择 Cast to Character 。
-
将 Event Blueprint Update Animation 节点上的输出执行引脚关联到 Cast to Character 节点上的输入执行引脚。
-
从 As Character 输出引脚连出引线,并选择 Get Character Movement (可能需要禁用上下文相关(Context Sensitivity)以方便找到此节点)。
-
从 Character Movement 输出引脚连出引线,并选择 Get Movement Mode 。
查询角色移动
-
从 Movement Mode 输出引脚连出引线,并选择 Equal (Enum) 。
确定角色是否在下降状态
-
将 Equal (Enum) 节点上的下拉菜单值设置为 下降(Falling) .
-
按住Alt键的同时点击 我的蓝图(My Blueprint) 选项卡中的 IsFalling ,将其拖到图表中,创建一个 Set Is Falling 节点。
-
将 Cast to Character 节点的未标记输出执行引脚连接到 Set Is Falling 节点的输入执行引脚,并将 Equal (Enum) 节点的输出布尔数据引脚连接到 Set Is Falling 节点的输入布尔数据引脚。
确定角色是否在奔跑状态
-
返回 Cast To Character 节点,并从 As Character 引脚再次连出引线。这次选择 Get Velocity 节点。
-
如果角色不是站立不动,其速度向量的长度将大于零。因此,从 Return Value 向量输出引脚连出引线,并选择 Vector Length 以将该节点添加到图表。
-
从 Return Value 浮点输出引脚连出引线,并选择 > (float) 节点。
-
按住Alt键的同时点击 我的蓝图(My Blueprint) 选项卡中的 IsRunning ,将其拖到图表中,创建一个 Set Is Running 节点。
-
将 Set Is Falling 节点的输出执行引脚连接到 Set Is Running 节点的输入执行引脚,并将 > (float) 节点的输出布尔引脚连接到 Set Is Running 节点的输入布尔引脚。
-
现在你的 事件图表 应如下所示:
4.3 - 添加动画状态机
在这一步中,你将组合一个状态机,以利用你新创建的变量。
-
双击 我的蓝图(My Blueprint) 选项卡中的 AnimGraph , 打开该图表。
-
右键点击该图表,在 上下文菜单(Context Menu) 中选择 状态机(State Machines)>添加新状态机(Add New State Machine...) 。
-
右键点击 我的蓝图(My Blueprint) 选项卡中的 新状态机(New State Machine) ,将其命名为"Arms State Machine"。
-
将"Arms State Machine"节点上的输出执行引脚连接到 Final Animation Pose 节点上的 Result 输入执行引脚。
-
双击"Arms State Machine"节点,打开其图表进行编辑。
4.4 - 添加动画过渡状态
在这一步中,你将向状态图表添加五个状态,即:
-
空闲(Idle)
-
奔跑(Run)
-
跳跃开始(JumpStart)
-
跳跃结束(JumpEnd)
-
跳跃循环(JumpLoop)
-
在图表中点击右键,并从下拉菜单中选择 添加状态(Add State...) 。
-
将该状态命名为"Idle"。
-
双击该状态开始编辑。
-
在图表区域内点击右键,并在 上下文菜单(Context Menu) 中搜索"空闲(Idle)"。
-
点击 Play FPP_Idle 以插入该节点。
-
将 Play FPP_Idle 节点的输出执行引脚连接到 Output Animation Pose 节点的 Result 输入执行引脚。
对其他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)
-
-
完成以上操作后, Arms State Machine 图表应如下所示:
每种状态都应包含一个 Play 节点,该节点连接到各自的 Final Animation Pose 节点。
-
从 Entry 节点拖出引线,连接到 Idle 状态节点。
4.4.1 - 添加空闲到奔跑/奔跑到空闲的过渡
在这一步中,你将设置空闲与奔跑相互之间的过渡,以便在角色开始移动时,状态机会从 空闲(Idle) 过渡到 奔跑(Run) 。
-
从 空闲(Idle) 状态拖出引线连接到 奔跑(Run) 状态,以创建过渡。
-
双击该过渡进行编辑。
-
按住Control键的同时点击 我的蓝图(My Blueprint) 选项卡中的 IsRunning ,拖到图表中,创建一个 Get Is Running 节点。
-
将 Get Is Running 节点的输出引脚连接到 Result 节点上的 Can Enter Transition 引脚的输入引脚上。
角色停止移动时,状态机应从 奔跑(Run) 状态过渡到 空闲(Idle) 状态。
-
返回 Arms State Machine 图表,并从 奔跑(Run) 状态拖出一条引线连接到 空闲(Idle) 状态。
-
双击该过渡进行编辑。
-
按住Control键的同时点击 我的蓝图(My Blueprint) 选项卡中的 IsRunning ,拖到图表中,创建一个 Get Is Running 节点。
-
从 Get Is Running 节点上的输出布尔引脚拖出引线,创建一个 Not Boolean 节点。
-
将 Not Boolean 节点的输出引脚连接到 Result 节点上的 Can Enter Transition 引脚的输入引脚上。
4.4.2 - 添加空闲到跳跃开始的过渡
在这一步中,你将设置从空闲到跳跃开始的状态过渡。
-
返回 Arms State Machine 图表,并从 空闲(Idle) 状态拖出一条引线,连接到 跳跃开始(JumpStart) 状态。
-
双击该过渡进行编辑。
-
按住Control键的同时点击 我的蓝图(My Blueprint) 选项卡中的 IsFalling ,拖到图表中,创建一个 Get Is Falling 节点。
-
将 Get Is Running 节点的输出布尔引脚连接到 Result 节点上的 Can Enter Transition 输入布尔引脚。
4.4.3 - 添加奔跑到跳跃开始的过渡
在这一步中,你将设置从奔跑到跳跃开始的过渡。
-
返回 Arms State Machine 图表,并从 奔跑(Run) 状态拖出一条引线,连接到 跳跃开始(JumpStart) 状态。
-
双击该过渡进行编辑。
-
按住Control键的同时点击 我的蓝图(My Blueprint) 选项卡中的 IsFalling ,拖到图表中,创建一个 Get Is Falling 节点。
-
将 Get Is Running 节点的输出布尔引脚连接到 Result 节点上的 Can Enter Transition 输入布尔引脚。
4.4.4 - 添加跳跃开始到跳跃循环的过渡
在这一步中,你将设置从跳跃开始到跳跃循环的过渡。
-
返回 Arms State Machine 图表,并从 跳跃开始(JumpStart) 状态拖出一条引线,连接到 跳跃环路(JumpLoop) 状态。
-
双击该过渡进行编辑。
-
在图表中点击右键,搜索并选择 TimeRemaining for 'FPP_JumpStart' 节点。
-
从 Time Remaining 输出引脚连出引线,使用 上下文菜单(Context Menu) 添加一个
<= (float)
节点。 -
在
<= (float)
节点的另一个输出字段中输入0.1,然后从该节点的布尔输出引脚拖出一条引线,连接到 Result 节点的 Can Enter Transition 输入引脚。
4.4.5 - 添加跳跃循环到跳跃结束的过渡
在这一步中,你将设置从跳跃循环到跳跃结束的过渡。
-
返回 Arms State Machine 图表,并从 跳跃环路(JumpLoop) 状态拖出一条引线,连接到 跳跃结束(JumpEnd) 状态。
-
双击该过渡进行编辑。
-
按住Control键的同时点击 我的蓝图(My Blueprint) 选项卡中的 IsFalling ,拖到图表中,创建一个 Get Is Falling 节点。
-
从 Get Is Falling 节点上的输出布尔引脚连出引线,创建一个 Not Boolean 节点。
-
将 Not Boolean 节点的输出引脚连接到 Result 节点上的 Can Enter Transition 引脚的输入引脚上。
4.4.6 - 添加跳跃结束到空闲的过渡
在这一步中,你将设置从跳跃结束到空闲状态的过渡。
-
返回 Arms State Machine 图表,并从 跳跃结束(JumpEnd) 状态拖出一条引线,连接到 空闲(Idle) 状态。
-
双击该过渡进行编辑。
-
在图表中点击右键,搜索并选择 TimeRemaining for 'FPP_JumpEnd' 节点。
-
从 Time Remaining 输出引脚连出引线,使用 上下文菜单(Context Menu) 添加一个
<= (float)
节点。 -
在
<= (float)
节点的另一个输出字段中输入0.1,然后从该节点的布尔输出引脚拖出一条引线,连接到 Result 节点的 Can Enter Transition 输入引脚。
4.5 - 关联动画蓝图和角色蓝图
这是本教程的最后一部分,在这一步,你将把创建好的动画蓝图与你的角色蓝图关联起来。
-
编译并保存 Arms_AnimBP 动画蓝图,然后关闭蓝图。
-
转到 内容浏览器(Content Browser) 中的 蓝图(Blueprints) 文件夹,打开 BP_FPSCharacter 蓝图。
-
在 组件(Components) 选项卡中选择 FPSMesh 。
-
将 FPSMesh 的 动画类(Anim Class) 设置为你刚创建的 Arms_AnimBP 动画蓝图。
-
在 默认(Defaults) 模式下运行时,将 FPSMesh 的 位置(Location) 变换属性设为{50, -15, -150}, 旋转(Rotation) 变换属性设为{0, 25, 350}。
-
编译并保存该蓝图,然后关闭蓝图。
-
点击 关卡编辑器工具栏 中的 运行(Play) 按钮。
恭喜!你已经学会了如何:
✓ 建立新项目
✓ 添加角色
✓ 实现抛射物
✓ 为角色添加动画
你已完成了C++第一人称射击游戏教程!