C# 确定动画何时完成运行的最佳实践是什么?

C# 确定动画何时完成运行的最佳实践是什么?,c#,animation,unity3d,C#,Animation,Unity3d,为什么这样不行?我发现我的while循环立即退出。我的死亡动画大约需要1秒,我正在观察死亡状态在这段时间内处于活动状态,之后,它将退出到我的空闲状态。是否存在计时问题,即在死亡状态开始之前测试布尔条件 我试图找到一个动画停止运行时的直接测试 private void playerDestroyed () { int deathHash = Animator.StringToHash("PlayerDeath"); GameController.instance.pauseGame

为什么这样不行?我发现我的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策略的示例,但使用了硬编码的等待时间,这并不理想。如果我要用这个,我会想拉动画的时间,但我在通过动画师访问动画剪辑长度时遇到困难。

好的,感谢rutter提到的“游戏将等待一帧”。当我尝试访问正在运行的剪辑时,AnimationInfo[]返回对我来说是空的,这让我感到不可思议。我不认为动画师需要时间来更新它的状态后,直接调用播放动画

同样有趣的是,我尝试了相同的代码,但使用了触发器而不是处理哈希业务,下面的代码失败了。我的变量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();
    }
private void playerDestroyed()
{
//Animator对象的全局变量
_anim=GetComponent();
int hash=Animator.StringToHash(“基本层.PlayerDeath”);
_动画游戏(死亡哈希);
start例程(“WaitForAnimation”);
}
IEnumerator WaitForAnimation(){
返回新的WaitForEndOfFrame();
AnimationInfo[]s=_anim.GetCurrentAnimationClipState(0);
返回新的WaitForSeconds(s[0].clip.length);
//动画完成后,立即执行操作
GameOver();
}

动画是立即开始播放,还是等待一帧?这可能比使用线程休眠(这会锁定游戏的主线程)更容易、更安全地以线程的形式编写。如何知道它是否等待一帧?这是背景吗?我将把它写成一个协同程序(我实际上认为我的免费版Unity不允许协同程序,这就是我最初编写它的原因)。然而,我仍然在为测试的样子而挣扎,所以我找到了测试失败的原因。似乎还必须包含图层名称。您必须散列“Base Layer.PlayerDeath”才能使其工作(对于我的情况,因为动画位于基本层上)。这有点令人困惑,因为有2个哈希将成功运行所需的动画。我希望在引擎盖下,Unity不会反转散列,添加层名称,然后重新散列,以便能够选择所需的动画!我今天又试了一次,这个代码神奇地停止了工作。我想这可能需要几帧来运行动画,我不能保证。是否有方法阻止我的协同程序,直到动画开始运行?动画在
normalizedTime<1.0f
时播放。这是最好的检测方法。当
normalizedTime<1.0f
变为
false
时,动画将不再播放。也可以使用
GetCurrentAnimatorStateInfo
,它不会像
GetCurrentAnimationClipsState
那样创建垃圾。不要使用
WaitForSeconds
信任
clip.length
属性。这有时可能会被取消。请参阅
动画
动画师
API的复制完整解决方案。