【Unity】监听Animator的动画播放结束/判断动画切换

判断动画播放结束,可以在动画片段中添加帧事件,不过有时候在动画末尾的事件会因为动画融合触发不了,【问题记录】Unity动画片段Animation的Events帧事件没有调用 ,还可以代码判断:

在Animator中给动画片段添加Tag,然后再Update()中判断AnimatorStateInfo

1. animatorInfo.normalizedTime获取当前动画的播放进度,animatorInfo.IsTag识别当前动画

可以直接使用animatorInfo.normalizedTime >= 1判断;不过融合的动画可能在normalizedTime>=1之前就切换到下个动画了,导致触发不了回调;Loop循环的动画在第二次循环播放后,normalizedTime的值会一直>1,导致在动画循环完第一次的时候就已经触发了回调

    AnimatorStateInfo animatorInfo;
    //标记,在normalizedTime>指定值后,保证只调用一次DoSomething()
    bool isReadyToExit;
    private void UpdateAni01()
    {
        animatorInfo = animator.GetCurrentAnimatorStateInfo(0);

        if(!isReadyToExit && animatorInfo.normalizedTime < 0.5f)
        {
            isReadyToExit = true;
        }

        if(isReadyToExit && animatorInfo.normalizedTime > 0.95f)
        {
            isReadyToExit = false;

            if(animatorInfo.IsTag("Attack"))
                Debug.LogError("attack ani end 01");

            DoSomething();
        }
    }

2. animatorInfo.shortNameHash对比两个AnimatorStateInfo,animatorInfo.IsTag识别当前动画

发现当前帧与上一帧的动画信息不一致时,判定上一帧的动画播放结束,触发回调

    AnimatorStateInfo curAnimInfo, lastAnimInfo;
    private void UpdateAni02()
    {
        curAnimInfo = animator.GetCurrentAnimatorStateInfo(0);

        if(lastAnimInfo.shortNameHash != curAnimInfo.shortNameHash)
        {
            if(lastAnimInfo.IsTag("Attack"))
                Debug.LogError("attack ani end 02");

            lastAnimInfo = curAnimInfo;

            DoSomething();
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萧然CS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值