Unity - HasExitTime用法
本文详细分析了AnimatorController中动画切换过渡问题,即Translation过渡及hasExitTime的问题。方法为对实际项目中的所有情况进行分类,规划逻辑图,可视化分析解决这些问题。
AnimatorController 动画机控制器
- 功能:对已有的Animation片进行逻辑连接,连接过渡方式为Translation有向线段,其切换方法包括启用hasExitTime和关闭hasExitTime
- Translation:通过设置Parameters的参数进行切换过渡,可单线上有多条件,也可单方向上有多单条件线。选中任意Translation可在Inspecter窗口看到两个动画片段和区间的窗口,及Setting参数表
- 两个动画片段含义:表示在公共时间轴(上方刻度表)上,两动画的先后顺序
- 左右标记的深蓝区间:Translation过渡时长,两动画片的过渡在此区间进行(动画的混合由Unity自动处理)
- hasExitTime:是否有退出时间。简单理解:有表示等待当前动画进行完才可进行下一个动画;无表示可以立即打断当前动画并播放下一个动画
项目实战
- 背景:存在idle、idle_2、attack_1、attack_2、attack_3动画片段,我们要实现三连击的攻击效果。我们仅关注几个attack的切换,其中
- attack_1->attack_2:关闭hasExitTime,Translation未超
- attack_2->attack_3:开启hasExitTime,Translation未超
AnimatorController:
attack_1->attack_2(左)、attack_2->attack_3(右)的Translation:
1. 关闭 has exit time
关闭has Exit Time:无退出等待时间,立即开启下一动画
- 情况一:当attack_1正常运转,在左标记前达成转行条件
- 立即开启Translation(而不是等待运行到左标记)和attack_2,三者并行运转
- 若Translation还在运行中,attack_1却先运行完,代表当前动画片attack_1运行完(代码:
(stateInfo.IsName("attack_1") && stateInfo.normalizedTime > 1)) == true
),会对逻辑上的判断造成影响,这种情况非常容易出错 - 若attack_1还在运行,Translation却先运行完,则立即停止attack_1片段。逻辑正常
- 若Translation还在运行中,attack_1却先运行完,代表当前动画片attack_1运行完(代码:
- 此后整体动画全权由attack_2运转
- 立即开启Translation(而不是等待运行到左标记)和attack_2,三者并行运转
- 情况二:当attack_1正常运转,在左边标记后(左右标记中或是右标记后)达成转换条件
- 立即开启Translation和attack_2,三者并行运转
- 若Translation还在运行中,attack_1却先运行完,代表当前动画片attack_2运行完,结果同上
- 若attack_1还在运行中,Translation却先运行完,则立即停止attack_2片段。逻辑正常
- 此后整体动画全权由attack_2运转
- 立即开启Translation和attack_2,三者并行运转
逻辑图:
项目实例图:左标前达成(先),左标后达成且Translation后完成(后)
2. 开启 has exit time
当has exit time:有退出等待时间,需等待目前动画完成到一定阶段才可切换至下一动画。过程:
- 情况一:attack_2正常运转,若在左标记前达成转换条件
- 等待attack_2中动画片进行到左标记,开启Translation过渡和attack_3动画,,三者动画并行运转
- 若Translation还在运行中,attack_2却先运行完,代表当前动画片attack_2运行完(代码:
(stateInfo.IsName("attack_1") && stateInfo.normalizedTime > 1)) == true
),会对逻辑上的判断造成影响,这种情况非常容易出错 - 若attack_2还在运行,Translation却先运行完,则立即停止attack_2片段。逻辑正常
- 若Translation还在运行中,attack_2却先运行完,代表当前动画片attack_2运行完(代码:
- 此时整体动画全权由attack_3运转;
- 等待attack_2中动画片进行到左标记,开启Translation过渡和attack_3动画,,三者动画并行运转
- 情况二:attack_2正常运转,若在左标记后达成条件
- 无论是在标记期间或是右标记后达成条件,再也无法触发Translation转换,因为可过渡时间片已经错过了
逻辑图:
项目实例图:左标前达成(先),左标后达成(后)
总结
Translation内左右标记问题:
- 左右标记范围含义:
- Translation时长,两个动画的过渡时间长度
- 左右标记位置含义:
- 对于当前Animation:左标记表示开启Translation和下一Animation的时间点;右标记表示当前动画片所能进行到的最晚时间点
- 对于下一Animation:左标记为当前动画开启时间点,右标记为当前动画全权运转时间点
- 通俗解释:何时转换、转换多久、转换时两动画所占比例
- 区间意义:
- 例如attack_1和attack_2过渡的时间片段,过渡期的动画由Unity根据attack_1和attack_2动画混合而成,因此所谓三动画并行执行,本质为执行Translation的混合动画。其外需要注意:过渡期间仍处于attack_1,代码就是:
stateInfo.IsName("attack_1")==true
,仅当Translation结束才算处于attack_2
- 例如attack_1和attack_2过渡的时间片段,过渡期的动画由Unity根据attack_1和attack_2动画混合而成,因此所谓三动画并行执行,本质为执行Translation的混合动画。其外需要注意:过渡期间仍处于attack_1,代码就是:
Translation后于Animation错误问题:
该错误直观上看就是两动画和Translation时间先后问题,数字上看就是Translation首尾点、区间大小、条件达成时机。因此解决办法就围绕这几点,此处给出几点建议:
- Translation右标记最好 <= 前Animation末端,也就是说Translation不要超出动画长度
- 最好在左标记点前达成转换条件,以便我们对转换过程进行掌控
- AnimatorController的设置不是唯一途径,代码操控、动画内插入事件等,都可以较好辅助我们实现安全的动画切换
参考
- Unity5.X 从入门到精通 - UnityTechnologies
- Unity2D实现人物三连击 - 逐影
- Unity3d基础:Animator动画三连击 - 考班格
- Unity游戏动画 从入门到住院:动画机状态 - GameRes
Unity - HasExitTime用法的更多相关文章
- [开发ing] Unity项目 - Hero英雄
目录 游戏原型 项目演示 绘图资源 代码实现 技术探讨 参考来源 游戏原型 游戏介绍:这是一款横版类魂游戏,玩家将操控Hero,在诸神黄昏的墓地中,挑战源源不断的敌人,以及近乎无敌的强大boss 灵感 ...
- 我心中的核心组件(可插拔的AOP)~第十二回 IoC组件Unity
回到目录 说在前 Ioc组件有很多,之前也介绍过autofac,castle等,今天再来说一下在微软Nlayer DDD架构里使用的unity组件,今天主要说一下依靠注入,如果希望看拦截的用法,可以阅 ...
- mixamo fuse三维角色制作
软件下载: http://www.cgtsj.com/cg/yj/1302/index.html 资源名称: Mixamo Fuse三维角色制作软件V1.3版 本站编号: YJ1302 百度网盘:下 ...
- Unity LOD-Level of Detail(多层次细节)用法教程
Unity LOD 多层次细节 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...
- Unity射线检测的用法总结
RayCast 射线检测 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心 ...
- Unity 灯光探针用法教程
Unity 灯光探针用详解 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...
- Unity反射探针用法教程
Unity 3D反射探针 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心 ...
- Unity 项目中委托Delegate用法案例
Unity中Delegate的用法场景 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar - ...
- Unity 3D UGUI Toggle用法教程
UGUI Toggle用法教程 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...
随机推荐
- Vue学习之todolist删除功能
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- easyui-datetimebox 控件绑定双击事件实现自动选中当前日期时间
本方法是在不改变原 js 的情况下,通过扩展方法来实现本目的 首先在 datetimebox 控件中扩展一个 绑定双击事件 的方法 $.extend($.fn.datetimebox.methods, ...
- Linux6.x 更换国内比较快的yum源-通用版
----------更换国内比较快的yum源----------- ----------163--------- cd /etc/yum.repos.d mv CentOS-Base.repo Cen ...
- telnet命令问题解决-bash: telnet: command not found
root@cClient:/]#telnet cMaster 44444 bash: telnet: command not found -----------解决办法------------ 解决方 ...
- Linux环境下实现对文件读写操作
---- 今天分享一下在linux系统在实现对文件读写一些基本的操作,在这之前我们要掌握一些基本的技能在Linux环境下.比如查看命令和一个函数的具体用法,就是相当于查手册,在Linux下有一个man ...
- 手把手创建gulp
这几天安装gulp踩了不少坑,现在讲解一个入门的案例解析: ==首先大家要确保node.npm.npx.gulp安装是否成功 == 这些安装都是傻瓜式安装,大家可以找到相应的教材. 创建一个自己的文件 ...
- mysql 事物四大特性和事物的四个隔离
1.事物四大特性(ACID) 原子性(atomicity):一个事务必须视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部 ...
- python 关于excel弹窗——请注意,您的文档的部分内容可能包含了文档检查器无法删除的个人信息解决方法
参考https://www.cnblogs.com/Jacklovely/p/6582732.html 这个问题的原因是由于工作簿包含宏.ActiveX控件等内容, 而Excel被设置为在保存文件时自 ...
- js赋值,字典,数据类型和参数传递的简单熟悉
之所以这样分,原因是布尔类型和整数浮点数在内存里是直接赋值的,而数组实际上数组名指的是这个数组的地址 字符串同样是地址,字典也是. //熟悉赋值 var x=0; console.log(x); va ...
- [LeetCode] 824. Goat Latin
Description A sentence S is given, composed of words separated by spaces. Each word consists of lowe ...