记一次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 = , 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状态快速切换问题的解决的更多相关文章
- Animator状态快速切换问题
[Animator状态快速切换问题] 事情是这样的,我尝试在一帧内多次切换一些状态(当前状态为Idle的情况下): public Animator animator; void OnEnable() ...
- Helium文档13-WebUI自动化-helium快速切换到selenium状态并调用其方法
前言 前面说过helium是对Selenium 进行了封装,那么我们如何使用selenium的方法呢,通过下面的介绍,我们能够清楚在helium中能够使用selenium的任何方法 入参介绍 def ...
- 多项目并行开发如何做到快速切换——sublime Text3
sublime text有一个很人性化的功能,就是打开窗口的时候,它会把上一次关闭时的编辑器工作区状态完全复原(不论文件是否已经保存). 只有一个项目的时候,这个功能非常方便,可以保证重启电脑后cod ...
- 关于微信聊天与朋友圈如何快速切换 Mark
用微信时,你是否遇到这样的情况.你正刷着朋友圈,享受着各种鸡汤,这时候,你收到一条微信,一看是女王大人,不得不回.你诚恳的回了一条,等了二十秒不见有什么回应,于是就退了出来,进入朋友圈找到那篇没看完的 ...
- 快速切换天财商龙门店后台.VB6.0
名称:快速切换天财商龙门店后台 作者:landv 时间:2015年8月21日 功能:快速切换天财商龙门店后台 环境:VB6.0 注:懒的一行一行修改文件了,直接覆盖配置文件,Tcgem.ini 只能反 ...
- GoldenGate 传统抽取进程随 DataGuard 主备快速切换的方案(ADG 模式)
环境描述: 1.节点描述 节点 IP 节点描述 11.6.76.221 GG 抽取端 / DG 节点,数据库版本号为 Oracle-11.2.0.3,与 11.6.76.222 组成 DataGuar ...
- EasyPlayer RTSP Android安卓播放器实现视频源快速切换
EasyPlayer现在支持多视频源快速切换了,我们介绍一下是如何实现的. 这个需求通常应用在一个客户端需要查看多个视频源的情况,比如多个监控场景轮播. 由于EasyPlayer的播放端已经放在Fra ...
- Java线程状态及切换
Java线程状态及切换 一.什么是Java线程状态 在Java程序中,用于描述Java线程的六种状态: 新建(NEW):当前线程,刚刚新建出来,尚未启动. 运行(RUNNABLE):当前线程,处于竞争 ...
- mac平台多个php版本快速切换
mac平台多个php版本快速切换 要求所有php版本都是由brew安装 使用brew安装php多版本方法 # brew install php56 # brew install php70 安装切换工 ...
随机推荐
- 王立平--include在Android中的应用
一个布局中包括还有一个布局 1.在layout下定义activity_other.xml布局 2.代码中的包括例如以下: <LinearLayout xmlns:android="ht ...
- 解决/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found错误的解决
原因是没有GLIBCXX_3..15版本,或是更高的版本. 一.查看并下载 32位系统: [root@localhost ~]# strings /usr/lib/libstdc++.so. | gr ...
- 解决 只能通过chrome网上应用商店安装该程序
第一种方法: 右击 Chrome 桌面快捷方式,选择-”属性”-”快捷方式”,然后在”目标”一栏尾部添加参数 -enable-easy-off-store-extension-install 第二种方 ...
- Ubuntu 12.04解决重启后resolv.conf清空的问题
这跟以前用RHT系的 情况是完全不一样的: 在google上搜了一下,发现这里面还真有些奥妙: 1 /etc/resolv.conf 其实是一个Link 它其实指向的是 /run/resolvconf ...
- 在centos (linux) 搭建 eclipse c++开发分环境
网上说得很多,很烦,操作了很多,总有错误,但解决方案很简单.步骤就下面几步就OK了 安装gcc .g++ yum install gcc yum install gcc-c++ 安装jdk,配置jdk ...
- Git 清除远端已删除的分支
使用 git branch -a 命令可以查看所有本地分支和远程分支(git branch -r 可以只查看远程分支) 发现很多在远程仓库已经删除的分支在本地依然可以看到. # git branch ...
- 【LeetCode】49. Anagrams (2 solutions)
Anagrams Given an array of strings, return all groups of strings that are anagrams. Note: All inputs ...
- 微信小程序四(设置底部导航)
好了 小程序的头部标题 设置好了,我们来说说底部导航栏是如何实现的. 我们先来看个效果图 这里,我们添加了三个导航图标,因为我们有三个页面,微信小程序最多能加5个. 那他们是怎么出现怎么着色的呢?两步 ...
- Android开发学习之SQLite数据存取浅析
一.SQLite的介绍 1.SQLite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入 式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低 ...
- Python学习笔记020——数据库中的数据类型
1 数值类型 数值类型分为有符号signed和无符号unsigned两种. 1.1 整型 int (1)bigint 极大整型(8个字节) 范围 :-2**64 ~ 2**64 - 1 -922337 ...