事情是这样的,我尝试在一帧内多次切换一些状态(当前状态为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 = , float normalizedTime = float.NegativeInfinity)
{
animator.Update(); if (animator.GetNextAnimatorStateInfo(layer).fullPathHash == )
{
animator.CrossFade(name, transitionDuration, layer, normalizedTime);
}
else
{
animator.Play(animator.GetNextAnimatorStateInfo(layer).fullPathHash, layer);
animator.Update();
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中调用,否则会死循环,如果一定要调用需要加一个标记判断

记一次Animator状态快速切换问题的解决的更多相关文章

  1. Animator状态快速切换问题

    [Animator状态快速切换问题] 事情是这样的,我尝试在一帧内多次切换一些状态(当前状态为Idle的情况下): public Animator animator; void OnEnable() ...

  2. Helium文档13-WebUI自动化-helium快速切换到selenium状态并调用其方法

    前言 前面说过helium是对Selenium 进行了封装,那么我们如何使用selenium的方法呢,通过下面的介绍,我们能够清楚在helium中能够使用selenium的任何方法 入参介绍 def ...

  3. 多项目并行开发如何做到快速切换——sublime Text3

    sublime text有一个很人性化的功能,就是打开窗口的时候,它会把上一次关闭时的编辑器工作区状态完全复原(不论文件是否已经保存). 只有一个项目的时候,这个功能非常方便,可以保证重启电脑后cod ...

  4. 关于微信聊天与朋友圈如何快速切换 Mark

    用微信时,你是否遇到这样的情况.你正刷着朋友圈,享受着各种鸡汤,这时候,你收到一条微信,一看是女王大人,不得不回.你诚恳的回了一条,等了二十秒不见有什么回应,于是就退了出来,进入朋友圈找到那篇没看完的 ...

  5. 快速切换天财商龙门店后台.VB6.0

    名称:快速切换天财商龙门店后台 作者:landv 时间:2015年8月21日 功能:快速切换天财商龙门店后台 环境:VB6.0 注:懒的一行一行修改文件了,直接覆盖配置文件,Tcgem.ini 只能反 ...

  6. GoldenGate 传统抽取进程随 DataGuard 主备快速切换的方案(ADG 模式)

    环境描述: 1.节点描述 节点 IP 节点描述 11.6.76.221 GG 抽取端 / DG 节点,数据库版本号为 Oracle-11.2.0.3,与 11.6.76.222 组成 DataGuar ...

  7. EasyPlayer RTSP Android安卓播放器实现视频源快速切换

    EasyPlayer现在支持多视频源快速切换了,我们介绍一下是如何实现的. 这个需求通常应用在一个客户端需要查看多个视频源的情况,比如多个监控场景轮播. 由于EasyPlayer的播放端已经放在Fra ...

  8. Java线程状态及切换

    Java线程状态及切换 一.什么是Java线程状态 在Java程序中,用于描述Java线程的六种状态: 新建(NEW):当前线程,刚刚新建出来,尚未启动. 运行(RUNNABLE):当前线程,处于竞争 ...

  9. mac平台多个php版本快速切换

    mac平台多个php版本快速切换 要求所有php版本都是由brew安装 使用brew安装php多版本方法 # brew install php56 # brew install php70 安装切换工 ...

随机推荐

  1. 100款免费的旅游素材(PSD)

    本地下载 素材一直都是网页设计者们大爱,不同的类型和设计总能带给人们新鲜感.今天带来的这100个免费的旅行素材,PSD格式,可以自定义色彩.一定可以带给你们非常惊喜!

  2. STL - Unorderedset - 自定义哈希函数

    1. hash工具类 hashval.hpp #ifndef _Core_HashVal_H_ #define _Core_HashVal_H_ #include <functional> ...

  3. Openfire与XMPP协议

    关于xmpp协议可以参考:http://www.jabbercn.org 什么是OpenFire Openfire 采用Java开发,开源的实时协作(RTC)服务器基于XMPP(Jabber)协议. ...

  4. jdbc详解(一)

    JDBC简介 l 数据库驱动 SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC l JDBC 全称为: Java Data Base Connectivity ...

  5. poj 3345 Bribing FIPA (树形背包dp | 输入坑)

    题目链接:  poj-3345  hdu-2415 题意 有n个国家,你要获取m个国家的支持,获取第i个国家的支持就要给cost[i]的价钱    其中有一些国家是老大和小弟的关系,也就是说,如果你获 ...

  6. hadoop safemode error

    http://www.cnblogs.com/hustcat/archive/2010/06/30/1768506.html 1.safemode bin/hadoop fs -put ./input ...

  7. Windows10关闭SearchUI.exe进程的方法

    目前唯一的方法只能通过修改Cortana目录的方法来禁止Cortana 路径:C:\Windows\SystemApps\Microsoft.Windows.Cortana_***

  8. windows 配置ftp server

  9. Openerp 7.0 附件存储位置

    我们知道对OpenERP中的每个内部对象(比如:业务伙伴,采购订单,销售订单,发货单,等等)我们都可以添加任意的附件,如图片,文档,视频等.那么这些附件在OpenERP内部是如何管理的呢? 默认情况下 ...

  10. oracle 批量更新之将一个表的数据批量更新至另一个表

      oracle 批量更新之将一个表的数据批量更新至另一个表 CreationTime--2018年7月3日17点38分 Author:Marydon Oracle 将一个表的指定字段的值更新至另一个 ...