状态机

状态机允许骨骼动画拆分成若干种状态,允许你控制不同动画状态之间的过渡方式。

Choose your operating system:

Windows

macOS

Linux

参见

Overview

动画 状态机(State Machines) 允许你以更模块化的方式理解动画蓝图。 用户可为角色(骨架网格体)设置多种状态。 此外,用户还可定义角色(骨架网格体)进入和退出每种状态的时机,这点与流程图相似。

例如,你为角色定义的动画流程图可能如下所示:

AnimationFlowChart.png

如需为以上流程设置状态机,最终效果与下图类似:

StateMachine.png

剖析状态机

状态机主要由状态网络和状态转换规则构成。每种状态(包括状态规则)本身也是一种蓝图 网络。 状态机使你可以实现复杂的动画混合效果,同时避免 动画状态机(AnimGraph) 变得过于复杂。

状态

从概念上而言,理解状态的最佳方式是将其视为 AnimGraph 的一个组成部分。角色和骨架网格体将定期混入混出此状态。然后即可转入转出图表的该部分。例如,角色动画拥有"待机(Idle)"状态,而该状态可能只包含单个动画。

下图便是状态机中的显示的"待机(Idle)"状态。

State.png

双击 状态打开图表,可在此定义 最终动画姿势(Final Animation Pose) 中的内容。

IdleStateInside.png

角色开始移动后,即会转入运动状态 — 定义表面上的横向移动,如行走和奔跑。

MoveState.png

此状态中可能包含一个由角色速度和移动方向定义的 混合空间

MovementInside.png

状态自身不带引脚,也没有输入的引脚,它们可以拥有更自由的布局形式。

从其外部边界拖动引线即可连接状态或创建新状态(与蓝图相似)。

DragWire.png

转换规则

定义状态后,需要控制骨架网格体如何从一个状态转换到另一个状态,这便是需要用到 转换规则。转换规则沿连接状态的引线自动创建。

TransitionRule.png

转换规则可对变量值执行任意数量的检查和测试,目的是输出一个 True/False 值。此布尔输出决定动画是否能通过转换。

TransitionRuleInside.png

上图中正在对角色的速度值进行测试。数值大于 10 后便会开启转换。在此例中,角色将从待机状态进入移动状态。然后使用完全独立的规则转换回待机状态。

例如,此处有一个从移动回到待机的转换规则。

TransitionRuleReturn.png

将进行检查,确定用于转换到移动状态的相同数值是否已不为 true。

TransitionRuleReturnInside.png

导线

导线(Conduit) 是更高级的共享转换资源。转换规则只是从一个状态到另一个状态的简单 1 对 1 关系,而导线可以是 1 对多、多对 1,或多对多关系。图表中的导线和状态相似,但带导线名称的图标不同(如下图)。

ConduitNode.png

导线的使用范例之一 — 角色死亡时播放多个动画。

从简单的转换规则开始,体力值小于等于零时角色进入死亡状态。然而,如果转换未进入状态而进入导线,即可执行一系列检查,确认角色的死亡方式(枪击、穿刺、爆炸、车撞、重物击头等)并分开进入诸多单独的死亡状态。

简单版本的图表与下图相似:

ConduitGraph.png

导线图表的内部和转换规则相似:

ConduitInside.png

从导线退出的实际转换规则即可决定死亡的类型并混合到适当的状态。

鼠标悬停预览

状态机的功能之一是通过鼠标悬停查看状态机自身和其组件节点的预览。如在状态机上悬停鼠标,将弹出预览窗口,显示状态机的高级视图。这与重叠蓝图网络相似。

StateMachineHoverPreview.png

也可预览状态机中的诸多状态和转换规则。在它们上方悬停鼠标即可预览其中内容。

IdleStatePreview.png

预览转换规则时不但可以预览节点,还可查看规则的文字说明。

TransitionRulePreview.png

创建状态机

在创建状态机之前,最好花一点时间来精确规划所需要的各个状态,还有驱动状态切换的不同场景。这样会让你更有计划地设计状态机以及所需要的变量和动画。

可以在 动画蓝图编辑器(Animation Blueprint Editor)动画图表(AnimGraph) 中创建 新状态机(New State Machine)

  1. 动画蓝图的动画图表中 右键点击 然后在菜单中选择 状态机(State Machines) > 新建状态机(New State Machine)

    CreateNewStateMachine.png

    通常建议在创建好状态机后立马将其命名。

  2. 我的蓝图(My Blueprint) 窗口中 右键点击 新建的状态机,并在名称区域将其命名。

    RenameStateMachine.png

    在这个示例中,状态机被命名为 "Locomotion"。

    LocomotionSMNode.png

  3. 双击 状态机来打开并定义其状态和转换。

    StateMachineEntryPoint.png

    这样会打开一个新的图表选项卡,其中只有一个This will open a new graph tab with nothing but an Entry point, which essentially kicks off the animation.

创建状态和导线

创建新状态与在蓝图中创建新的节点较为相似。

  1. 右键点击 然后在弹出的菜单中创建状态。

    AddState_CM.png

    也可以将引线拖出至图表的空白区域并释放鼠标,同样会弹出菜单。

    AddStateDragWire.png

  2. 在图表中 右键点击 节点便可以进行命名。

    StateDefault.png

    上图中创建了新的状态,而下图中将其命名为了 Idle

    StateRenamed.png

  3. 导线可以通过同样的方式创建,在图表中 右键点击 或者将引线拖至图表的空白区域。

    CreateConduit.png

创建转换规则

转换规则会沿着连接状态和导线的引线自动创建。从图形上看,转换规则显示为循环方向小图标,如下图所示:

NewTransitionRule.png

这意味着,通过拖出引线到图表空位置来创建状态或导线时,将自动针对该引线创建转换规则。此外,您可以将引线拖回到原始节点,创建表示转换回到该节点的第二个转换规则。

CreateTransition.png

您可以在转换规则上 双击 以打开新图表,允许您定义转换的成功或失败条件。

TranstionRule.png

在上图中,如果布尔值 IsSecondaryAttacking?True,则会发生到新状态的转换。

Editing State Machines

虽然状态机可以方便地分解骨骼网格体中的动画转换流,但是状态机最重要的是表示状态机每个节点中实际发生的事件。考虑到这一点,我们需要记住状态机每个节点类型的主要功能:

节点

功能

状态(State)

输出姿势或者动画结果。

转换规则(Transition Rule)

控制动画是否会从一种状态转换到另一种状态。使用布尔值确定是否发生转换。

导线(Conduit)

也用于控制动画流,但能够在许多不同状态之间共享转换原因。使用布尔值确定是否发生转换。

记住上述信息可便于确定在状态机的每个部分中放置哪种类型的节点。

编辑状态

状态的作用是产生最终动画或姿势。这可以是单个动画序列混合空间或任意类型的网络,只要产生的是最终动画或姿势即可。

PlayAnimSequence.png

在上图中,一个动画序列产生最终动画姿势。

PlayBlendSpace.png

在上图中,使用了一个混合空间来根据速度值混合不同姿势。

PlayBlendAnimation.png

在上图中,根据布尔值"是否在空中"(Is In Air)的值选择不同的动画序列。

添加动画元素

要在状态图表中添加动画序列或混合空间,您可以将其从 资源浏览器(Asset Browser) 拖放到 动画蓝图编辑器(Animation Blueprint Editor)

DragDropAnimSeqState.png

或者使用 右键点击 快捷菜单并选择动画:

ContextMenuAnimSeqState.png

自动状态创建

要在状态机中自动创建状态,将动画序列或混合空间资源拖到图表中。

AutoStateCreationDrag.png

拖放过去后,会自动创建状态,并根据资源为状态命名。

AutoStateCreation.png

在内部,您会看到动画资源已经自动连接到最终动画姿势结果。

AutoStateCreationInside.png

额外资源

以下可以找到关于虚幻引擎状态机功能的额外资源。

本文基于此前的虚幻引擎版本编写,未针对当前的虚幻引擎5.0版本更新过。