【问题标题】:How can I check if Animator ended playing specific State animation?如何检查 Animator 是否结束播放特定状态动画?
【发布时间】:2021-06-09 09:51:26
【问题描述】:

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

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


    【解决方案1】:

    注意:只有在您的动画不循环并且我假设“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 方法中添加所有处理程序代码,如果您只想做一些简单但有点反模式的事情,这很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-05
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      相关资源
      最近更新 更多