一般在Unity中动画的表示可以用state也可以用clip,state侧重于状态机,而clip侧重于动画片段。而我们在获取中一般常用的有三个方法。
- AnimationClip an = ani.runtimeAnimatorController.animationClips[0];
//获取该animator的所有的clips,后边的下标可以获取指定索引值的clip,
下标是根据加入的前后顺序 去判断的,这个是不区分层级,不区分动画的状态 - animator.GetCurrentAnimatorClipInfo(0);
//参数是表示层级,获取当前层级播放的动画,返回一个数组,
只有在获取到的是blendtree的时候数组长度才会是>1的(blendtree中正在播放的动画有几个这个长度就是几) - ani.GetCurrentAnimatorStateInfo(0);
//参数是表示层级,返回的当前层级正在播放的动画的状态机
上边的三个方法比较容易理解,在这里我就不做过多解释了,下边给大家提一个问题,当两个动画状态机之间有连线,当这个动画播放到两个动画的融合处的时候,那此时animator.GetCurrentAnimatorClipInfo(0)获得长度是1还是2呢?如下图这种情况
我也是偶然才涉及到了这个问题,因为我想在播放stand的时候把stand到rest之间的trigger设置为true,我把是否有退出时间也勾掉了,根据上边的Debug.Log("Times")刚开始以为会输出一次,但是经过测试却发现他输出了4次,郁闷好久,但是后来经过测试,发现其实ani.GetCurrentAnimatorStateInfo(0)的这个方法在动画播放到上图椭圆中的那个状态的时候用该方法获取的还是stand这个state,而animator.GetCurrentAnimatorClipInfo(0)这个方法在获取的长度一直为1,这其中就表明了在动画播放到椭圆的区域中时,用这两种方法获取的有且只有一个state,那就是上一个state,上边我写的那个方法在我们把trigger设置为true的时候他会立马进入到椭圆部分区域,而Times输入了四次这个其实是跟他们融合部分的长度有关
此时的Times只输出了一次
这里Times输出了3次,这个大家可以去测试。
而上边的问题怎么完美解决呢?这是我写的代码在里边加了一个开关。
if (ani.GetCurrentAnimatorStateInfo(0).IsName("stand"))
{
if (!IsSetRest)
{
ani.SetTrigger("Rest");
Debug.Log("Times");
IsSetRest = true;
}
}
除了这个办法我们还可以通过另外一种方式去设置ani.GetNextAnimatorStateInfo(0),我们当前状态机后边只连了一个动画的时候用IsName(string Name),如果后边跟了多个动画我们可以用IsTag(String Tag)这两个方式来进行判断,当然这种也是有限制的,比如当前状态机运行两个动画融合的部分才可以,否则ani.GetNextAnimatorStateInfo(0)为空,所以有的时候就需要我们去判断是否把Has Exit Time勾去掉,这里就不写代码了。
这个就是写动画标签的地方。
个人只见,有些地方可能有BUG,欢迎大家指出。