Version:

第26章 动画状态机

第26章 动画状态机

介绍

Note:
本章的关卡和资源可以在 GitHub 上找到: https://github.com/AMZN-Olex/O3DEBookCode2111/tree/ch26_animation_statemachine

在第 25 章 动画简介的基础上,我们将添加一个鸡动画,以使用鸡拍打动作来庆祝进球。这将涉及在 Animation Editor 中构建状态机、定义过渡和参数作。

图 26.1.动画状态机

添加摆动动作

  1. 使用 chicken.animgraph 从 Anim Graph 组件中打开 Animation Editor。
  2. 转到 Motions Sets。
  3. 对于 MotionSet0,从 C:\O3DE\21.11.2\Gems 添加 chickenflapping.motion \NvCloth\Assets\Objects\cloth\Chicken\Motions。
  4. 保存运动集。

添加 Celebration 混合树

  1. 添加一个布尔值 (复选框) 参数并将其命名为 “Celebrating”。当该参数的值设置为 true 时,鸡会播放拍打动作来庆祝进球。
  2. 将参数的默认值设置为 false。

  1. 动画图形中只有一个混合树。将其重命名为 Playing BlendTree,以便我们可以将其与即将添加的第二个新混合树节点区分开来

  1. Create Node → Sources → Blend Tree.
  2. 重命名为 “Celebration BlendTree”.
  3. 双击 Celebration Blend Tree.
  4. Create Node → Sources → Motion.
Note:
当我们混合空闲和行走运动时,我们使用了 Blend Two 节点。但是,对于庆祝动作,我们不需要进行任何混合。我们只想让鸡玩拍打的动作。
  1. 将新运动节点重命名为 Celebration Motion。
  2. 选择运动节点后,在“属性”面板的“运动”下,从 C:\O3DE\21.11.2\Gems\NvCloth\Assets\Objects\cloth\Chick 分配拍打鸡的运动 en\Motions 的 Motions 中。
  3. 将庆祝动作的输出姿势与 FinalNode1 的输入姿势连接起来。

  1. 回到一个关卡。
  2. 左键单击并从 Playing Blend Tree 中拖动一个箭头到 Celebration Blend Tree。
Tip:
为了绘制箭头,请在远离其名称的节点边缘处单击鼠标左键。如果您将鼠标悬停在节点上并慢慢向上移动,您将看到鼠标指针会改变其外观,指示该位置何时选择节点或开始创建箭头。

图 26.2.在 Blend Trees 之间添加过渡

  1. 选择箭头。
Note:
现在,我们将添加一个条件,当一个混合树将过渡到另一个混合树时。
  1. 选择箭头后,在“属性”面板中,选择“添加条件”,然后选择“参数条件”。
  2. 使用“Select parameter(选择参数)”按钮,选择 Celebrating parameter(庆祝参数)。
  3. 对于“Test Function(测试函数)”,选择相等条件。
  4. 对于“测试值”,将值设置为 1 (1.0)。

Note:
在参数条件中,Animation Editor 将布尔值 “true” 视为值 1 (1.0)。
  1. 这将创建一个条件,当 Celebrating 参数设置为 true 时,从 “Playing Blend Tree” 过渡到 “Celebration Blend Tree”。

Note:
下一步是定义何时退出 celebration 状态并将 Celebrating 参数重置回 false。
  1. 左键单击并从 Celebration Blend Tree 拖动一个箭头到 Playing Blend Tree。
  2. 选择新箭头。
  3. 在“属性”面板中,选择“添加条件”,然后选择“状态条件”。这会将 State Condition 添加到 Attributes 面板。
  4. 在“状态”下,用户选择节点按钮以选择 Celebration Motion 节点。
  5. 对于“Test Function”(测试函数),选择“Has Reached Specified Playtime”(已达到指定的播放时间)。
  6. 对于 Play Time(播放时间),输入 2.0。
Note:
Play Time (播放时间) 的单位是秒。如果你看一下 Motions 选项卡下的 “chicken flapping” 动作,你会发现它有 2.47 秒长。但是,它在结束时有一些空闲时间,因此我选择在 Motion 结束之前过渡。

  1. 现在,在同一个 Attributes (属性) 面板中选择 Add action (添加作),箭头仍处于选中状态。

  2. 选择 Parameter Action (参数作)。

  3. 将 Trigger Mode (触发模式) 保持为 “On Enter”(输入 时)。

  4. 对于参数,选择 Celebration 参数。

  5. 对于 Trigger Value(触发值),保持 0.0。这将创建一个作,即在所选过渡发生时将 Celebration 参数值设置为零(布尔参数为 false)。

更改参数值

通过这些更改,我们现在有一个状态机,它可以在庆祝运动和空闲运动与行走运动之间的混合之间切换。

图 26.3.动画状态机

您可以通过将 Celebrating 参数设置为 enabled,然后观看鸡庆祝动作播放两秒钟,然后切换回 Player Blend Tree,同时将 Celebrating 值设置回 false,来测试此逻辑。

图 26.4.参数列表

在动画图形中保存更改后,Anim Graph 组件将更新参数列表以显示 Celebrating 布尔参数。

图 26.5.具有更新参数的 Anim Graph 组件

小结

在本章中,我们增强了动画图形以添加庆祝动作,并在 Animation Editor 中对其进行了测试。我们知道它有效,但没有游戏逻辑来触发它。我们可以像上一章一样,通过向 C++ 组件添加逻辑来实现这一点。但是,我们之前已经这样做过,因此在下一章中,我将向您展示如何使用 O3DE 中的可视化脚本 Script Canvas 来执行此作。

Note:
本章的资源可以在 GitHub 上找到,网址为: https://github.com/AMZN-Olex/O3DEBookCode2111/tree/ch26_animation_statemachine