- 动画是传达运动的关键。如果没有动画,角色看起来像是在滑动而不是奔跑
- 学习目标:
- 导入带有骨骼的网格
- 导入动画
- 创建动画蓝图以过渡到不同的动画
- 动画之间的混合
- https://koenig-media.raywenderlich.com/uploads/2017/09/SkywardMuffinStarter.zip
1.骨骼
- 在3D应用程序中,骨骼是一组相互连接的点,称为关节。
- 通过操控关节,可以为角色创造不同的姿势
-
1.导入骨骼网格

Create Physics Asset:创建物理资产
Import Materials:导入材质Import Textures: 导入纹理
**SK_Muffin**:骨骼网格资产,基本上只是一个网格连接到一个骨骼资产**SK_Muffin_Skeleton**:骨骼资产。包含一个关节列表和其他信息,比如层次结构。2.使用骨骼网格
在
Material Slots中为SK_Muffin分配M_Muffin材质。
使用
SK_Muffin作为玩家角色:打开BP_Muffin,在Details-Mesh将Skeletal Mesh设置为SK_Muffin,编译后完成。效果如下:
3.导入动画

- 在导入窗口中,转到
Mesh部分并取消选中Import Mesh选项,确保骨骼网格不会再次导入 - 确保骨骼属性设置为
SK_Muffin_Skeleton,这将指定动画将使用哪个骨骼。 
- 勾选
Import All,导入具有指定的设置的所有动画。 - 使用动画蓝图来播放所有动画。
2.动画蓝图
1.创建动画蓝图
- 动画蓝图具有专门用于动画任务的图形
- 在
内容浏览器中,单击添加新按钮,选择Animation—Animation Blueprint 
- 在弹出窗口中,选择
SK_Muffin_Skele创建动画蓝图 
将资产重命名为
ABP_Muffin,然后双击打开Animation Blueprint Editor2.动画蓝图编辑器
Animation Blueprint编辑器类似于Blueprint编辑器,但是有四个额外的面板:
**Anim Graph/动画图表**:专用于动画的图表,动画将于此处播放**Preview Scene Settings/预览场景设置**: 在此面板调整视窗的预览场景**Anim Preview Editor/动画预览编辑器**:创建的变量在此显示,使用此面板预览变量对最终动画的影响**Asset Browser/资产浏览器**:此面板包含当前框架可以使用的动画列表- 使用
State Machine/状态机定义每个动画应当何时播放
3.状态机
1.概述
State Machine:状态机主要由状态网络和定义进出状态转换的规则组成,每个状态和规则都是其自己的精简蓝图网络。这使得处理复杂的动画混合变得非常容易,而不必使用过于复杂的动画蓝图- 状态机允许将骨骼动画分解为各种状态,并完全控制混合如何从一个状态到另一个状态。状态机一次只能处于一种状态,要过渡到一种不同的状态,必须满足某些条件(由规则定义)
状态也可以有一个双向的关系,如果没有双向的关系,字符只能从空闲状态进入跳转状态。
2.创建状态机
在
**Anim Graph**,添加**Add New State Machine**,添加新的状态机。
- 该操作将向动画图表中添加一个状态机节点,将状态机重命名为
**Locomotion**。然后将**Locomotion**状态机连接到**Output Pose/输出节点** 
- 现在,
Locomotion运动机将决定物体的最终动画,双击打开它 - 连接到
Entry节点的状态是默认状态。对于本教程,默认状态是空闲动画,通过右键单击图表上的空白区域创建此状态。从菜单中选择AddState并命名为Idle。并将Entry节点和Idle状态完成相连 -
3.将动画链接到状态
双击
Idle状态打开它- 要链接动画,需要转到
Ass Browser然后拖动SK_Muffin_Idle动画,释放左键单机图表中的空白区域以添加它。 - 将
Play SK_Muffin_Idle节点连接到Output Animation Pose节点 使用动画蓝图,需要更新
BP_Muffin,编译后切换到BP_Muffin4.使用动画蓝图
在
**BP_Muffin**的**Components**面板,选择**Mesh(Inherited)**组件,找到**Animation**部分- 设置动画模式
**Use Animation Blueprint**,下一步设置动画类为**ABP_Muffin** 
- 现在骨骼网格将使用
ABP_Muffin作为它的动画蓝图 - 编译完成后,由于
Idle是默认状态,因此物体将自动使用空闲动画 
4.创建跳跃和降落状态
1.添加状态
- 返回
ABP_Muffin,然后切换回Locomotion状态机的图形 
- 与创建状态然后链接动画不同,已经链接动画的状态可以直接进行使用
- 在
**Locomotion**中添加**SK_Muffin_Jump**状态,重命名为**Jump** - 在
**Locomotion**中添加**SK_Muffin_Fall**状态,重命名为**Fall** - 将这些状态彼此链接起来,创建以下过渡:
- Idle 到 Jump
- Jump 到 Fall
- Fall 到 Jump
- Fall 到 Idle

此时已经有了转换,但需要定义何时可以发生转换。通过使用转换规则来实现这一点。
2.转换规则
这个图标代表了转换规则- 每个转换规则都包含一个带有单个布尔输入的
**Result**节点 
- 如果该输入的是True,则可能发生转换
-
3.检查玩家的运动状态
分别创建名为
**IsJumping**和**IsFalling**的布尔变量- 设置
**IsJump**的值,切换到事件图并找到事件蓝图更新动画节点,此节点的功能类似于**Event Tick**节点 
- 若要检查玩家是否正在跳跃,创建以下设置
- 检查玩家在Z轴上的速度是否大于0,如果大于 0 的话,那么
**Is Jumping**将被设置为 Ture,玩家正在跳跃。如果小于 0 的话,那么**Is Faling**将被设置为True,玩家将会下落。 -
4.定义转换规则
**Idle to Jump**规则为:
**Jump to Fall**规则为:
**Fall to Jump**规则为:
**Fall to Idle**规则为:要过渡到**Idle**状态,玩家不能处于跳跃或下降状态。因此需要使用**NOR**节点
**NOR**节点只有两个输入都为False时才会返回True
5.混合空间
- 混合空间是动画资产的一种类型,它根据输入值在不同动画之间进行插值。
-
1.创建混合空间
Add New—Animation—Blend Space 1D- 在内容浏览器中,添加混合空间1D
- 在弹出窗口中,选择
SK_Muffin_Skeleton 
- 将该资产重命名为
**BS_IdleWalk**,打开后可以看见**Blend Space Editor**,这里将添加动画 
2.向混合空间添加动画
- 更改轴值(输入)的名称,转到
**AssetDetails**面板并找到**AxisSetting**部分,并将**Horizontal Axis**—**Name**属性重命名为**Speed**。 
- 添加动画,拖动
SK_Muffin_Idle动画,并将其移动到Blend Space网格的左侧,以使其对齐0.0值 - 然后添加
SK_Muffin_Walk动画,使其对齐右侧100.0值 
- 混合空间将根据输入值混合
Idle和Walk动画,如果输入是 0 ,则只播放Idle动画,如果输入时 100,则只播放步行动画。任何介于两者之间的都是混合的
3.使用混合空间
- 关闭
BS_IdleWalk并打开ABP_Muffin,切换到Locomotion状态机 - 打开
Idle状态,删除**Play SK_Muffin_Idle**节点 - 添加
BS_IdleWalk混合空间,并将BS_IdleWalk节点连接到Output Animation Pose节点 
BS_IdleWalk将自动播放,因为它是默认状态。它的速度输入保持在0,因此它只显示Idle动画- 需要将输入速度提供给该节点。
4.获取玩家的速度
- 创建名为
Speed浮点型变量 - 向
Sequence节点添加一个新的节点,然后向其添加突出显示的节点: 
- 通过
Get Velocity—VectorLength—Set Speed节点,将不断设置Speed变量 - 切换回
Idle状态图,将Speed变量连接到BS_IdleWalk节点的Speed输入 
BS_IdleWalk将在Idle和Walk动画之间进行混合
5.死亡动画
思路:使用**Blend Poses by bool**节点,此节点可以根据输入布尔值在两个动画之间切换。



