[外文翻译] Animator- Interruption Source用法

通常情况下,动画状态机(State Machine) 在 动画过渡(Transition) 时是无法被打断的,一旦你开始从一个 动画节点(State) 过渡到另一个 State 时,你无法中断这种行为。就好比一个乘客乘坐在一部已经离开地面的飞机上,你能做的只是好好享受这次旅途直到抵达终点,你却无法改变这次飞行航线。在大多数情况下,都是如此。

但是,如果你需要对动画过渡拥有更多的控制权,unity 的 State Machine 给你提供了一些方法来实现。当你的飞机已经起飞,你对旅途的终点并不满意,你可以选择坐在飞行员的位置中途改变航线。这意味着State 与 State之间有更多的可能性,同样的,也增加了State Machine 的复杂性。

首先,让我们看几个简单的例子,先从一个简单的State Machine开始,它拥有4个 State,分别是 A, B, C, D 以及相对应的 触发行为(Triggers) 连结状态机上的每个State(每一个箭头代表一种Transition,对应一种触发行为)。


添加一些动画状态以及一些动画过渡
一般情况下,当我们从State A 向 State B (A->B) 进行 Transition 时,我们的动画状态机State Machine 在这个过渡过程中是不会发生任何改变的,直到它抵达到State B。但是如果我们选中这个过渡线段(A与B之间的白色箭头线段),我们可以从检视面板中看到有一个 Interruption Source 的选项,我们将其状态从 None 改成 Current State,此时这个过渡动作才会被“某些”在触发行为打断(如下图):

动画过渡的检视面板
为什么说是某些?因其下方的 Ordered Interruption 单选框为勾选状态,这个选项意味着只有在当前State(State A)上拥有更高优先级的 Transition 才可以打断 A->B 这个过渡动作。(如下图):
除了本身A->B之外,A->C的优先级要高于 A->D,

A 动画状态节点上的过渡动作及其优先级
那么,即使我们触发了A ->B的 Transition,又立刻去触发 A->D的过渡动作,我们的整个过程是不会被打断的。然而,当我们触发的不是 A->D 而是 A->C,则 State Machine 会立刻打断A->B 的Transition, 执行 A->C 的 Transition。

而在动画系统内部,它会记住被打断的位置(X),并且将该位置(X)的动画与新Transition(A->C)终点(C)的动画进行融合过渡,如下图(X->C)。

被打断点X到C动作融合
在一个游戏中,经常会遇到动作被打断的情况,动画机便会快速的在这些被打断出与新的Transition 终点进行模拟融合以至于整个State Machine看起来更流畅。

如果我们不勾选 Ordered Interruption 单选框,那么情况会变得更加简单, A->C 和 A->D 都可以打断A->B这个Transition。当然,如果 A->C 和 A->D 的 Transition 同时被触发,那么 A->C 会成为打断者,因为它在Current State (State A)上拥有更高的优先级。

如果我们将 Interruption Source 改成 Next State, 那么 A->C 和 A->D 将无法打断这个过渡。但是,此时当我们在 A->B 过程中去触发 B->D,State Machine 将会立刻开始 A->D 的过渡,并且整个过程不需要完成 A->B 的Transition。

这种过渡模式同样适用于State B到其他的State,当然,同样的,B->D和B->C的过渡同时发生,那么优先采用优先级更高的(B->D)如下图,即发生A->D的过渡。

B 动画状态节点上的过渡动作及其优先级
最后,我们可以通过设置 Interruption Source 成 Current State Then Next State 或者 Next State Then Current State 来决定哪个动画State上的过渡节点优先权更高,前者表示先看当前State的优先级如果没有被触发,再看下一个State的优先级,后者则相反,来达到不同的融合与打断效果。

大家如果有不太清楚的地方,也可以自己新建一个工程,新建一个Animator以及一些Clip来测试效果。

以上便是StateMachine中Interruption Source的主要用法,希望对大家有帮助,大家也可以进行一些测试,如果有翻译的不恰当的,可以留言交流,谢谢。

  • 沙发 K-GAP
  • 2018-12-7 15:32:19
Animator- Interruption Source用法
66666666666

多谢分享!                     
这片风儿吹过
可以可以 基础知识是很重要的!
  • 9# hxq
  • 2019-3-9 22:14:11
学习学习!!!!!
我在做一个类似CF的FPS,里面的步枪单发和扫射起来有不同的动画.这正是我需要的!