判断动画播放结束,可以在动画片段中添加帧事件,不过有时候在动画末尾的事件会因为动画融合触发不了,【问题记录】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();
}
}