zoukankan      html  css  js  c++  java
  • 记一次Animator状态快速切换问题的解决

    事情是这样的,我尝试在一帧内多次切换一些状态(当前状态为Idle的情况下):

    public Animator animator;
    
    
    void OnEnable()
    {
        animator.CrossFade("BeAttack1", 0.2f);
        animator.CrossFade("Idle", 0.2f);
    }

    但结果并非播放Idle,而是播放BeAttack1。

    在Animator刷新前,它所播放的是最后一次调用接口的信息,谁排在后执行谁。

    并且当一个状态处于过渡时,Animator默认这个状态还没有跳转,只有过渡完成才算跳转到另一个状态(具体看这篇:http://www.cnblogs.com/hont/p/4786462.html)

    下面这幅图说明了这个问题:

    Animation有一个动画队列可以解决这个问题,而Animator取消了动画队列。

    而用协程的话又会变得非常麻烦,于是我想到了用Animator.Update来解决:

    public static void ForceCrossFade(this Animator animator, string name, float transitionDuration, int layer = 0, float normalizedTime = float.NegativeInfinity)
    {
        animator.Update(0);
    
        if (animator.GetNextAnimatorStateInfo(layer).fullPathHash == 0)
        {
            animator.CrossFade(name, transitionDuration, layer, normalizedTime);
        }
        else
        {
            animator.Play(animator.GetNextAnimatorStateInfo(layer).fullPathHash, layer);
            animator.Update(0);
            animator.CrossFade(name, transitionDuration, layer, normalizedTime);
        }
    }

    我写了一个CrossFade的扩展,强制调用Update,如果当前没有下一个动画跳转则直接混合,如果有就强制切到跳转然后混合。

    调用测试脚本:

    void OnEnable()
    {
        animator.ForceCrossFade("BeAttack1", 0.2f);
        animator.ForceCrossFade("Idle", 0.2f);
    }

    OK,测试无误,最后又回到了Idle:

    注意:ForceCrossFade不能在SMB里的Update中调用,否则会死循环,如果一定要调用需要加一个标记判断

  • 相关阅读:
    1.Hello World
    1.Hello World
    1.Hello World
    32.IDEA新建MAVEN项目时速度缓慢
    31.最特殊的快捷键 Alt + Enter 介绍(新用户必看)
    HelloWorld
    mybatis要指定参数再数据库中的类型,类型要全大写
    递归函数,修改全局变量,高阶函数
    不定长参数
    函数返回值return,列表字典的拆包
  • 原文地址:https://www.cnblogs.com/hont/p/5196485.html
Copyright © 2011-2022 走看看