检查动画状态时间 - 为什么不起作用?

Check animation state time - why doesn't work?

我需要在当前动画(动画师中的状态)完成后禁用对象。
为什么它不起作用?

if (myObject.GetComponent<Animator().GetCurrentAnimatorStateInfo(1).normalizedTime == 1) {
myObject.SetActive(false);
}

normalizedTime == 1那样直接比较float不是个好主意。只需使用 <>=。您也可以使用 Mathf.Approximately.

无论如何,当您启动动画时,启动一个协程函数来检查该动画是否已完成。这可以防止在 Update 函数中浪费时间来检查动画何时完成。该协程函数应该有一个参数来检查动画的名称。

IEnumerator OnAnimationComplete(string name)
{
    Animator anim = myObject.GetComponent<Animator>();

    while (anim.GetCurrentAnimatorStateInfo(0).IsName(name) && anim.GetCurrentAnimatorStateInfo(0).normalizedTime < 1.0f)
    {
        //Wait every frame until animation has finished
        yield return null;
    }
    Debug.Log("Animation has finished");
    //Do something
}

用法:

1.Start动画。

2.Start OnAnimationComplete 协程:StartCoroutine(OnAnimationComplete("JumpAnim"));


还有其他方法可以做到这一点,例如使用 AnimationEvent 事件。查看提供的 link 以获取有关此的示例。

GetCurrentAnimatorStateInfo(1).normalizedTime == 1
//GetCurrentAnimatorStateInfo(1) i used 0 insted of 1 its just diff in layer

以我为例: GetCurrentAnimatorStateInfo(0).normalizedTime - 将给你时间,因为对象在场景中是“活着的”(在其上是动画师)直到你在动画中的当前状态。 因此,如果您的对象一出现在场景中,您的动画状态就开始了,它不会是:

GetCurrentAnimatorStateInfo(1).normalizedTime == 1

但是:

GetCurrentAnimatorStateInfo(1).normalizedTime == 0.

这与动画是否播放 3 秒或播放多长时间无关,如果您使用 GetCurrentAnimatorStateInfo(1).normalizedTime 作为条件检查可能使用 Debug.Log(GetCurrentAnimatorStateInfo(1).normalizedTime ); 看看它会怎样 return 并将其用作您需要为您的情况准备条件的时间。