Skip to content

简介

使用状态机创建基于逻辑的分支动画。

状态机基础

状态机(StateMachine)的基本思想是使角色在某一给定时刻进行一个特定的动作。动作类型可因游戏类型的不同而不同,常用的动作包括空闲、行走、跑步、跳跃等,其中每一个动作被称为一种 状态节点(State)。在某种意义上,角色处于行走、空闲或者其它的状态节点中。一般来说,角色从一个状态立即切换到另一个状态是需要一定的限制条件的。比如角色只能从跑步状态切换到跑跳状态,而不能直接由静止状态切换到跑跳状态。角色从出发状态节点进入目标状态节点的连接关系被称为 过渡连线(Transition)。状态集合、状态过渡条件以及记录当前状态的变量放在一起,形成了一个状态机。

![Animator Controller (30).png](https://editordocs.blockmango.com/res/image/book188/ver326/zh-CN/Animation_Controller/Animator Controller (30)-aaqlhjgqdi.png)

状态机作用

状态机 对于动画的重要意义在于用户可以通过很少的代码对状态机进行设计和升级。每一个状态有一个与之关联的运动,只要状态机处于此状态,就会播放此运动。从而让动画师或设计师方便地定义动作顺序,而不必去关心底层代码的实现。

状态机基础操作

  • 选中:使用鼠标左键,可以点击选取指向的 状态节点 或 过渡连线。

状态机001.gif

  • 框选:长按鼠标左键并拖动鼠标,可以拉出多选框,选中框中的 状态节点 或 过渡连线。

状态机002.gif

  • 移动窗口:长按鼠标右键或中键并拖动鼠标,可以移动状态机窗口。

状态机003.gif

  • 缩放窗口:滚动鼠标滚轮或类似功能可放大和缩小状态机窗口。

状态机004.gif

预制状态节点

新建的 动画层(Layer)其状态机会包括以下预设状态节点:

名称图标描述
入口节点(Entry)![Animator Controller (35).png](https://editordocs.blockmango.com/res/image/book188/ver326/zh-CN/Animation_Controller/Animator Controller (35)-ubqkoqwtgs.png)所有状态机都始于入口节点,如果从其他状态机过渡到该状态机,首先运行入口节点。

入口节点是无法被删除和创建的状态节点,只能它过渡到其他状态节点,任何状态节点都不能过渡到它。 | | 出口节点(Exit) | ![Animator Controller (36).png](https://editordocs.blockmango.com/res/image/book188/ver326/zh-CN/Animation_Controller/Animator Controller (36)-vmepnwbjee.png) | 出口节点用于指示逻辑退出该状态机流程。流程运行至此后,将返回父级状态机,如没有父级状态机,将重新从该状态机的 入口节点 运行。 | | 任意状态节点(Any State) | ![Animator Controller (37).png](https://editordocs.blockmango.com/res/image/book188/ver326/zh-CN/Animation_Controller/Animator Controller (37)-jpvgvmzbtg.png) | 任意状态节点(Any State)用于建立有一个在任何状态规则之上的状态流程。即无论当前处于哪个状态,都将立即从任意的状态过渡到它后续的状态流程。

任意状态节点是一个一直在运行且无法被删除和创建的状态节点,只能它过渡到其他状态节点,任何状态节点都不能过渡到它。
--------------
比如说您希望角色只要达成死亡条件,将立即播放死亡动作,无论角色在 奔跑、跳跃或者攻击,此时设置 任意状态节点 符合死亡条件即过渡到 死亡(Death) 状态节点。
状态机001.png
-------------- |

状态节点

状态节点(State)是状态机中按特定结构组织的基本构建块,它们之间通常可以相互过渡。每个状态节点自身包含一个 Clip(动画剪辑)或 SequenceClip(精灵序列)。状态节点最终只会生成一种最终动画或姿势,以对应该状态,并在角色处于该状态节点时播放。

创建状态节点

状态节点可以按以下方式创建:

  • 右键点击状态机窗口,然后选择 Create State(创建状态) 。

![Animator Controller (39).png](https://editordocs.blockmango.com/res/image/book188/ver326/zh-CN/Animation_Controller/Animator Controller (39)-xnzkglvvjy.png)

  • 点击 状态节点(或 入口节点)的边框并拖出,然后松开鼠标,并选择 Create State(创建状态节点) 。这将用于创建带有过渡连线指向的目标状态节点。

![Animator Controller (40).png](https://editordocs.blockmango.com/res/image/book188/ver326/zh-CN/Animation_Controller/Animator Controller (40)-pkstisntdj.png)

  • 将 Clip(动画剪辑)或 SequenceClip(精灵序列)从 资产浏览器(Asset Browser)拖入状态机窗口中。这还会将动画添加到状态节点中,并状态直接以 动画片段的名字命名。

![Animator Controller (41).png](https://editordocs.blockmango.com/res/image/book188/ver326/zh-CN/Animation_Controller/Animator Controller (41)-seucbrqijt.png)

默认状态

默认状态(Default State) 是状态机首次激活时所处的 状态节点。首个新建的任意 状态节点,会自动设置为 默认状态。在最常见的角色行为状态机中,默认状态一般是角色空闲(Idle)状态。

状态机运行时,将无条件流转至设置为 默认状态 的 状态节点。

![Animator Controller (42).png](https://editordocs.blockmango.com/res/image/book188/ver326/zh-CN/Animation_Controller/Animator Controller (42)-vbhwxvvehw.png)

如您需要更改默认状态,您可以通过右键单击想要修改为默认状态的状态节点,后选择 Set as Layer Default State(设置为动画层默认状态) 来更改 默认状态。

![Animator Controller (43).png](https://editordocs.blockmango.com/res/image/book188/ver326/zh-CN/Animation_Controller/Animator Controller (43)-lsyebmxubn.png)

因为 状态机 始终具有 默认状态 节点,所以始终会有从入口节点过渡到 默认状态 节点的默认过渡连线。

状态机005.gif

状态节点基础操作

  • 选中:使用鼠标左键,可以点击选取指向的 状态节点 。

状态机006.gif

  • 移动:要移动 状态节点,请将鼠标移至 状态节点 中间位置,鼠标显示为 ✥ 时,长按鼠标左键并拖动鼠标。

状态机007.gif

  • 右键:请将鼠标移至 状态节点 位置,点击鼠标右键,即可对 状态节点 进行基本操作(断开所有过渡、设置为默认状态、复制、复制并粘贴、剪切、删除操作)。

![Animator Controller (48).png](https://editordocs.blockmango.com/res/image/book188/ver326/zh-CN/Animation_Controller/Animator Controller (48)-jmifcluths.png)

状态属性

当 状态节点 在状态机中被选中时,检视窗口(Inspector)中可查看和编辑该 状态节点 的以下属性。

状态节点000.png

名称描述
名称(Name)所选状态的名称。
动画剪辑(Animation Clip)分配给此状态的动画片段,可从 资产浏览器(AssetBrowser)将动画片段拖入,或点击打开列表选择动画片段。
播放速度(Speed)此状态节点的默认运动速度倍率。启用参数以使用脚本中的自定义值修改速度。默认值为1,设置为负值时可倒放动画。
循环播放(Loop)运行该状态节点时播放动画片段并在到达结尾时重新开始循环播放。

![Animator Controller 用户手册编辑反馈12005.png](https://editordocs.blockmango.com/res/image/book188/ver326/zh-CN/Animator_Ik/Animator Controller 用户手册编辑反馈12005-nabldecbqq.png) 不勾选:状态机运行时,如过渡条件未被满足,动画片段在播放一次后会停在最后一帧。

![Animator Controller 用户手册编辑反馈11923.png](https://editordocs.blockmango.com/res/image/book188/ver326/zh-CN/Animator_Ik/Animator Controller 用户手册编辑反馈11923-edfysrdqto.png) 勾选:状态机运行时,如过渡条件未被满足,动画片段会循环播放。 |

如果选中的 状态节点 建立了指向其他 状态节点 的过渡,则会在 Transitions(过渡列表) 属性列中显示对应的 过渡连线 和其属性设置。过渡连线 属性的定义和使用方法,请查阅 过渡规则 小节。

状态节点001.png

状态过渡

如果要控制状态节点如何过渡到另一状态节点 ,您需要创建 过渡连线(Transition),它展示了状态节点之间的连接关系,帮助定义了 状态机 的结构。过渡连线 不仅定义 状态节点 之间的混合应该耗费多长时间,而且还定义它们应该在什么条件下激活。您可以设置仅在特定条件成立时才发生过渡。要设置这些条件,请在 过渡参数(Parameters) 窗口中指定参数值。

状态机010.png

创建过渡

要创建 过渡连线(Transition),请选中一个 状态节点 (出发状态节点)边框并拖动到另一个 状态节点(目标状态节点)。

在本示例中, 空闲(Idle)状态 与 奔跑(Run)状态 双向连接。单个 过渡连线 只是单向的,所以,如果两个状态节点要来回过渡,您需要从另一个方向再创建一个过渡连线。

状态机011.gif

从 出发状态 到 目标状态,支持同时存在多个同向过渡,当同向过渡数量大于或等于 2 时,这些过渡会共用一条连线,连线末端会同时显示三个箭头。

状态机012.gif

各个同向过渡的 过渡图表、过渡属性 和 过渡条件 相互独立,虽然他们共用同一套过渡连线的箭头和图标。这用于制作两个状态节点间不同条件下采取不同过渡方式。

过渡连线基础操作

  • 选中:使用鼠标左键,点击 过渡连线 的箭头或图标可以选取指向的 过渡连线。

![Animator Controller (54).png](https://editordocs.blockmango.com/res/image/book188/ver326/zh-CN/Animation_Controller_Window/Animator Controller (54)-lcjlnxskni.png)

  • 删除:请将鼠标移至 过渡连线 的箭头或图标,点击鼠标右键,即可对 过渡连线 进行删除操作。

![Animator Controller (55).png](https://editordocs.blockmango.com/res/image/book188/ver326/zh-CN/Animation_Controller_Window/Animator Controller (55)-gnfvmfhvlq.png)

需要了解过渡连线属性和过渡规则,请查阅 过渡规则 章节