状态机的状态(State)

每个Animator Controller都会自带三个状态:Any State, Entry和 Exit。
 

1、Any State状态

表示任意状态的特殊状态。
 
例如我们如果希望角色在任何状态下都有可能切换到死亡状态,那么Any State就可以帮我们做到。
 
当你发现某个状态可以从任何状态以相同的条件跳转到时,那么就可以用Any State来简化过渡关系。

2、Entry状态

表示状态机的入口状态。
 
当我们为某个GameObject添加上Animator组件时,这个组件就会开始发挥它的作用。
 
如果Animator Controller控制多个Animation的播放,那么默认情况下Animator组件会播放哪个动画呢? 由Entry来决定的。
 
但是Entry本身并不包含动画,而是指向某个带有动画的状态,并设置其为默认状态。被设置为默认状态的状态会显示为 橘黄色。
 
 
可以随时在任意一个状态上通过 鼠标右键->Set as Layer Default State更改默认状态。
 
 
Entry在Animator组件被激活后 无条件 跳转到默认状态,并且每个Layer有且仅有一个默认状态。

3、Exit状态

表示状态机的出口状态,以红色标识。如果你的动画控制器只有一层,那么这个状态可能并没有什么卵用。
 
但是当你需要从子状态机中返回到上一层(Layer)时,把状态指向Exit就可以了。
 

动画状态的属性

我们可以选中某个自定义状态,并在Inspector窗口下观察它具有的属性
 
 
 
属性名
描述
Motion
状态对应的动画。每个状态的基本属性,直接选择已定义好的动画(Animation Clip)即可
Speed
动画播放的速度。默认值为1,表示速度为原动画的1.0倍。
Mutiplier
勾选右侧的Parameter后可用,即在计算Speed的时考虑 区域1 中定义的某个参数。若选择的参数为smooth, 则动画播放速度的计算公式为 smooth * speed * fps(animation clip中指定)
Mirror
仅适用于humanoid animation(人型机动画)
Cycle Offset
周期偏移,取值范围为0-1.0,用于控制动画起始的偏移量。把它和正弦函数的offset进行对比就能够理解了,只会影响起始动画的播放位置。
Foot IK
仅适用于humanoid animation(人型机动画)
Write Default
最好保持默认,感兴趣可以参考官方手册
Transitions
该状态向其他状态发起的过渡列表,包含了Solo和Mute两个参数,在预览状态机的效果时起作用
Add Behaviour
用于向状态添加“行为”
 

状态间的过渡关系(Transitions)

直观上说它们就是连接不同状态的有向箭头
 
要创建一个从状态A到状态B的过渡,直接在状态A上 鼠标右键 - Make Transition并把出现的箭头拖拽到状态B上点击鼠标左边即可。
 

添加状态控制参数

参数有Float,Int,Bool,Trigger。
 
 
Float、Int用来控制一个动画状态的参数,比如速度方向等可以用数值量化的东西,
 
Bool用来控制动画状态的转变,比如从走路转变到跑步,
 
Trigger本质上也是bool类型,但它默认为false,且当程序设置为true后,它会自动变回false。

编辑切换状态的条件

点击连线,在Inspecter窗口中可以进行设置,在Conditions栏下可以添加条件,如下图表示当参数
 
AnimState为0时会执行这个动画Any State到New Animation2的过渡
 
 
必须在Parameters面板中添加了参数才可以在这里查看到,其次添加的条件为&&”与”关系,即必须同时满足。
 
 

代码中控制状态

我们可以通过代码来设置条件状态,达到动画切换的目的
 
Animator ator = go1.GetComponent<Animator>();
ator.SetInteger("AnimState", 0);
 
上面的代码,让AnimState这个参数值为0,满足了从Any State到New Animation2的过渡条件,从而实现New Animation2动画的过渡。

检查动画状态

1.AnimatorStateInfo

在脚本中添加代码
 
//检查是否正在播放jump动画.AnimatorStateInfo stateinfo = anim.GetCurrentAnimatorStateInfo(0);
bool playingJump = stateinfo.IsName("jump");if(playingJump){
if(stateinfo.normalizedTime < 1.0f)
{
//正在播放
}
else
{
//播放结束
}
}
 
当处于状态jump,则stateinfo.IsName("jump")返回true

控制播放速度

Animator ator = go1.GetComponent<Animator>();
var stateinfo = ator.GetCurrentAnimatorStateInfo(0);
if(stateinfo.IsName("Jump"))
{
ator.speed = 2;
}
 

注意事项

1 取消勾选 Can Transition To Self,不然动画会出现抖动

2 动作循环。不然如果没有下个状态切换,直接停止动作

3 Has Exit Time,如果勾选了,则表示在该动作完成后才允许切换,但是一般我们要的都是立即切换,所以这里 不要勾选

1、Mirror

镜像,可以反转当前动画.
 

2、Solo与Mute

Mute相当于把目标过渡禁用掉。Solo表示只生效这一条过渡
 
可以多选,当选中后会出现箭头提示
 
条件满足优先于Solo/Mute,当条件没有满足时依然不会过渡
 
Solo,勾选后,只会在所有 勾选Solo 中切换,其他默认等同 勾选Mute
 
Mute,勾选后,不会切入到该状态
 
 

Unity状态机(Animator)的更多相关文章

  1. unity 对Animator动画系统的研究

    unity的新动画系统叫Mecanim,使用Animator来取代旧系统Animation,按Unity文档的惯例:知识点主要分2部分:unity manual和unity script,读者可以边看 ...

  2. Unity重置Animator到初始状态和重复播放同一个Animation

    遇到问题 特效同事给的Animation更改了物体的很多属性,如Active,Alpha, Scale,Position等等,物体本身需要重复利用,因此使用对象池技术不直接销毁而是隐藏等需要时再显示, ...

  3. Unity中 Animator 与Animation 区别

    ①Animation和Animator 虽然都是控制动画的播放,但是它们的用法和相关语法都是大有不同的.Animation 控制一个动画的播放,而Animator是多个动画之间相互切换,并且Anima ...

  4. unity使用Animator做一个简单的动画

    1.在unity的物体上添加Animator组件 2.在Project下的Assets下添加Animator Controller 3.在Animator Controller添加动作 4.在动作之间 ...

  5. UNITY 状态机 + SVN + 码云 下篇

    上篇说到自己写的一个FSM状态机,这篇写怎么把代码和码云联系在一起! 首先,我们应该知道为什么使用码云? 码云是开源中国社区2013年推出的基于 Git 的完全免费的代码托管服务,这个服务是基于 Gi ...

  6. unity 状态机 + svn + 码云 上篇

    最近刚找到在实习,忙于公司一个c++ 项目 ,一直想写博客来着,没时间写今天熬夜打算先献上自己前几天自己封装的一个fsm状态机 话不多说,直接上正题,这篇博客主要是在学校的时候状态机一直使用的是pla ...

  7. Unity状态机的实现,以《塔防》为例

    什么是有限状态机? 通俗点讲,有限状态机是:将对象的状态(攻击.闲置.晕眩)的实现代码,提取出来,封装成状态.由状态机负责在各个状态之间调度. 对象持有状态管理类(状态机)的引用,与具体的状态解耦. ...

  8. unity状态机实现

    刚看了浅墨大神的文章让我对状态机有了进一步的理解 具体实现见装载的状态机文章 首先得有个总状态HeroineBaseState接口,其里面的方法主要是与行为相关的方法,让继承此接口的类来实现的 具体的 ...

  9. Unity游戏开发面试基础知识

    面试第一次知识总结: 一.Unity基本操作 1.unity提供哪几种光源? 点光源.平行光.聚光灯.区域光. 2.物体发生碰撞的必要条件什么? 两个物体必须有碰撞体Collider组件,一个物体上必 ...

随机推荐

  1. 新鲜出炉!面试90%会被问到的Java多线程面试题,史上最全系列!

    前言 最近很多粉丝朋友私聊我说能不能给整理出一份多线程面试题出来,说自己在最近的面试中老是被问到这一块的问题被问的很烦躁,前一段时间比较忙没时间回私信,前两天看到私信我也是赶紧花了两天给大家整理出这一 ...

  2. prometheus监控实战--基础

    1.简介 prometheus就是监控系统+TSDB(时间序列数据库),通过pull方式从exporter获取时间序列数据,存入本地TSDB,被监控端需安装exporter作为http端点暴露指标数据 ...

  3. Camtasia快捷键大全

    Camtasia是一款专业屏幕录制软件,它能在任何颜色模式下轻松地记录屏幕动作,另外它还具有即时播放和编辑压缩的功能.在生活上应用范围相当的广泛.在实际运用中如果能了解到相关的快捷键知识,相信是一定程 ...

  4. 怎么让我们的mac运行得更加流畅?让我们得工作事半功倍!

    古语云:"工欲善其事,必先利其器."因此,一个运行流畅的Mac更能使我们的工作事半功倍.但又是什么导致电脑的运行不流畅呢? 其实这大多还是缓存垃圾过多.内存不足的原因.尝试安装了许 ...

  5. php数字运算与格式化

    浮点数高精度运算 PHP 官方手册 浮点数的精度有限.尽管取决于系统,PHP 通常使用 IEEE 754 双精度格式,则由于取整而导致的最大相对误差为 1.11e-16.非基本数学运算可能会给出更大误 ...

  6. IDEA创建web工程,不用Archetype(超简单)

    Idea不用Archetype创建Web项目 以新建模块为例. 新建Maven项目 不勾选[Create from artchetype],直接Next pom中添加一句话: <artifact ...

  7. 题解 洛谷 P2612 【[ZJOI2012]波浪】DP+高精

    题目描述 题目传送门 分析 因为有绝对值不好处理,所以我们强制从小到大填数 设 \(f[i][j][p][o]\) 为当前填到了第 \(i\) 个数,波动强度为 \(j\),有 \(p\) 个连续段并 ...

  8. [BUGCASE]Phantom服务代码不健壮导致无法发送报表邮件

    一.问题描述 广告平台中的发报表邮件功能偶尔会出现发送失败的情况,重启phantom服务之后就好了 查看phantom服务的日志发现,在2017-12-12 03:29:45有访问记录,并且参数是异常 ...

  9. 《Machine Learning in Action》—— 白话贝叶斯,“恰瓜群众”应该恰好瓜还是恰坏瓜

    <Machine Learning in Action>-- 白话贝叶斯,"恰瓜群众"应该恰好瓜还是恰坏瓜 概率论,可以说是在机器学习当中扮演了一个非常重要的角色了.T ...

  10. 使用Docker部署MSSQL

    部署MSSQL需要2G内存 1.下载镜像 docker pull microsoft/mssql-server-linux 使用该命令就可以把数据库的docker镜像下载下来. 2.创建并运行容器 d ...