Unity中animator的layer和weight关系

区别于网络上其他文章,此文讨论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层使用到的那个零件是不会动的!所以这里我延时一帧将所有层的动画设为空动画状态,再去播放目标动画。一定延迟一帧,否则前面的设置播完状态和初始状态的代码会无效。

特此记录备用。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值