0

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

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

2 回答 2

4

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

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

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.开始动画。

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


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

于 2017-07-10T00:37:58.607 回答
-2
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 );用于查看它将返回什么并将其用作您需要为您的案例设置条件的时间。

于 2021-10-07T12:17:57.880 回答