动画停止后直接调用函数 - Unity

时间:2014-03-27 04:14:34

标签: c# animation unity3d

我正在尝试使用名为Turnaround的动画来改变我的角色。我的周转动画与它应该是相反的方向,因为我在转动动画之前或期间调用了Flip()(在动画中翻转了图像)。 Turn()设置一个触发器,它将调用Turnaround动画来运行。它现在看起来几乎完美,但有一个flickr因为Flip()不会在turnAround动画之后直接发生而且永远不会发生。我需要在Turn()之后直接Flip(),但它永远不会直接及时发生,所以这种技术不能作为专业解决方案。有没有人有任何其他想法怎么做?

 void Flip()
    {
        Vector3 theScale = transform.localScale;
        theScale.x *= -1;
        transform.localScale = theScale;
    }

    void Turn()
    {
        facingRight = !facingRight;
        anim.SetTrigger("JustTurned");
    }

    IEnumerator wait()
    {
        maxSpeed = 0;
        Turn();
        //float length = anim.animation["TurnAround"].clip.length;
        yield return new WaitForSeconds(1.1f);
        Flip();
        maxSpeed = 5;
    }

我已经创建了一个镜像的新精灵表,所以我现在有2个动画(一个用于左边,一个用于右边),现在我不需要翻转世界。我发现,无论我采取什么方法,翻转世界都会导致一个框架与它应该是相反的方向。删除翻盖似乎是最好的解决方案,看起来不错。请评论你的意见。

3 个答案:

答案 0 :(得分:1)

如果您的动画是Unity动画,您可以在调用该函数的事件行中设置一个事件:

https://docs.unity3d.com/Documentation/Components/animeditor-AnimationEvents.html

在您的情况下,将事件调用放在动画的末尾。确保您的gameObject具有一个包含您要调用的函数的脚本(假设您可以从该事件调用的函数只是附加到该gameObject的所有脚本的函数)。

答案 1 :(得分:1)

我编辑了我的答案,因为感谢Unity 5,你可以准确知道动画何时结束: 在执行动画的状态中,您可以添加如下行为:

using UnityEngine;
using System.Collections;

public class uy : StateMachineBehaviour {
    // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {

    }

    // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {

    }

    // OnStateExit is called when a transition ends and the state machine finishes evaluating this state
    override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {

    }

    // OnStateMove is called right after Animator.OnAnimatorMove(). Code that processes and affects root motion should be implemented here
    override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {

    }

    // OnStateIK is called right after Animator.OnAnimatorIK(). Code that sets up animation IK (inverse kinematics) should be implemented here.
    override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {

    }
}

正如您所看到的,这种行为使我们能够了解一些事情,例如进入或离开州时。

答案 2 :(得分:0)

更改您的

yield return new WaitForSeconds(1.1f)

yield return new WaitForSeconds(animation.clip.length)

Link to Unity docs