首页 > 解决方案 > 如何检查 Animator 是否结束播放特定状态动画?

问题描述

这样,在播放动画状态时它一直在里面:

void Update()
    {
        if (this.animator.GetCurrentAnimatorStateInfo(0).IsName("Stand Up"))
        {
            string tt = "";
        }
    }

所以我尝试添加!检查它是否为假:

void Update()
    {
        if (!this.animator.GetCurrentAnimatorStateInfo(0).IsName("Stand Up"))
        {
            string tt = "";
        }
    }

但这样即使状态动画播放完毕,它也永远不会进入。

我在动画控制器中有一个基础层。

标签: c#unity3d

解决方案


注意:下面的解决方案只有在您的动画不循环并且我假设“StandUp”是非循环的情况下才真正相关。否则,每次动画循环时都会引发该事件。

在我看来,你最好提出一个动画事件。

您可以通过将事件标记添加到动画时间轴来从相关的特定动画中引发事件。

创建动画事件

然后,当您单击时间线顶部的事件标记时,您将在检查器中看到一些选项。

注册事件处理程序

然后,您需要为要处理此事件的事件处理程序提供一个名称,例如 MyEventRaised 并将脚本附加到具有您的动画组件的对象。

添加动画事件处理脚本

在该脚本中,您可以为事件添加所需的处理程序。

using System;

public class MySpriteEventHandlerScript:MonoBehaviour 
{
    public EventHandler MyEventHandler;

    public void MyEventRaised()
    {
        MyEventHandler?.Invoke(this, EventArgs.Empty);
    }
}

然后,在您想要响应您创建的事件的任何脚本中,您可以获取对附加到动画对象的事件处理程序脚本的引用,并使用 MyEventHandler 事件处理程序注册一些代码。

private MySpriteEventHandlerScript _MyEventHandlerScript;

void Start() 
{
    _MyEventHandlerScript = GameObject.FindGameObjectWithTag("MySprite").GetComponent<MySpriteEventHandlerScript>();
    // Register some code to do something when the handler is invoked
    _MyEventHandlerScript.MyEventHandler += TheCodeToRun;
}

// Create the necessary method in your class
private void TheCodeToRun() 
{
    Debug.Log("The animation event has happened!");
}

或者,您可以在 MyEventRaised 方法中添加所有处理程序代码,如果您只想做一些简单但有点反模式的事情,这很好。


推荐阅读