区别于网络上其他文章,此文讨论animator的layer和weight的都是非人形动画情况。
遇到一个情况,一个机器物体含有13个animation,每个animation只是机器的一个步骤。现在有一个需求,需要任意点击其中一步时候,前面步骤都是已完成状态,后面的步骤都是初始状态。然而其中有些步骤是用到同一个零件的。所以这里产生里一些问题,如何将前面的动画设为播完状态?如何将后面的动画设为初始状态?而且完成了这2个问题后,仍然遇到一个问题,就是播放当前的步骤动画时候,有部分零件没有动。下面解决这些问题。
前提:
这个animator需要创建13个layer。每个layer创建一个空动画作为默认状态,然后将animation拖进去,不连线。并且,13层是第一个步骤,1层是最后一个步骤。
一代码:
void XAnimatorOrPlay(string AnimatorName, int length)
{
for (int i = 1; i <= 13; i++)
{
XAnimator.SetLayerWeight(i, 1);
//后面的动画设为初始状态
if (i <length)
{
XAnimator.Play("X_Install_" + i, i, 0);
XAnimator.Update(0);
XAnimator.SetLayerWeight(i, 0);
}
//前面的动画设为播完状态
if (i > length)
{
XAnimator.Play("X_Install_" + i, i, 1);
}
}
m_AnimatorName = AnimatorName;
m_length = length;
StartCoroutine("ResetAnimator");
}
string m_AnimatorName;
int m_length;
IEnumerator ResetAnimator()
{
yield return new WaitForSeconds(0);
for (int i = 1; i <= 13; i++)
{
XAnimator.Play("New State", i, 0);
}
XAnimator.Play(m_AnimatorName, m_length, 0);
}
二结论:
layer层级越大,就越是在表面的。虽然权重都是1,但是表面的会覆盖下面的。例如:13层和12层都动了同一个零件,然后我们现在播放12层动画,因为上面的代码已将将13层设为播完的状态,所以这时候播放12层的动画,其中被13层使用到的那个零件是不会动的!所以这里我延时一帧将所有层的动画设为空动画状态,再去播放目标动画。一定延迟一帧,否则前面的设置播完状态和初始状态的代码会无效。
特此记录备用。