确定动画何时完成运行的最佳做法是什么?

时间:2015-01-21 21:22:52

标签: c# animation unity3d

为什么这不起作用?我发现我的while循环立即退出。我的死亡动画大约需要1秒钟,而我正在观察死亡状态是否持续了一段时间,之后,它会退出到我的空闲状态。是否存在计时问题,我的布尔条件是在死亡状态开始之前进行测试的?

我正试图在动画停止运行时找到动画的直接测试。

private void playerDestroyed ()
{
    int deathHash = Animator.StringToHash("PlayerDeath");
    GameController.instance.pauseGame();
    _anim.Play(deathHash);
    while ( _anim.GetCurrentAnimatorStateInfo(0).nameHash == deathHash) {
        System.Threading.Thread.Sleep(100);
    }
    GameController.instance.gameOver();
}

编辑:

所以我改变了我的问题以反映我真正追求的东西:了解动画何时完成的最佳实践。我已经看到使用WaitForSeconds策略的示例,但是有时间等待硬编码,这是不理想的。如果我要使用它,我想要拉动动画的时间,但我无法通过动画师访问动画片段长度。

1 个答案:

答案 0 :(得分:0)

好的,感谢车道提到“游戏会等一帧”。当我尝试访问正在运行的剪辑时,对我来说,当我回来时,AnimationInfo []的回复是空的。在直接调用动画后,我不认为Animator需要时间来更新它的状态。

另外有趣的是,我尝试使用相同的代码,但使用触发器而不是处理哈希业务,下面的代码失败了。我的变量s的长度为零。我想,触发器需要比单帧工作更多的时间。

我想我会把它放在一起作为如何实现剪辑结束测试的答案。但是,如果有更好的方法,请告诉我!

    private void playerDestroyed ()
    {
        // a global var for the Animator object
        _anim = GetComponent<Animator>();  

        int hash = Animator.StringToHash("Base Layer.PlayerDeath");
        _anim.Play(deathHash);
        StartCoroutine("WaitForAnimation");
    }


    IEnumerator WaitForAnimation() {
        yield return new WaitForEndOfFrame();

        AnimationInfo[] s = _anim.GetCurrentAnimationClipState(0);
        yield return new WaitForSeconds( s[0].clip.length);

        //do something now, after the animation is complete
        GameOver();
    }